Search code examples
rubyfunctioncall

How do I call a function in Ruby?


I'm trying to call but I keep getting an error. This is my code:

require 'rubygems'
require 'net/http'
require 'uri'
require 'json'

class AlchemyAPI

  #Setup the endpoints
  @@ENDPOINTS = {}
  @@ENDPOINTS['taxonomy'] = {}
  @@ENDPOINTS['taxonomy']['url']  = '/url/URLGetRankedTaxonomy'
  @@ENDPOINTS['taxonomy']['text'] = '/text/TextGetRankedTaxonomy'
  @@ENDPOINTS['taxonomy']['html'] = '/html/HTMLGetRankedTaxonomy'

  @@BASE_URL = 'http://access.alchemyapi.com/calls'

  def initialize()

    begin
        key = File.read('C:\Users\KVadher\Desktop\api_key.txt')
        key.strip!

        if key.empty?
            #The key file should't be blank
            puts 'The api_key.txt file appears to be blank, please copy/paste your API key in the file: api_key.txt'
            puts 'If you do not have an API Key from AlchemyAPI please register for one at: http://www.alchemyapi.com/api/register.html'            
            Process.exit(1)
        end

        if key.length != 40
            #Keys should be exactly 40 characters long
            puts 'It appears that the key in api_key.txt is invalid. Please make sure the file only includes the API key, and it is the correct one.'
            Process.exit(1)
        end

        @apiKey = key
    rescue => err
        #The file doesn't exist, so show the message and create the file.
        puts 'API Key not found! Please copy/paste your API key into the file: api_key.txt'
        puts 'If you do not have an API Key from AlchemyAPI please register for one at: http://www.alchemyapi.com/api/register.html'

        #create a blank file to hold the key
        File.open("api_key.txt", "w") {}
        Process.exit(1)
    end
  end

  # Categorizes the text for a URL, text or HTML.
  # For an overview, please refer to: http://www.alchemyapi.com/products/features/text-categorization/
  # For the docs, please refer to: http://www.alchemyapi.com/api/taxonomy/
  # 
  # INPUT:
  # flavor -> which version of the call, i.e.  url, text or html.
  # data -> the data to analyze, either the the url, text or html code.
  # options -> various parameters that can be used to adjust how the API works, see below for more info on the available options.
  #
  # Available Options:
  # showSourceText -> 0: disabled (default), 1: enabled.
  #
  # OUTPUT:
  # The response, already converted from JSON to a Ruby object. 
  #
  def taxonomy(flavor, data, options = {})


    unless @@ENDPOINTS['taxonomy'].key?(flavor)
        return { 'status'=>'ERROR', 'statusInfo'=>'Taxonomy info for ' + flavor + ' not available' }

    end

    #Add the URL encoded data to the options and analyze
    options[flavor] = data
    return analyze(@@ENDPOINTS['taxonomy'][flavor], options)
    print

  end

  **taxonomy(text,"trees",1)**

end

In ** ** I have entered my call. Am I doing something incorrect. The error I receive is:

C:/Users/KVadher/Desktop/testrub:139:in `<class:AlchemyAPI>': undefined local variable or method `text' for AlchemyAPI:Class (NameError)
    from C:/Users/KVadher/Desktop/testrub:6:in `<main>'

I feel as though I'm calling as normal and that there is something wrong with the api code itself? Although I may be wrong.


Solution

  • Yes, as jon snow says, the function (method) call must be outside of the class. The methods are defined along with the class.

    Also, Options should be a Hash, not a number, as you call options[flavor] = data, which is going to cause you another problem.

    I believe maybe you meant to put text in quotes, as that is one of your flavors.

    Furthermore, because you declared a class, this is called an instance method, and you must make an instance of the class to use this:

    my_instance = AlchemyAPI.new
    my_taxonomy = my_instance.taxonomy("text", "trees")
    

    That's enough to get it to work, it seems like you have a ways to go to get this all working though. Good luck!