uwaterlooapi 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0c80d6d3357a1f8ff107de957c4658dd0f638969
4
- data.tar.gz: d10287d3b38a0149093b855bfaf57aad194615de
3
+ metadata.gz: d9917181c3320892f47aacd73bd34f21bc8a930b
4
+ data.tar.gz: a49b89eb0a8332761cb88b12aea100c7ddc7234b
5
5
  SHA512:
6
- metadata.gz: dda02ad184753bd3aec01a2e03e0816af7dd647dd127477fa3eab4c3a9a7731df4854ceaefc6c9702486aab463ab5eeabd75db4251ff46a313a9032e9e1393be
7
- data.tar.gz: c342610a4c54a140fa5321cbc503d37e3b7f28c770fe301c4c29c6a68a0819d070aba8f6ccea2896b5783a4d96c22e1acb584626eb5861a78996178be5d0f61c
6
+ metadata.gz: 860e75e41fb94f52b8fc1c08130ada510393ab3d1a5467138d58547c4110123545a9c425cb4eec28e444f3e89d5db072ba09ec31504d14d0d52d592afa8b7970
7
+ data.tar.gz: 62de1250d54d623e56b6a0108bda6d15980708869e331d187702c5f8d77471bf7efb6b72754ee9b4d58345701d96ab66d0fe902f24f6d812ab5f7b62fec76ad8
data/.gitignore CHANGED
@@ -1,18 +1,14 @@
1
- *.gem
2
- *.rbc
3
- .bundle
4
- .config
5
- .yardoc
6
- Gemfile.lock
7
- InstalledFiles
8
- _yardoc
9
- coverage
10
- doc/
11
- lib/bundler/man
12
- pkg
13
- rdoc
14
- spec/reports
15
- test/tmp
16
- test/version_tmp
17
- tmp
18
- test.rb
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/.travis.yml CHANGED
@@ -1,8 +1,7 @@
1
1
  language: ruby
2
+
2
3
  rvm:
3
- - 2.0.0
4
+ - 2.1.5
4
5
  - 2.1.0
5
- addons:
6
- code_climate:
7
- repo_token:
8
- secure: "XlPjPyevyIybmYS5dM85AuRq5PdF86frD20+yOUXqUzBjZIpeQZ7jFyZQRGG38gAK35eG4x6dbyY+nsI74H3XH4c/R/u73D22Jtb8wOxmwRCoKR1l5Kpd57bT1WcbER4l/x2XRoglceMeGalhYoIEh+9wy5F9c0f6wh4A6rVPN0="
6
+ - 2.0.0
7
+ - 1.9.3
data/Gemfile CHANGED
@@ -1,8 +1,8 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
+ gemspec
4
+
3
5
  group :test do
4
6
  gem 'rake'
5
7
  gem 'codeclimate-test-reporter'
6
8
  end
7
-
8
- gemspec
data/README.md CHANGED
@@ -1,21 +1,23 @@
1
1
  uwaterlooapi
2
2
  ============
3
3
 
4
- RubyGem wrapper for the University of Waterloo OpenData API
5
-
6
4
  [![Build Status](https://travis-ci.org/amsardesai/uwaterlooapi.svg)](https://travis-ci.org/amsardesai/uwaterlooapi)
7
5
  [![Code Climate](https://codeclimate.com/github/amsardesai/uwaterlooapi/badges/gpa.svg)](https://codeclimate.com/github/amsardesai/uwaterlooapi)
8
6
  [![Test Coverage](https://codeclimate.com/github/amsardesai/uwaterlooapi/badges/coverage.svg)](https://codeclimate.com/github/amsardesai/uwaterlooapi)
9
7
 
8
+ RubyGem wrapper for the University of Waterloo OpenData API
9
+
10
10
  ## Installation
11
11
 
12
- Add the following to your application's Gemfile:
12
+ Add this line to your application's Gemfile:
13
13
 
14
- gem 'uwaterlooapi'
14
+ ```ruby
15
+ gem 'middleman-protect-emails'
16
+ ```
15
17
 
16
- Or install it in your system:
18
+ And then run:
17
19
 
18
- $ gem install uwaterlooapi
20
+ $ bundle
19
21
 
20
22
  ## Usage
21
23
 
@@ -60,8 +62,8 @@ For details regarding all API endpoints, go here: https://github.com/uWaterloo/a
60
62
 
61
63
  ## Contributing
62
64
 
63
- If you find bugs or simply want to contribute to this project:
64
-
65
- 1. Fork this project
66
- 2. Make your changes and push it to your fork
67
- 3. Create a pull request in this repository
65
+ 1. Fork it
66
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
67
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
68
+ 4. Push to the branch (`git push origin my-new-feature`)
69
+ 5. Create a [new pull request](../../pull/new/master)
data/Rakefile CHANGED
@@ -1,7 +1,8 @@
1
+ require 'bundler/gem_tasks'
1
2
  require 'rspec/core/rake_task'
2
3
 
3
4
  RSpec::Core::RakeTask.new(:spec) do |spec|
4
5
  spec.pattern = FileList['spec/**/*_spec.rb']
5
6
  end
6
7
 
7
- task :default => :spec
8
+ task default: :spec
data/lib/uwaterlooapi.rb CHANGED
@@ -1,15 +1,15 @@
1
1
  require 'httparty'
2
- require 'helpers/routes'
3
- require 'helpers/uwaterlooapi_query'
2
+ require 'uwaterlooapi/version'
3
+ require 'uwaterlooapi/routes'
4
+ require 'uwaterlooapi/query'
4
5
 
5
6
  class UWaterlooAPI
6
- VERSION = '0.0.1'
7
- include Routes
7
+ include UWaterlooAPI::Routes
8
8
 
9
9
  def initialize(api_key)
10
10
  get_base_routes.each do |route|
11
11
  self.class.send :define_method, route do
12
- UWaterlooAPIQuery.new "/#{route}", "/#{route}", api_key
12
+ UWaterlooAPI::Query.new "/#{route}", "/#{route}", api_key
13
13
  end
14
14
  end
15
15
  end
@@ -0,0 +1,107 @@
1
+ require 'recursive-open-struct'
2
+
3
+ class UWaterlooAPI
4
+ class Query
5
+ include UWaterlooAPI::Routes
6
+
7
+ def initialize(cur_route, cur_url, api_key)
8
+ @api_key = api_key
9
+ @cur_url = cur_url
10
+ @cur_route = cur_route
11
+ @retrieved_url = ''
12
+ @response = @meta = nil
13
+
14
+ # Define methods without parameters
15
+ get_next_routes_without_params.each do |route|
16
+ self.class.send :define_method, route do
17
+ raise NoMethodError unless is_in_routes?("#{@cur_route}/#{route}")
18
+ UWaterlooAPI::Query.new "#{@cur_route}/#{route}", "#{@cur_url}/#{route}", @api_key
19
+ end
20
+ end
21
+
22
+ # Define methods with parameters
23
+ get_next_routes_with_params.each do |route|
24
+ self.class.send :define_method, route do |value|
25
+ raise ArgumentError if ["", 0].include? value
26
+ raise NoMethodError unless is_in_routes?("#{@cur_route}/{#{route}}")
27
+ UWaterlooAPI::Query.new "#{@cur_route}/{#{route}}", "#{@cur_url}/#{value}", @api_key
28
+ end
29
+ end
30
+ end
31
+
32
+ # Get meta variables
33
+ def meta(var)
34
+ raise NoMethodError unless is_full_route? @cur_route
35
+ raise "No request has been made yet, so meta data is not available." unless @meta
36
+ @meta[var.to_s]
37
+ end
38
+
39
+ # Get data from server
40
+ def get
41
+ raise NoMethodError unless is_full_route? @cur_route
42
+ @retrieved_url = @cur_url
43
+ response = HTTParty.get("https://api.uwaterloo.ca/v2#{@cur_url}.json", { query: { key: @api_key, format: 'json' } })
44
+ case response.code
45
+ when 400...600
46
+ raise "UWaterloo API Server returned a #{response.code} error"
47
+ end
48
+ @response = RecursiveOpenStruct.new response, recurse_over_arrays: true
49
+ @meta = response['meta']
50
+ @response.data
51
+ end
52
+
53
+ def method_missing(method, *args, &block)
54
+ # Get data from API server
55
+ get unless just_made_request
56
+
57
+ if @response.data.respond_to? method
58
+ @response.data.send method, *args, &block
59
+ else
60
+ super
61
+ end
62
+ end
63
+
64
+ def respond_to?(method, include_private = false)
65
+ # Get data from API server
66
+ get unless just_made_request
67
+
68
+ if @response.data.respond_to? method
69
+ true
70
+ else
71
+ super
72
+ end
73
+ end
74
+
75
+ private
76
+
77
+ def just_made_request
78
+ @retrieved_url == @cur_url
79
+ end
80
+
81
+ def get_next_routes
82
+ @next_routes ||= @@routes.
83
+ select { |s| s.start_with?(@cur_route) }.
84
+ map { |s| s[@cur_route.length..-1] }.
85
+ join.split('/').uniq.delete_if(&:empty?)
86
+ end
87
+
88
+ def get_next_routes_without_params
89
+ @next_routes_without_params ||= get_next_routes.
90
+ reject { |r| r =~ /^\{.*\}$/ }.map(&:to_sym)
91
+ end
92
+
93
+ def get_next_routes_with_params
94
+ @next_routes_with_params ||= get_next_routes.
95
+ select { |r| r =~ /^\{.*\}$/ }.
96
+ map { |r| r.delete('{}') }.map(&:to_sym)
97
+ end
98
+
99
+ def is_in_routes?(substring)
100
+ @@routes.any? { |s| s.start_with?(substring) }
101
+ end
102
+
103
+ def is_full_route?(substring)
104
+ @@routes.include? substring
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,65 @@
1
+ class UWaterlooAPI
2
+ module Routes
3
+
4
+ # Route Methods
5
+
6
+ def self.route(route)
7
+ @@routes ||= []
8
+ @@routes.push route
9
+ end
10
+
11
+ # Routes
12
+
13
+ route '/foodservices/menu'
14
+ route '/foodservices/notes'
15
+ route '/foodservices/diets'
16
+ route '/foodservices/outlets'
17
+ route '/foodservices/locations'
18
+ route '/foodservices/watcard'
19
+ route '/foodservices/announcements'
20
+ route '/foodservices/products/{product_id}'
21
+ route '/foodservices/{year}/{week}/menu'
22
+ route '/foodservices/{year}/{week}/notes'
23
+ route '/foodservices/{year}/{week}/announcements'
24
+ route '/courses/{subject}'
25
+ route '/courses/{course_id}'
26
+ route '/courses/{class_number}/schedule'
27
+ route '/courses/{subject}/{catalog_number}'
28
+ route '/courses/{subject}/{catalog_number}/schedule'
29
+ route '/courses/{subject}/{catalog_number}/prerequisites'
30
+ route '/courses/{subject}/{catalog_number}/examschedule'
31
+ route '/events'
32
+ route '/events/{site}'
33
+ route '/events/{site}/{id}'
34
+ route '/events/holidays'
35
+ route '/news'
36
+ route '/news/{site}'
37
+ route '/news/{site}/{id}'
38
+ route '/weather/current'
39
+ route '/terms/list'
40
+ route '/terms/{term}/examschedule'
41
+ route '/terms/{term}/{subject}/schedule'
42
+ route '/terms/{term}/{subject}/{catalog_number}/schedule'
43
+ route '/terms/{term}/infosessions'
44
+ route '/resources/tutors'
45
+ route '/resources/printers'
46
+ route '/resources/infosessions'
47
+ route '/resources/goosewatch'
48
+ route '/codes/units'
49
+ route '/codes/terms'
50
+ route '/codes/groups'
51
+ route '/codes/subjects'
52
+ route '/codes/instructions'
53
+ route '/buildings/list'
54
+ route '/buildings/{building_code}'
55
+ route '/buildings/{building}/{room}/courses'
56
+ route '/api/usage'
57
+ route '/api/services'
58
+ route '/api/methods'
59
+ route '/api/versions'
60
+ route '/api/changelog'
61
+ route '/server/time'
62
+ route '/server/codes'
63
+
64
+ end
65
+ end
@@ -0,0 +1,3 @@
1
+ class UWaterlooAPI
2
+ VERSION = '0.0.4'
3
+ end
@@ -13,48 +13,48 @@ describe UWaterlooAPI do
13
13
  expect{ UWaterlooAPI.new }.to raise_exception ArgumentError
14
14
  end
15
15
 
16
- it 'returns a UWaterlooAPIQuery object for foodservices' do
17
- expect(@api.foodservices).to be_an_instance_of UWaterlooAPIQuery
16
+ it 'returns a UWaterlooAPI::Query object for foodservices' do
17
+ expect(@api.foodservices).to be_an_instance_of UWaterlooAPI::Query
18
18
  end
19
19
 
20
- it 'returns a UWaterlooAPIQuery object for courses' do
21
- expect(@api.courses).to be_an_instance_of UWaterlooAPIQuery
20
+ it 'returns a UWaterlooAPI::Query object for courses' do
21
+ expect(@api.courses).to be_an_instance_of UWaterlooAPI::Query
22
22
  end
23
23
 
24
- it 'returns a UWaterlooAPIQuery object for events' do
25
- expect(@api.events).to be_an_instance_of UWaterlooAPIQuery
24
+ it 'returns a UWaterlooAPI::Query object for events' do
25
+ expect(@api.events).to be_an_instance_of UWaterlooAPI::Query
26
26
  end
27
27
 
28
- it 'returns a UWaterlooAPIQuery object for news' do
29
- expect(@api.news).to be_an_instance_of UWaterlooAPIQuery
28
+ it 'returns a UWaterlooAPI::Query object for news' do
29
+ expect(@api.news).to be_an_instance_of UWaterlooAPI::Query
30
30
  end
31
31
 
32
- it 'returns a UWaterlooAPIQuery object for weather' do
33
- expect(@api.weather).to be_an_instance_of UWaterlooAPIQuery
32
+ it 'returns a UWaterlooAPI::Query object for weather' do
33
+ expect(@api.weather).to be_an_instance_of UWaterlooAPI::Query
34
34
  end
35
35
 
36
- it 'returns a UWaterlooAPIQuery object for terms' do
37
- expect(@api.terms).to be_an_instance_of UWaterlooAPIQuery
36
+ it 'returns a UWaterlooAPI::Query object for terms' do
37
+ expect(@api.terms).to be_an_instance_of UWaterlooAPI::Query
38
38
  end
39
39
 
40
- it 'returns a UWaterlooAPIQuery object for resources' do
41
- expect(@api.resources).to be_an_instance_of UWaterlooAPIQuery
40
+ it 'returns a UWaterlooAPI::Query object for resources' do
41
+ expect(@api.resources).to be_an_instance_of UWaterlooAPI::Query
42
42
  end
43
43
 
44
- it 'returns a UWaterlooAPIQuery object for codes' do
45
- expect(@api.codes).to be_an_instance_of UWaterlooAPIQuery
44
+ it 'returns a UWaterlooAPI::Query object for codes' do
45
+ expect(@api.codes).to be_an_instance_of UWaterlooAPI::Query
46
46
  end
47
47
 
48
- it 'returns a UWaterlooAPIQuery object for buildings' do
49
- expect(@api.buildings).to be_an_instance_of UWaterlooAPIQuery
48
+ it 'returns a UWaterlooAPI::Query object for buildings' do
49
+ expect(@api.buildings).to be_an_instance_of UWaterlooAPI::Query
50
50
  end
51
51
 
52
- it 'returns a UWaterlooAPIQuery object for api' do
53
- expect(@api.api).to be_an_instance_of UWaterlooAPIQuery
52
+ it 'returns a UWaterlooAPI::Query object for api' do
53
+ expect(@api.api).to be_an_instance_of UWaterlooAPI::Query
54
54
  end
55
55
 
56
- it 'returns a UWaterlooAPIQuery object for server' do
57
- expect(@api.server).to be_an_instance_of UWaterlooAPIQuery
56
+ it 'returns a UWaterlooAPI::Query object for server' do
57
+ expect(@api.server).to be_an_instance_of UWaterlooAPI::Query
58
58
  end
59
59
 
60
60
  context 'queries' do
@@ -75,10 +75,10 @@ describe UWaterlooAPI do
75
75
  end
76
76
 
77
77
  it 'incrementally builds a query' do
78
- expect(@api.terms.term(1139)).to be_an_instance_of UWaterlooAPIQuery
79
- expect(@api.terms.term(1139).subject('CS')).to be_an_instance_of UWaterlooAPIQuery
80
- expect(@api.terms.term(1139).subject('CS').catalog_number(115)).to be_an_instance_of UWaterlooAPIQuery
81
- expect(@api.terms.term(1139).subject('CS').catalog_number(115).schedule).to be_an_instance_of UWaterlooAPIQuery
78
+ expect(@api.terms.term(1139)).to be_an_instance_of UWaterlooAPI::Query
79
+ expect(@api.terms.term(1139).subject('CS')).to be_an_instance_of UWaterlooAPI::Query
80
+ expect(@api.terms.term(1139).subject('CS').catalog_number(115)).to be_an_instance_of UWaterlooAPI::Query
81
+ expect(@api.terms.term(1139).subject('CS').catalog_number(115).schedule).to be_an_instance_of UWaterlooAPI::Query
82
82
  end
83
83
 
84
84
  it 'makes one request over an iteration' do
@@ -112,7 +112,7 @@ describe UWaterlooAPI do
112
112
  it 'has a working method_missing method' do
113
113
  expect{ @time.hellobrah }.to raise_exception NoMethodError
114
114
  expect(@time.timezone).to eq 'EDT'
115
- expect(a_request(:get, 'https://api.uwaterloo.ca/v2/server/time.json?format=json&key=testkey')).to have_been_made.once
115
+ expect(a_request(:get, 'https://api.uwaterloo.ca/v2/server/time.json?format=json&key=testkey')).to have_been_made.once
116
116
  end
117
117
 
118
118
  it 'allows retrieval of metadata' do
data/uwaterlooapi.gemspec CHANGED
@@ -1,19 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'uwaterlooapi/version'
1
5
 
2
6
  Gem::Specification.new do |spec|
3
- spec.name = 'uwaterlooapi'
4
- spec.version = '0.0.3'
5
- spec.date = '2014-10-26'
6
- spec.summary = "Ruby Gem wrapper for the University of Waterloo Open Data API"
7
- spec.description = "Ruby Gem wrapper for the University of Waterloo Open Data API"
8
- spec.authors = ["Ankit Sardesai"]
9
- spec.email = 'me@ankitsardesai.ca'
10
- spec.files = `git ls-files`.split("\n")
11
- spec.test_files = `git ls-files spec`.split("\n")
12
- spec.homepage = 'https://rubygems.org/gems/uwaterlooapi'
13
- spec.license = 'MIT'
7
+ spec.name = 'uwaterlooapi'
8
+ spec.version = UWaterlooAPI::VERSION
9
+ spec.authors = ['Ankit Sardesai']
10
+ spec.email = ['amsardesai@gmail.com']
11
+ spec.summary = %q{Ruby Gem wrapper for the University of Waterloo Open Data API}
12
+ spec.description = %q{Ruby Gem wrapper for the University of Waterloo Open Data API.}
13
+ spec.homepage = ''
14
+ spec.license = 'MIT'
15
+ spec.files = `git ls-files -z`.split("\x0")
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
14
18
  spec.require_paths = ['lib']
15
- spec.add_runtime_dependency 'httparty'
16
- spec.add_runtime_dependency 'recursive-open-struct'
19
+ spec.required_ruby_version = '~> 1.9.3'
20
+
21
+ spec.add_dependency 'httparty'
22
+ spec.add_dependency 'recursive-open-struct'
23
+
17
24
  spec.add_development_dependency 'rspec'
18
25
  spec.add_development_dependency 'webmock'
19
26
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uwaterlooapi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ankit Sardesai
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-26 00:00:00.000000000 Z
11
+ date: 2014-12-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -66,8 +66,9 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
- description: Ruby Gem wrapper for the University of Waterloo Open Data API
70
- email: me@ankitsardesai.ca
69
+ description: Ruby Gem wrapper for the University of Waterloo Open Data API.
70
+ email:
71
+ - amsardesai@gmail.com
71
72
  executables: []
72
73
  extensions: []
73
74
  extra_rdoc_files: []
@@ -78,15 +79,16 @@ files:
78
79
  - Gemfile
79
80
  - README.md
80
81
  - Rakefile
81
- - lib/helpers/routes.rb
82
- - lib/helpers/uwaterlooapi_query.rb
83
82
  - lib/uwaterlooapi.rb
83
+ - lib/uwaterlooapi/query.rb
84
+ - lib/uwaterlooapi/routes.rb
85
+ - lib/uwaterlooapi/version.rb
84
86
  - spec/responses/courses.json
85
87
  - spec/responses/timestamp.json
86
88
  - spec/spec_helper.rb
87
89
  - spec/uwaterlooapi_spec.rb
88
90
  - uwaterlooapi.gemspec
89
- homepage: https://rubygems.org/gems/uwaterlooapi
91
+ homepage: ''
90
92
  licenses:
91
93
  - MIT
92
94
  metadata: {}
@@ -96,9 +98,9 @@ require_paths:
96
98
  - lib
97
99
  required_ruby_version: !ruby/object:Gem::Requirement
98
100
  requirements:
99
- - - ">="
101
+ - - "~>"
100
102
  - !ruby/object:Gem::Version
101
- version: '0'
103
+ version: 1.9.3
102
104
  required_rubygems_version: !ruby/object:Gem::Requirement
103
105
  requirements:
104
106
  - - ">="
@@ -106,7 +108,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
106
108
  version: '0'
107
109
  requirements: []
108
110
  rubyforge_project:
109
- rubygems_version: 2.4.4
111
+ rubygems_version: 2.4.5
110
112
  signing_key:
111
113
  specification_version: 4
112
114
  summary: Ruby Gem wrapper for the University of Waterloo Open Data API
@@ -1,62 +0,0 @@
1
- module Routes
2
-
3
- # Route Methods
4
-
5
- def self.route(route)
6
- @@routes ||= []
7
- @@routes.push route
8
- end
9
-
10
- # Routes
11
-
12
- route '/foodservices/menu'
13
- route '/foodservices/notes'
14
- route '/foodservices/diets'
15
- route '/foodservices/outlets'
16
- route '/foodservices/locations'
17
- route '/foodservices/watcard'
18
- route '/foodservices/announcements'
19
- route '/foodservices/products/{product_id}'
20
- route '/foodservices/{year}/{week}/menu'
21
- route '/foodservices/{year}/{week}/notes'
22
- route '/foodservices/{year}/{week}/announcements'
23
- route '/courses/{subject}'
24
- route '/courses/{course_id}'
25
- route '/courses/{class_number}/schedule'
26
- route '/courses/{subject}/{catalog_number}'
27
- route '/courses/{subject}/{catalog_number}/schedule'
28
- route '/courses/{subject}/{catalog_number}/prerequisites'
29
- route '/courses/{subject}/{catalog_number}/examschedule'
30
- route '/events'
31
- route '/events/{site}'
32
- route '/events/{site}/{id}'
33
- route '/events/holidays'
34
- route '/news'
35
- route '/news/{site}'
36
- route '/news/{site}/{id}'
37
- route '/weather/current'
38
- route '/terms/list'
39
- route '/terms/{term}/examschedule'
40
- route '/terms/{term}/{subject}/schedule'
41
- route '/terms/{term}/{subject}/{catalog_number}/schedule'
42
- route '/terms/{term}/infosessions'
43
- route '/resources/tutors'
44
- route '/resources/printers'
45
- route '/resources/infosessions'
46
- route '/resources/goosewatch'
47
- route '/codes/units'
48
- route '/codes/terms'
49
- route '/codes/groups'
50
- route '/codes/subjects'
51
- route '/codes/instructions'
52
- route '/buildings/list'
53
- route '/buildings/{building_code}'
54
- route '/buildings/{building}/{room}/courses'
55
- route '/api/usage'
56
- route '/api/services'
57
- route '/api/methods'
58
- route '/api/versions'
59
- route '/api/changelog'
60
- route '/server/time'
61
- route '/server/codes'
62
- end
@@ -1,106 +0,0 @@
1
- require 'recursive-open-struct'
2
-
3
- class UWaterlooAPIQuery
4
- include Routes
5
-
6
- def initialize(cur_route, cur_url, api_key)
7
- @api_key = api_key
8
- @cur_url = cur_url
9
- @cur_route = cur_route
10
- @retrieved_url = ''
11
- @response = @meta = nil
12
-
13
- # Define methods without parameters
14
- get_next_routes_without_params.each do |route|
15
- self.class.send :define_method, route do
16
- raise NoMethodError unless is_in_routes?("#{@cur_route}/#{route}")
17
- UWaterlooAPIQuery.new "#{@cur_route}/#{route}", "#{@cur_url}/#{route}", @api_key
18
- end
19
- end
20
-
21
- # Define methods with parameters
22
- get_next_routes_with_params.each do |route|
23
- self.class.send :define_method, route do |value|
24
- raise ArgumentError if ["", 0].include? value
25
- raise NoMethodError unless is_in_routes?("#{@cur_route}/{#{route}}")
26
- UWaterlooAPIQuery.new "#{@cur_route}/{#{route}}", "#{@cur_url}/#{value}", @api_key
27
- end
28
- end
29
- end
30
-
31
- # Get meta variables
32
- def meta(var)
33
- raise NoMethodError unless is_full_route? @cur_route
34
- raise "No request has been made yet, so meta data is not available." unless @meta
35
- @meta[var.to_s]
36
- end
37
-
38
- # Get data from server
39
- def get
40
- raise NoMethodError unless is_full_route? @cur_route
41
- @retrieved_url = @cur_url
42
- response = HTTParty.get("https://api.uwaterloo.ca/v2#{@cur_url}.json", { query: { key: @api_key, format: 'json' } })
43
- case response.code
44
- when 400...600
45
- raise "UWaterloo API Server returned a #{response.code} error"
46
- end
47
- @response = RecursiveOpenStruct.new response, recurse_over_arrays: true
48
- @meta = response['meta']
49
- @response.data
50
- end
51
-
52
- def method_missing(method, *args, &block)
53
- # Get data from API server
54
- get unless just_made_request
55
-
56
- if @response.data.respond_to? method
57
- @response.data.send method, *args, &block
58
- else
59
- super
60
- end
61
- end
62
-
63
- def respond_to?(method, include_private = false)
64
- # Get data from API server
65
- get unless just_made_request
66
-
67
- if @response.data.respond_to? method
68
- true
69
- else
70
- super
71
- end
72
- end
73
-
74
- private
75
-
76
- def just_made_request
77
- @retrieved_url == @cur_url
78
- end
79
-
80
- def get_next_routes
81
- @next_routes ||= @@routes.
82
- select { |s| s.start_with?(@cur_route) }.
83
- map { |s| s[@cur_route.length..-1] }.
84
- join.split('/').uniq.delete_if(&:empty?)
85
- end
86
-
87
- def get_next_routes_without_params
88
- @next_routes_without_params ||= get_next_routes.
89
- reject { |r| r =~ /^\{.*\}$/ }.map(&:to_sym)
90
- end
91
-
92
- def get_next_routes_with_params
93
- @next_routes_with_params ||= get_next_routes.
94
- select { |r| r =~ /^\{.*\}$/ }.
95
- map { |r| r.delete('{}') }.map(&:to_sym)
96
- end
97
-
98
- def is_in_routes?(substring)
99
- @@routes.any? { |s| s.start_with?(substring) }
100
- end
101
-
102
- def is_full_route?(substring)
103
- @@routes.include? substring
104
- end
105
-
106
- end