Class: MyUW::Schedule

Inherits:
Object
  • Object
show all
Defined in:
lib/myuw/schedule.rb

Overview

Synopsis

The Schdule class is responsible for querying a student’s currently registered schedule.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(myuw = nil) ⇒ Schedule

Returns a new instance of Schedule.



9
10
11
12
# File 'lib/myuw/schedule.rb', line 9

def initialize(myuw=nil)
  @myuw ||= myuw
  @courses = nil
end

Instance Attribute Details

#coursesObject (readonly)

Returns the value of attribute courses.



7
8
9
# File 'lib/myuw/schedule.rb', line 7

def courses
  @courses
end

#myuwObject

Returns the value of attribute myuw.



6
7
8
# File 'lib/myuw/schedule.rb', line 6

def myuw
  @myuw
end

Instance Method Details

#credits(force = false) ⇒ Object



14
15
16
17
18
# File 'lib/myuw/schedule.rb', line 14

def credits(force=false)
  return @credits if @credits && !force
  schedule(true)
  @credits
end

#get_courses(schedule) ⇒ Object

Raises:



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/myuw/schedule.rb', line 37

def get_courses(schedule)
  courses = schedule.search("//table[@border=1 and @cellpadding=3]//tr[@bgcolor='#d0d0d0'][2]/following-sibling::*//td[@align='center']/parent::*")
  raise InvalidPageError.new(schedule, "No courses were found") if courses.empty?
  
  data_order = [:sln, :course, :type, :credits, :title, :days, :time, :location, :instructor]
  
  @courses = []
  courses.each do |course|
    data = course.search('td')
    raise InvalidPageError(schedule, "Something strange happening, found courses but no course data") if data.empty?
    
    course_info = {}
    i = 0
    data.each do |datum|
      break if data_order[i].nil?
      
      course_info[data_order[i]] = datum.inner_text.strip.gsub("\302\240", "")
      i += 1
    end
    
    @courses.push(course_info)
  end
end

#get_credits(schedule) ⇒ Object

Raises:



61
62
63
64
65
66
67
68
69
# File 'lib/myuw/schedule.rb', line 61

def get_credits(schedule)
  credits = schedule.search("//table[@border=1 and @cellpadding=3]//tr[@bgcolor='#d0d0d0'][2]/following-sibling::*//td[@colspan=4]")
  raise InvalidPageError.new(schedule, "No credit row was found") if credits.empty?
  
  credits_text = credits[0].inner_text.strip.gsub("\302\240", "")
  raise InvalidPageError.new(schedule, "Credit row in different syntax") unless credits_text =~ /^Total credits: (.+?)$/
  
  @credits = $1.to_f
end

#schedule(force = false) ⇒ Object

Raises:



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/myuw/schedule.rb', line 20

def schedule(force=false)
  raise NotLoggedInError.new("User must be logged in to fetch SLN data") unless @myuw.logged_in?

  # Return the schedule if we precached it at some point
  # unless we're forcing it
  return @courses if @courses && !force
  
  # Grab the schedule page
  schedule_page = @myuw.browser.get("https://sdb.admin.washington.edu/students/uwnetid/schedule.asp")
  
  # Grab the info out of it
  get_courses schedule_page
  
  # Grab the credits
  get_credits schedule_page
end