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 +4 -4
- data/.gitignore +14 -18
- data/.travis.yml +4 -5
- data/Gemfile +2 -2
- data/README.md +13 -11
- data/Rakefile +2 -1
- data/lib/uwaterlooapi.rb +5 -5
- data/lib/uwaterlooapi/query.rb +107 -0
- data/lib/uwaterlooapi/routes.rb +65 -0
- data/lib/uwaterlooapi/version.rb +3 -0
- data/spec/uwaterlooapi_spec.rb +27 -27
- data/uwaterlooapi.gemspec +20 -13
- metadata +12 -10
- data/lib/helpers/routes.rb +0 -62
- data/lib/helpers/uwaterlooapi_query.rb +0 -106
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d9917181c3320892f47aacd73bd34f21bc8a930b
|
4
|
+
data.tar.gz: a49b89eb0a8332761cb88b12aea100c7ddc7234b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 860e75e41fb94f52b8fc1c08130ada510393ab3d1a5467138d58547c4110123545a9c425cb4eec28e444f3e89d5db072ba09ec31504d14d0d52d592afa8b7970
|
7
|
+
data.tar.gz: 62de1250d54d623e56b6a0108bda6d15980708869e331d187702c5f8d77471bf7efb6b72754ee9b4d58345701d96ab66d0fe902f24f6d812ab5f7b62fec76ad8
|
data/.gitignore
CHANGED
@@ -1,18 +1,14 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
.
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
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.
|
4
|
+
- 2.1.5
|
4
5
|
- 2.1.0
|
5
|
-
|
6
|
-
|
7
|
-
repo_token:
|
8
|
-
secure: "XlPjPyevyIybmYS5dM85AuRq5PdF86frD20+yOUXqUzBjZIpeQZ7jFyZQRGG38gAK35eG4x6dbyY+nsI74H3XH4c/R/u73D22Jtb8wOxmwRCoKR1l5Kpd57bT1WcbER4l/x2XRoglceMeGalhYoIEh+9wy5F9c0f6wh4A6rVPN0="
|
6
|
+
- 2.0.0
|
7
|
+
- 1.9.3
|
data/Gemfile
CHANGED
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
|
[](https://travis-ci.org/amsardesai/uwaterlooapi)
|
7
5
|
[](https://codeclimate.com/github/amsardesai/uwaterlooapi)
|
8
6
|
[](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
|
12
|
+
Add this line to your application's Gemfile:
|
13
13
|
|
14
|
-
|
14
|
+
```ruby
|
15
|
+
gem 'middleman-protect-emails'
|
16
|
+
```
|
15
17
|
|
16
|
-
|
18
|
+
And then run:
|
17
19
|
|
18
|
-
$
|
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
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
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
data/lib/uwaterlooapi.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
require 'httparty'
|
2
|
-
require '
|
3
|
-
require '
|
2
|
+
require 'uwaterlooapi/version'
|
3
|
+
require 'uwaterlooapi/routes'
|
4
|
+
require 'uwaterlooapi/query'
|
4
5
|
|
5
6
|
class UWaterlooAPI
|
6
|
-
|
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
|
-
|
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
|
data/spec/uwaterlooapi_spec.rb
CHANGED
@@ -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
|
17
|
-
expect(@api.foodservices).to be_an_instance_of
|
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
|
21
|
-
expect(@api.courses).to be_an_instance_of
|
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
|
25
|
-
expect(@api.events).to be_an_instance_of
|
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
|
29
|
-
expect(@api.news).to be_an_instance_of
|
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
|
33
|
-
expect(@api.weather).to be_an_instance_of
|
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
|
37
|
-
expect(@api.terms).to be_an_instance_of
|
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
|
41
|
-
expect(@api.resources).to be_an_instance_of
|
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
|
45
|
-
expect(@api.codes).to be_an_instance_of
|
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
|
49
|
-
expect(@api.buildings).to be_an_instance_of
|
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
|
53
|
-
expect(@api.api).to be_an_instance_of
|
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
|
57
|
-
expect(@api.server).to be_an_instance_of
|
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
|
79
|
-
expect(@api.terms.term(1139).subject('CS')).to be_an_instance_of
|
80
|
-
expect(@api.terms.term(1139).subject('CS').catalog_number(115)).to be_an_instance_of
|
81
|
-
expect(@api.terms.term(1139).subject('CS').catalog_number(115).schedule).to be_an_instance_of
|
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
|
4
|
-
spec.version
|
5
|
-
spec.
|
6
|
-
spec.
|
7
|
-
spec.
|
8
|
-
spec.
|
9
|
-
spec.
|
10
|
-
spec.
|
11
|
-
spec.
|
12
|
-
spec.
|
13
|
-
spec.
|
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.
|
16
|
-
|
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.
|
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-
|
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:
|
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:
|
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:
|
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.
|
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
|
data/lib/helpers/routes.rb
DELETED
@@ -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
|