uwaterlooapi 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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