explorecourses 0.0.1 → 0.1

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: a7d56d24bea09a0b5ada6fbd5ffafbc100308a0f
4
- data.tar.gz: a777da99099db311f7d972a714afba71795cfe6b
3
+ metadata.gz: c224e6b907a6b894da50ac2e36c92b2ff4640f93
4
+ data.tar.gz: 749be8eb5a1c35dc381a26a48ff0aa20eae04b67
5
5
  SHA512:
6
- metadata.gz: c90b7878b4e73e5ca9b7f168ae5549ce68f85bc5b6d5fdbea00672c62f879952c8d60236ce2791c9d187ec30cb38e886e8e9857ba8cf2874b686745b34d4c644
7
- data.tar.gz: 8337dc8febba926aa9e10edaf721661c1bf2e5acbb86e4c0fa074250d64446aac3d9beef11ed9ca64f807c0ff65f13072f05a4ef8d37813106dcbb2a679b1833
6
+ metadata.gz: 412639c4c7166f257437b7a2f4348b55dbe03fc422c2e16a4e1931ddbb142dc3878a039b68cc02ec5fd070f365a103e58b5df1d1728f7d1e04f20e7fe756e052
7
+ data.tar.gz: 5a46fba6bc7059f8a5ecde84648c0f565bbeacd5049676813f3c0d7a7b0afdfc9d4de02d551a8b237682d38eeb3c058840fb1d9b03d6f3ccf7325a576255ac0f
data/.gitignore ADDED
@@ -0,0 +1 @@
1
+ *.gem
data/README.md ADDED
@@ -0,0 +1,59 @@
1
+ ### ExploreCourses for Ruby
2
+
3
+ ##### Installation
4
+
5
+ Assuming that you have RubyGems, either run
6
+
7
+ gem install explorecourses
8
+
9
+ to install for your system or add the following to your Gemfile
10
+
11
+ gem 'explorecourses'
12
+
13
+ then run
14
+
15
+ bundle install
16
+
17
+ ##### Usage
18
+
19
+ Until I add documentation annotations to the source code, I recommend reading the source directly to find out what properties can be accessed.
20
+
21
+ require 'explorecourses'
22
+
23
+ # Search for all the courses
24
+ courses = ExploreCourses.query_courses("CS 140")
25
+
26
+ # Get the title of the course
27
+ courses[0].title
28
+ => "Operating Systems and Systems Programming"
29
+
30
+ # Get the number of sections for the course
31
+ courses[0].sections.length
32
+ => 3
33
+
34
+ ##### Checklist
35
+
36
+ * Add RDoc style documentation to all source code
37
+ * Add tests
38
+
39
+ ##### License
40
+
41
+ Copyright (c) 2014 Roger Chen
42
+
43
+ Permission is hereby granted, free of charge, to any person obtaining a copy
44
+ of this software and associated documentation files (the "Software"), to deal
45
+ in the Software without restriction, including without limitation the rights
46
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
47
+ copies of the Software, and to permit persons to whom the Software is
48
+ furnished to do so, subject to the following conditions:
49
+
50
+ The above copyright notice and this permission notice shall be included in
51
+ all copies or substantial portions of the Software.
52
+
53
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
54
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
55
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
56
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
57
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
58
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
59
+ THE SOFTWARE.
@@ -0,0 +1,17 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'explorecourses'
3
+ s.version = '0.1'
4
+ s.date = '2014-09-26'
5
+ s.summary = 'Ruby wrapper for ExploreCourses API'
6
+ s.description = 'Allow Ruby programs to easily access the ExploreCourses API'
7
+ s.authors = ['Roger Chen']
8
+ s.email = 'rogerthechen@gmail.com'
9
+ s.homepage = 'https://rogr.me/projects/explorecourses-gem'
10
+ s.license = 'MIT'
11
+
12
+ s.files = `git ls-files`.split("\n")
13
+ s.require_path = 'lib'
14
+
15
+ s.add_dependency "nokogiri", "~> 1.6"
16
+ s.add_dependency "typhoeus", "~> 0.6"
17
+ end
@@ -0,0 +1,5 @@
1
+ require 'explorecourses/course'
2
+ require 'explorecourses/section'
3
+ require 'explorecourses/schedule'
4
+ require 'explorecourses/instructor'
5
+ require 'explorecourses/base'
@@ -0,0 +1,111 @@
1
+ require 'nokogiri'
2
+ require 'typhoeus'
3
+
4
+ module ExploreCourses
5
+
6
+ URL_BASE_SEARCH = "http://explorecourses.stanford.edu/search?"
7
+ XML_VERSION = "xml-20140630"
8
+
9
+ def self.check_xml_version
10
+ request = Typhoeus::Request.new(URL_BASE_SEARCH, params: { view: XML_VERSION })
11
+ request.run
12
+ response = request.response
13
+ if response
14
+ doc = Nokogiri::XML(response.body)
15
+ return { deprecated: doc.at_xpath("//deprecated").content,
16
+ latest_version: doc.at_xpath("//latestVersion").content}
17
+ end
18
+ end
19
+
20
+ def self.query_courses(query)
21
+ params = {
22
+ view: XML_VERSION,
23
+ q: query
24
+ }
25
+ request = Typhoeus::Request.new(URL_BASE_SEARCH, params: params)
26
+ request.run
27
+ response = request.response
28
+ if response
29
+ doc = Nokogiri::XML(response.body)
30
+ # use XPath to navigate the XML body
31
+ courses_xml = doc.xpath(".//course")
32
+ courses = []
33
+ courses_xml.each do |course_xml|
34
+ year = course_xml.at_xpath(".//year").content
35
+ subject = course_xml.at_xpath(".//subject").content
36
+ code = course_xml.at_xpath(".//code").content
37
+ title = course_xml.at_xpath(".//title").content
38
+ description = course_xml.at_xpath(".//description").content
39
+ gers = course_xml.at_xpath(".//gers").content
40
+ repeatable = course_xml.at_xpath(".//repeatable").content
41
+ grading = course_xml.at_xpath(".//grading").content
42
+ units_min = course_xml.at_xpath(".//unitsMin").content
43
+ units_max = course_xml.at_xpath(".//unitsMax").content
44
+ sections = retrieve_sections(course_xml.xpath(".//section"))
45
+ courses << Course.new(year, subject, code, title, description, gers, repeatable,
46
+ grading, units_min, units_max, sections)
47
+ end
48
+ return courses
49
+ end
50
+ end
51
+
52
+ private
53
+
54
+ def self.retrieve_sections(sections_xml)
55
+ sections = []
56
+ sections_xml.each do |section_xml|
57
+ class_id = section_xml.at_xpath(".//classId").content
58
+ term = section_xml.at_xpath(".//term").content
59
+ term_id = section_xml.at_xpath(".//termId").content
60
+ subject = section_xml.at_xpath(".//subject").content
61
+ code = section_xml.at_xpath(".//code").content
62
+ units = section_xml.at_xpath(".//units").content
63
+ section_number = section_xml.at_xpath(".//sectionNumber").content
64
+ component = section_xml.at_xpath(".//component").content
65
+ num_enrolled = section_xml.at_xpath(".//numEnrolled").content
66
+ max_enrolled = section_xml.at_xpath(".//maxEnrolled").content
67
+ num_waitlist = section_xml.at_xpath(".//numWaitlist").content
68
+ max_waitlist = section_xml.at_xpath(".//maxWaitlist").content
69
+ enroll_status = section_xml.at_xpath(".//enrollStatus").content
70
+ add_consent = section_xml.at_xpath(".//addConsent").content
71
+ drop_consent = section_xml.at_xpath(".//dropConsent").content
72
+ course_id = section_xml.at_xpath(".//courseId").content
73
+ schedules = retrieve_schedules(section_xml.xpath(".//schedule"))
74
+ sections << Section.new(class_id, term, term_id, subject, code, units, section_number, component,
75
+ num_enrolled, max_enrolled, num_waitlist, max_waitlist, enroll_status, add_consent,
76
+ drop_consent, course_id, schedules)
77
+ end
78
+ return sections
79
+ end
80
+
81
+ def self.retrieve_schedules(schedules_xml)
82
+ schedules = []
83
+ schedules_xml.each do |schedule_xml|
84
+ start_date = schedule_xml.at_xpath(".//startDate").content
85
+ end_date = schedule_xml.at_xpath(".//endDate").content
86
+ start_time = schedule_xml.at_xpath(".//startTime").content
87
+ end_time = schedule_xml.at_xpath(".//endTime").content
88
+ location = schedule_xml.at_xpath(".//location").content
89
+ # Cleaning up after whoever put all the \t and \n in the string...
90
+ days = schedule_xml.at_xpath("./days").content.gsub(/[\t\n]/, ' ').split.join(',')
91
+ instructors = retrieve_instructors(schedule_xml.xpath(".//instructor"))
92
+ schedules << Schedule.new(start_date, end_date, start_time, end_time, location, days, instructors)
93
+ end
94
+ return schedules
95
+ end
96
+
97
+ def self.retrieve_instructors(instructors_xml)
98
+ instructors = []
99
+ instructors_xml.each do |instructor_xml|
100
+ name = instructor_xml.at_xpath(".//name").content
101
+ first_name = instructor_xml.at_xpath(".//firstName").content
102
+ middle_name = instructor_xml.at_xpath(".//middleName").content
103
+ last_name = instructor_xml.at_xpath(".//lastName").content
104
+ sunet = instructor_xml.at_xpath(".//sunet").content
105
+ role = instructor_xml.at_xpath(".//role").content
106
+ instructors << Instructor.new(name, first_name, middle_name, last_name, sunet, role)
107
+ end
108
+ return instructors
109
+ end
110
+
111
+ end
@@ -0,0 +1,25 @@
1
+ module ExploreCourses
2
+
3
+ class Course
4
+
5
+ def initialize(year, subject, code, title, description, gers, repeatable, grading, units_min,
6
+ units_max, sections)
7
+ @year = year
8
+ @subject = subject
9
+ @code = code
10
+ @title = title
11
+ @description = description
12
+ @gers = gers
13
+ @repeatable = repeatable
14
+ @grading = grading
15
+ @units_min = units_min
16
+ @units_max = units_max
17
+ @sections = sections
18
+ end
19
+
20
+ attr_reader :year, :subject, :code, :title, :description, :gers, :repeatable, :grading, :units_min,
21
+ :units_max, :sections
22
+
23
+ end
24
+
25
+ end
@@ -0,0 +1,18 @@
1
+ module ExploreCourses
2
+
3
+ class Instructor
4
+
5
+ def initialize(name, first_name, middle_name, last_name, sunet, role)
6
+ @name = name
7
+ @first_name = first_name
8
+ @middle_name = middle_name
9
+ @last_name = last_name
10
+ @sunet = sunet
11
+ @role = role
12
+ end
13
+
14
+ attr_reader :name, :first_name, :middle_name, :last_name, :sunet, :role
15
+
16
+ end
17
+
18
+ end
@@ -0,0 +1,19 @@
1
+ module ExploreCourses
2
+
3
+ class Schedule
4
+
5
+ def initialize(start_date, end_date, start_time, end_time, location, days, instructors)
6
+ @start_date = start_date
7
+ @end_date = end_date
8
+ @start_time = start_time
9
+ @end_time = end_time
10
+ @location = location
11
+ @days = days
12
+ @instructors = instructors
13
+ end
14
+
15
+ attr_reader :start_date, :end_date, :start_time, :end_time, :location, :days, :instructors
16
+
17
+ end
18
+
19
+ end
@@ -0,0 +1,32 @@
1
+ module ExploreCourses
2
+
3
+ class Section
4
+
5
+ def initialize(class_id, term, term_id, subject, code, units, section_number, component, num_enrolled,
6
+ max_enrolled, num_waitlist, max_waitlist, enroll_status, add_consent, drop_consent, course_id, schedules)
7
+ @class_id = class_id
8
+ @term = term
9
+ @term_id = term_id
10
+ @subject = subject
11
+ @code = code
12
+ @units = units
13
+ @section_number = section_number
14
+ @component = component
15
+ @num_enrolled = num_enrolled
16
+ @max_enrolled = max_enrolled
17
+ @num_waitlist = num_waitlist
18
+ @max_waitlist = max_waitlist
19
+ @enroll_status = enroll_status
20
+ @add_consent = add_consent
21
+ @drop_consent = drop_consent
22
+ @course_id = course_id
23
+ @schedules = schedules
24
+ end
25
+
26
+ attr_reader :class_id, :term, :term_id, :subject, :code, :units, :section_number, :component,
27
+ :num_enrolled, :max_enrolled, :num_waitlist, :max_waitlist, :enroll_status, :add_consent,
28
+ :drop_consent, :course_id, :schedules
29
+
30
+ end
31
+
32
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: explorecourses
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: '0.1'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Roger Chen
@@ -9,13 +9,50 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
  date: 2014-09-26 00:00:00.000000000 Z
12
- dependencies: []
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nokogiri
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: typhoeus
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.6'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.6'
13
41
  description: Allow Ruby programs to easily access the ExploreCourses API
14
42
  email: rogerthechen@gmail.com
15
43
  executables: []
16
44
  extensions: []
17
45
  extra_rdoc_files: []
18
- files: []
46
+ files:
47
+ - ".gitignore"
48
+ - README.md
49
+ - explorecourses.gemspec
50
+ - lib/explorecourses.rb
51
+ - lib/explorecourses/base.rb
52
+ - lib/explorecourses/course.rb
53
+ - lib/explorecourses/instructor.rb
54
+ - lib/explorecourses/schedule.rb
55
+ - lib/explorecourses/section.rb
19
56
  homepage: https://rogr.me/projects/explorecourses-gem
20
57
  licenses:
21
58
  - MIT