nusmods 0.0.2 → 0.0.3
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/.rspec +2 -0
- data/Gemfile +5 -0
- data/README.md +105 -0
- data/lib/nusmods.rb +9 -61
- data/lib/nusmods/client.rb +34 -0
- data/lib/nusmods/endpoints.rb +36 -0
- data/lib/nusmods/version.rb +3 -0
- data/nusmods.gemspec +23 -0
- data/spec/nusmods.rb +51 -0
- data/spec/spec_helper.rb +20 -0
- metadata +59 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 646705ac8ac19ea152e6561e8b773146dfc72d47
|
4
|
+
data.tar.gz: a4b77c00d38cb854d8bee3fdd32094d4b99155ea
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d9782a618b38ea224086c6f00d2faf6189079d2d53cd7027c7e3fc8d0be5ac661880c2cd63319e3b25eae635260a37133b7844644398c470cfea7158f621a93d
|
7
|
+
data.tar.gz: 7f47afb0189bbff35ffc7f287ee9b6da7ca7d5c823f6671194f532b6638f0aa1a2b505c2d57a91c3ebb9455834aa067719c170bac92c2c7333637eb2700951e2
|
data/.rspec
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
A ruby wrapper for the NUSModsAPI
|
2
|
+
---
|
3
|
+
|
4
|
+
### Disclaimer
|
5
|
+
|
6
|
+
This gem is not maintained by the creator of NUSMods.
|
7
|
+
|
8
|
+
NUSModsAPI repository: https://github.com/ahbeng/NUSModsAPI
|
9
|
+
|
10
|
+
---
|
11
|
+
|
12
|
+
### Installation
|
13
|
+
|
14
|
+
```sh
|
15
|
+
gem install nusmods
|
16
|
+
```
|
17
|
+
|
18
|
+
or add this line into your `Gemfile`
|
19
|
+
|
20
|
+
```
|
21
|
+
gem 'nusmods'
|
22
|
+
```
|
23
|
+
|
24
|
+
then, run `bundle install`.
|
25
|
+
|
26
|
+
|
27
|
+
### Usage
|
28
|
+
|
29
|
+
```rb
|
30
|
+
require 'nusmods' # => true
|
31
|
+
client = NUSMods::Client.new # => #<NUSMods::Client:0x007f85928efb10 @base_url="http://api.nusmods.com/">
|
32
|
+
```
|
33
|
+
|
34
|
+
### Endpoints
|
35
|
+
|
36
|
+
All methods are set to retrieve the current AY's records if you do not provide
|
37
|
+
any parameters for year or semester.
|
38
|
+
|
39
|
+
#### Faculty Departments
|
40
|
+
|
41
|
+
Retrieves the list of faculty departments/sub-departments.
|
42
|
+
|
43
|
+
```rb
|
44
|
+
client.get_faculty_departments(year = 2014, semester = 1)
|
45
|
+
```
|
46
|
+
|
47
|
+
#### Lesson Types
|
48
|
+
|
49
|
+
Retrieves a list of the types of lessons. This API call is not tied to a
|
50
|
+
specific AY or semester.
|
51
|
+
|
52
|
+
```rb
|
53
|
+
client.get_lesson_types
|
54
|
+
```
|
55
|
+
|
56
|
+
#### Module codes
|
57
|
+
|
58
|
+
Retrieves a list of all module codes offered in the semester.
|
59
|
+
|
60
|
+
```rb
|
61
|
+
client.get_module_codes(year = 2014, semester = 1)
|
62
|
+
```
|
63
|
+
|
64
|
+
#### Module codes with names
|
65
|
+
|
66
|
+
Retrieves a list of all module codes accompanied by their names.
|
67
|
+
|
68
|
+
```rb
|
69
|
+
client.get_module_codes_with_names(year = 2014, semester = 1)
|
70
|
+
```
|
71
|
+
|
72
|
+
#### Module details
|
73
|
+
|
74
|
+
Retrieves all information about a specific module
|
75
|
+
|
76
|
+
```rb
|
77
|
+
client.get_module_details("MA1101R", year = 2014, semester = 1)
|
78
|
+
```
|
79
|
+
|
80
|
+
#### All modules
|
81
|
+
|
82
|
+
Retrieves all information about every module.
|
83
|
+
Note: This retrieves a large dataset, so it will take a while. It is highly
|
84
|
+
suggested that you download a copy from the API directly and store it locally.
|
85
|
+
|
86
|
+
```rb
|
87
|
+
client.get_modules(year = 2014, semester = 1)
|
88
|
+
```
|
89
|
+
|
90
|
+
For more details, see [NUSModsAPI's README.][1]
|
91
|
+
|
92
|
+
|
93
|
+
[1]: https://github.com/ahbeng/NUSModsAPI/blob/master/README.md
|
94
|
+
|
95
|
+
|
96
|
+
### Tests:
|
97
|
+
|
98
|
+
```sh
|
99
|
+
gem install rspec
|
100
|
+
rspec spec/nusmods.rb
|
101
|
+
```
|
102
|
+
|
103
|
+
### License
|
104
|
+
|
105
|
+
http://opensource.org/licenses/MIT
|
data/lib/nusmods.rb
CHANGED
@@ -1,68 +1,16 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
1
|
+
require 'faraday'
|
2
|
+
require 'faraday_middleware'
|
3
|
+
require 'nusmods/client'
|
3
4
|
|
4
|
-
|
5
|
+
directory = File.expand_path(File.dirname(__FILE__))
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
JSON.parse(resp.body)
|
9
|
-
end
|
10
|
-
|
11
|
-
# Returns a Array of all module codes in the given year and semester
|
12
|
-
def get_module_codes(year, semester)
|
13
|
-
endpoint = "http://api.nusmods.com/#{year}-#{year + 1}/#{semester}/moduleCodes.json"
|
14
|
-
begin
|
15
|
-
fetch_json(endpoint)
|
16
|
-
rescue
|
17
|
-
raise "The requested resource is not available for the given year or semester."
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
# Returns a Hash of all module codes as keys, and its respective module name as values.
|
22
|
-
def get_module_codes_with_names(year, semester)
|
23
|
-
endpoint = "http://api.nusmods.com/#{year}-#{year + 1}/#{semester}/moduleList.json"
|
24
|
-
begin
|
25
|
-
fetch_json(endpoint)
|
26
|
-
rescue
|
27
|
-
raise "The requested resource is not available for the given year or semester."
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
# Returns a Hash of all faculties as keys, and departments under the respective faculties as values.
|
32
|
-
def get_faculty_departments(year, semester)
|
33
|
-
endpoint = "http://api.nusmods.com/#{year}-#{year + 1}/#{semester}/facultyDepartments.json"
|
34
|
-
begin
|
35
|
-
fetch_json(endpoint)
|
36
|
-
rescue
|
37
|
-
raise "The requested resource is not available for the given year or semester."
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def get_lesson_types(year, semester)
|
42
|
-
endpoint = "http://api.nusmods.com/#{year}-#{year + 1}/#{semester}/lessonTypes.json"
|
43
|
-
begin
|
44
|
-
fetch_json(endpoint)
|
45
|
-
rescue
|
46
|
-
raise "The requested resource is not available for the given year or semester."
|
47
|
-
end
|
48
|
-
end
|
7
|
+
module NUSMods
|
8
|
+
class << self
|
49
9
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
fetch_json(endpoint)
|
54
|
-
rescue
|
55
|
-
raise "The requested resource is not available for the given year or semester."
|
10
|
+
## configure default
|
11
|
+
def configure
|
12
|
+
yield self
|
56
13
|
end
|
57
|
-
end
|
58
14
|
|
59
|
-
def get_modules(year, semester)
|
60
|
-
endpoint = "http://api.nusmods.com/#{year}-#{year + 1}/#{semester}/modules.json"
|
61
|
-
begin
|
62
|
-
fetch_json(endpoint)
|
63
|
-
rescue
|
64
|
-
raise "The requested resource is not available for the given year or semester."
|
65
|
-
end
|
66
15
|
end
|
67
|
-
|
68
16
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'nusmods/endpoints'
|
2
|
+
require 'active_support/notifications'
|
3
|
+
|
4
|
+
module NUSMods
|
5
|
+
class Client
|
6
|
+
|
7
|
+
include Endpoints
|
8
|
+
|
9
|
+
def initialize(opts = {})
|
10
|
+
@base_url = "http://api.nusmods.com/"
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def connection
|
16
|
+
Faraday.new(url: @base_url) do |f|
|
17
|
+
f.response :json, :content_type => /\bjson$/
|
18
|
+
f.use :instrumentation
|
19
|
+
f.adapter Faraday.default_adapter
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def get(url)
|
24
|
+
response = connection.get url
|
25
|
+
response.body
|
26
|
+
end
|
27
|
+
|
28
|
+
# Converts a provided year to the API requirements
|
29
|
+
def format_year(year)
|
30
|
+
"#{year}-#{year+1}"
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module NUSMods
|
2
|
+
module Endpoints
|
3
|
+
|
4
|
+
CURRENT_YEAR = 2014
|
5
|
+
CURRENT_SEMESTER = 1
|
6
|
+
|
7
|
+
# Returns a Array of all module codes in the given year and semester
|
8
|
+
def get_module_codes(year = CURRENT_YEAR, semester = CURRENT_SEMESTER)
|
9
|
+
get "#{format_year(year)}/#{semester}/moduleCodes.json"
|
10
|
+
end
|
11
|
+
|
12
|
+
# Returns a Hash of all module codes as keys, and its respective module name as values.
|
13
|
+
def get_module_codes_with_names(year = CURRENT_YEAR, semester = CURRENT_SEMESTER)
|
14
|
+
get "#{format_year(year)}/#{semester}/moduleList.json"
|
15
|
+
end
|
16
|
+
|
17
|
+
# Returns a Hash of all faculties as keys, and departments under the respective faculties as values.
|
18
|
+
def get_faculty_departments(year = CURRENT_YEAR, semester = CURRENT_SEMESTER)
|
19
|
+
get "#{format_year(year)}/#{semester}/facultyDepartments.json"
|
20
|
+
end
|
21
|
+
|
22
|
+
# Returns the types of lessons (lecture, tutorial, etc) in a Hash
|
23
|
+
def get_lesson_types
|
24
|
+
get "lessonTypes.json"
|
25
|
+
end
|
26
|
+
|
27
|
+
def get_module_details(module_code, year = CURRENT_YEAR, semester = CURRENT_SEMESTER)
|
28
|
+
get "#{format_year(year)}/#{semester}/modules/#{module_code}.json"
|
29
|
+
end
|
30
|
+
|
31
|
+
def get_modules(year = CURRENT_YEAR, semester = CURRENT_SEMESTER)
|
32
|
+
get "#{format_year(year)}/#{semester}/modules.json"
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
data/nusmods.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require 'nusmods/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'nusmods'
|
7
|
+
s.version = NUSMods::VERSION
|
8
|
+
s.date = Date.today.to_s
|
9
|
+
s.summary = "A ruby wrapper interface for NUSModsAPI."
|
10
|
+
s.description = s.summary
|
11
|
+
s.authors = ["Jingwen Chen"]
|
12
|
+
s.email = 'jin@crypt.sg'
|
13
|
+
s.files = ["lib/nusmods.rb"]
|
14
|
+
s.homepage =
|
15
|
+
'http://rubygems.org/gems/nusmods'
|
16
|
+
s.license = 'MIT'
|
17
|
+
|
18
|
+
s.files = `git ls-files -z`.split("\x0")
|
19
|
+
s.require_paths = %w( lib )
|
20
|
+
s.add_dependency 'faraday'
|
21
|
+
s.add_dependency 'faraday_middleware'
|
22
|
+
s.add_dependency 'activesupport'
|
23
|
+
end
|
data/spec/nusmods.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe NUSMods do
|
4
|
+
|
5
|
+
before :all do
|
6
|
+
@nm = NUSMods::Client.new
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "#get_module_codes" do
|
10
|
+
it "should return an array if the requested resource exist" do
|
11
|
+
resp = @nm.get_module_codes
|
12
|
+
expect(resp.class).to eq(Array)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "#get_module_codes_with_names" do
|
17
|
+
it "should return a Hash if the requested resource exist" do
|
18
|
+
resp = @nm.get_module_codes_with_names
|
19
|
+
expect(resp.class).to eq(Hash)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "#get_faculty_departments" do
|
24
|
+
it "should return a Hash if the requested resource exist" do
|
25
|
+
resp = @nm.get_faculty_departments
|
26
|
+
expect(resp.class).to eq(Hash)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#get_lesson_types" do
|
31
|
+
it "should return a Hash if the requested resource exist" do
|
32
|
+
resp = @nm.get_lesson_types
|
33
|
+
expect(resp.class).to eq(Hash)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "#get_module_details" do
|
38
|
+
it "should return a Hash if the requested resource exist" do
|
39
|
+
resp = @nm.get_module_details("CS1010")
|
40
|
+
expect(resp.class).to eq(Hash)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# describe "#get_modules" do
|
45
|
+
# it "should return a Array if the requested resource exist" do
|
46
|
+
# resp = @nm.get_modules
|
47
|
+
# expect(resp.class).to eq(Array)
|
48
|
+
# end
|
49
|
+
# end
|
50
|
+
|
51
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# This file was generated by the `rspec --init` command. Conventionally, all
|
2
|
+
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
3
|
+
# Require this file using `require "spec_helper"` to ensure that it is only
|
4
|
+
# loaded once.
|
5
|
+
#
|
6
|
+
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
7
|
+
RSpec.configure do |config|
|
8
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
9
|
+
config.run_all_when_everything_filtered = true
|
10
|
+
config.filter_run :focus
|
11
|
+
|
12
|
+
# Run specs in random order to surface order dependencies. If you find an
|
13
|
+
# order dependency and want to debug it, you can fix the order by providing
|
14
|
+
# the seed, which is printed after each run.
|
15
|
+
# --seed 1234
|
16
|
+
config.order = 'random'
|
17
|
+
|
18
|
+
# points to the main nusmods.rb
|
19
|
+
require File.expand_path("../../lib/nusmods", __FILE__)
|
20
|
+
end
|
metadata
CHANGED
@@ -1,23 +1,73 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nusmods
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jingwen Chen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
12
|
-
dependencies:
|
13
|
-
|
14
|
-
|
11
|
+
date: 2014-10-31 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: faraday
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: faraday_middleware
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: activesupport
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: A ruby wrapper interface for NUSModsAPI.
|
15
56
|
email: jin@crypt.sg
|
16
57
|
executables: []
|
17
58
|
extensions: []
|
18
59
|
extra_rdoc_files: []
|
19
60
|
files:
|
61
|
+
- .rspec
|
62
|
+
- Gemfile
|
63
|
+
- README.md
|
20
64
|
- lib/nusmods.rb
|
65
|
+
- lib/nusmods/client.rb
|
66
|
+
- lib/nusmods/endpoints.rb
|
67
|
+
- lib/nusmods/version.rb
|
68
|
+
- nusmods.gemspec
|
69
|
+
- spec/nusmods.rb
|
70
|
+
- spec/spec_helper.rb
|
21
71
|
homepage: http://rubygems.org/gems/nusmods
|
22
72
|
licenses:
|
23
73
|
- MIT
|
@@ -28,18 +78,18 @@ require_paths:
|
|
28
78
|
- lib
|
29
79
|
required_ruby_version: !ruby/object:Gem::Requirement
|
30
80
|
requirements:
|
31
|
-
- -
|
81
|
+
- - '>='
|
32
82
|
- !ruby/object:Gem::Version
|
33
83
|
version: '0'
|
34
84
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
35
85
|
requirements:
|
36
|
-
- -
|
86
|
+
- - '>='
|
37
87
|
- !ruby/object:Gem::Version
|
38
88
|
version: '0'
|
39
89
|
requirements: []
|
40
90
|
rubyforge_project:
|
41
|
-
rubygems_version: 2.
|
91
|
+
rubygems_version: 2.0.14
|
42
92
|
signing_key:
|
43
93
|
specification_version: 4
|
44
|
-
summary: A ruby interface for NUSModsAPI.
|
94
|
+
summary: A ruby wrapper interface for NUSModsAPI.
|
45
95
|
test_files: []
|