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 +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
|
[![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
|
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
|