Skip to content
Drew Prentice edited this page Jul 30, 2014 · 4 revisions

Adding new APIs

Adding new APIs to Lyracyst is pretty straightforward. Consult gli's wiki to add commands, subcommands, and options to the cli folder.

Here's the Urban Dictionary command block as a simple example:

desc 'Fetches definitions from Urban Dictionary'
arg_name 'word'
command :urb do |c|
  c.action do |global_options, options, args|
    search = args[0]
    ur = Lyracyst::Urban::Define.new
    ur.get_def(search)
  end
end

This gli command takes no flags or switches, it just passes the first argument to the Define class.

In the lyracyst folder create newcommand.rb (and if necessary, a newcommand subfolder and separate newsubcommand.rb files for each subcommand. Once again, here's the Urban class:

require 'httpi'
require 'multi_json'
module Lyracyst
  # Urban Dictionary is a crowd-sourced dictionary that focuses on slang and colloquialisms.
  class Urban
    # Fetches URL.
    #
    # @param search [String] The word or phrase to search for.
    # @param result [String] The search response.
    def get_word(search, result)
      prefix = 'http://api.urbandictionary.com/v0/define?term='
      url = "#{prefix}#{search}"
      request = HTTPI::Request.new(url)
      getter = HTTPI.get(request)
      result = getter.body
    end
    # Fetches definitions and examples from Urbandictionary.com.
    class Define
      # @param search [String] The word or phrase to search for.
      def get_def(search)
        label, result = 'Urban Dictionary', nil
        ur = Lyracyst::Urban.new
        result = ur.get_word(search, result)
        result = MultiJson.load(result)
        tags = result['tags']
        rtype = result['result_type']
        list = result['list']
        Lyracyst.label(label)
        print Rainbow("|Tags|#{tags}|Type|#{rtype}").bright
        st = { 'searchterm' => search }
        Lyracyst.tofile(st)
        type = { 'type' => 'urban' }
        tags = { 'tags' => tags }
        rtype = { 'result type' => rtype }
        Lyracyst.tofile(type)
        Lyracyst.tofile(tags)
        Lyracyst.tofile(rtype)
        e = Lyracyst::Urban::Define.new
        e.urban_extra(list)
      end
      # Extra reptetive tasks
      #
      # @param list [Array] List of hashes to process
      def urban_extra(list)
        x, y = 0, list.length - 1
        while x <= y
          obj = list[x]
          author = obj['author']
          link = obj['permalink']
          defi = obj['definition']
          ex = obj['example']
          puts "|#{defi}|#{ex}|#{author}|#{link}"
          author = { 'author' => author }
          link = { 'link' => link }
          defi = { 'definition' => defi }
          ex = { 'example' => ex }
          Lyracyst.tofile(defi)
          Lyracyst.tofile(ex)
          Lyracyst.tofile(author)
          Lyracyst.tofile(link)
          x += 1
        end
      end
    end
  end
end

The Lyracyst::Urban.get_word method handles fetching the URL and returns the JSON result. The Lyracyst::Urban::Define.get_def method runs the command logic. The Lyracyst.label method prints an ANSI-colored label for each element, and the Lyracyst.tofile method adds an element to the hash that is encoded as a JSON or XML outfile. Keeping each command set structured in this way allows you to easily consume just about any JSON or XML API.