Class: UWaterlooAPIQuery

Inherits:
Object
  • Object
show all
Includes:
Routes
Defined in:
lib/helpers/uwaterlooapi_query.rb

Instance Method Summary collapse

Methods included from Routes

route

Constructor Details

#initialize(cur_route, cur_url, api_key) ⇒ UWaterlooAPIQuery

Returns a new instance of UWaterlooAPIQuery.



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/helpers/uwaterlooapi_query.rb', line 6

def initialize(cur_route, cur_url, api_key)
  @api_key = api_key
  @cur_url = cur_url
  @cur_route = cur_route
  @retrieved_url = ''
  @response = @meta = nil

  # Select only routes that may come next
  routes = @@routes.select { |s| s.start_with?(cur_route) }.
    map { |s| s[@cur_route.length..-1] }.
    join.split('/').uniq.delete_if(&:empty?)

  # Define methods without parameters
  routes.reject { |r| r =~ /^\{.*\}$/ }.
    map(&:to_sym).each do |route|
    
    self.class.send :define_method, route do
      if is_in_routes?("#{@cur_route}/#{route}")
        UWaterlooAPIQuery.new "#{@cur_route}/#{route}", "#{@cur_url}/#{route}", api_key
      else
        raise NoMethodError
      end
    end
  end

  # Define methods with parameters
  routes.select { |r| r =~ /^\{.*\}$/ }.
    map { |r| r.delete('{}') }.
    map(&:to_sym).each do |route|

    self.class.send :define_method, route do |value|
      raise ArgumentError if ["", 0].include? value
      if is_in_routes?("#{@cur_route}/{#{route}}")
        UWaterlooAPIQuery.new "#{@cur_route}/{#{route}}", "#{@cur_url}/#{value}", api_key
      else
        raise NoMethodError
      end
    end
  end
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, &block) ⇒ Object



71
72
73
74
75
76
77
78
79
80
# File 'lib/helpers/uwaterlooapi_query.rb', line 71

def method_missing(method, *args, &block)
  # Get data from API server
  get unless just_made_request

  if @response.data.respond_to? method
    @response.data.send method, *args, &block
  else
    super
  end
end

Instance Method Details

#getObject

Get data from server

Raises:

  • (NoMethodError)


58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/helpers/uwaterlooapi_query.rb', line 58

def get
  raise NoMethodError unless is_full_route? @cur_route
  @retrieved_url = @cur_url
  response = HTTParty.get("https://api.uwaterloo.ca/v2#{@cur_url}.json", { query: { key: @api_key, format: 'json' } })
  case response.code
  when 400...600
    raise "UWaterloo API Server returned a #{response.code} error"
  end
  @response = RecursiveOpenStruct.new response, recurse_over_arrays: true
  @meta = response['meta']
  @response.data
end

#meta(var) ⇒ Object

Get meta variables

Raises:

  • (NoMethodError)


48
49
50
51
52
53
54
55
# File 'lib/helpers/uwaterlooapi_query.rb', line 48

def meta(var)
  raise NoMethodError unless is_full_route? @cur_route
  if @meta
    @meta[var.to_s]
  else
    raise "No request has been made yet, so meta data is not available."
  end
end

#respond_to?(method, include_private = false) ⇒ Boolean

Returns:

  • (Boolean)


82
83
84
85
86
87
88
89
90
91
# File 'lib/helpers/uwaterlooapi_query.rb', line 82

def respond_to?(method, include_private = false)
  # Get data from API server
  get unless just_made_request

  if @response.data.respond_to? method
    true
  else
    super
  end
end