mitchellh-rubyuw 0.4.2 → 0.5.0

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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.2
1
+ 0.5.0
@@ -0,0 +1,71 @@
1
+ class MyUW
2
+ # = Synopsis
3
+ # The Schdule class is responsible for querying a
4
+ # student's currently registered schedule.
5
+ class Schedule
6
+ attr_accessor :myuw
7
+ attr_reader :courses
8
+
9
+ def initialize(myuw=nil)
10
+ @myuw ||= myuw
11
+ @courses = nil
12
+ end
13
+
14
+ def credits(force=false)
15
+ return @credits if @credits && !force
16
+ schedule(true)
17
+ @credits
18
+ end
19
+
20
+ def schedule(force=false)
21
+ raise NotLoggedInError.new("User must be logged in to fetch SLN data") unless @myuw.logged_in?
22
+
23
+ # Return the schedule if we precached it at some point
24
+ # unless we're forcing it
25
+ return @courses if @courses && !force
26
+
27
+ # Grab the schedule page
28
+ schedule_page = @myuw.browser.get("https://sdb.admin.washington.edu/students/uwnetid/schedule.asp")
29
+
30
+ # Grab the info out of it
31
+ get_courses schedule_page
32
+
33
+ # Grab the credits
34
+ get_credits schedule_page
35
+ end
36
+
37
+ def get_courses(schedule)
38
+ courses = schedule.search("//table[@border=1 and @cellpadding=3]//tr[@bgcolor='#d0d0d0'][2]/following-sibling::*//td[@align='center']/parent::*")
39
+ raise InvalidPageError.new(schedule, "No courses were found") if courses.empty?
40
+
41
+ data_order = [:sln, :course, :type, :credits, :title, :days, :time, :location, :instructor]
42
+
43
+ @courses = []
44
+ courses.each do |course|
45
+ data = course.search('td')
46
+ raise InvalidPageError(schedule, "Something strange happening, found courses but no course data") if data.empty?
47
+
48
+ course_info = {}
49
+ i = 0
50
+ data.each do |datum|
51
+ break if data_order[i].nil?
52
+
53
+ course_info[data_order[i]] = datum.inner_text.strip.gsub("\302\240", "")
54
+ i += 1
55
+ end
56
+
57
+ @courses.push(course_info)
58
+ end
59
+ end
60
+
61
+ def get_credits(schedule)
62
+ credits = schedule.search("//table[@border=1 and @cellpadding=3]//tr[@bgcolor='#d0d0d0'][2]/following-sibling::*//td[@colspan=4]")
63
+ raise InvalidPageError.new(schedule, "No credit row was found") if credits.empty?
64
+
65
+ credits_text = credits[0].inner_text.strip.gsub("\302\240", "")
66
+ raise InvalidPageError.new(schedule, "Credit row in different syntax") unless credits_text =~ /^Total credits: (.+?)$/
67
+
68
+ @credits = $1.to_f
69
+ end
70
+ end
71
+ end
data/lib/myuw.rb CHANGED
@@ -6,12 +6,14 @@ require 'mechanize'
6
6
  require 'myuw/errors'
7
7
  require 'myuw/session'
8
8
  require 'myuw/sln'
9
+ require 'myuw/schedule'
9
10
 
10
11
  class MyUW
11
12
  extend Forwardable
12
13
 
13
14
  attr_accessor :browser
14
15
  attr_accessor :session
16
+ attr_accessor :schedule
15
17
 
16
18
  def initialize
17
19
  # Initialize the browser instance and mascarade
@@ -29,6 +31,7 @@ class MyUW
29
31
 
30
32
  # Initialize other members
31
33
  @session = Session.new(self)
34
+ @schedule = Schedule.new(self)
32
35
  end
33
36
 
34
37
  # Forward the session methods
data/rubyuw.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{rubyuw}
5
- s.version = "0.4.2"
5
+ s.version = "0.5.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Mitchell Hashimoto"]
@@ -19,9 +19,11 @@ Gem::Specification.new do |s|
19
19
  "VERSION",
20
20
  "lib/myuw.rb",
21
21
  "lib/myuw/errors.rb",
22
+ "lib/myuw/schedule.rb",
22
23
  "lib/myuw/session.rb",
23
24
  "lib/myuw/sln.rb",
24
25
  "rubyuw.gemspec",
26
+ "test/live/schedule_test.rb",
25
27
  "test/live/session_test.rb",
26
28
  "test/live/sln_test.rb",
27
29
  "test/live/test_helper.rb",
@@ -31,10 +33,15 @@ Gem::Specification.new do |s|
31
33
  "test/mocked/fixture_pages/no_form_login.html",
32
34
  "test/mocked/fixture_pages/no_login_button.html",
33
35
  "test/mocked/fixture_pages/not_logged_in_relay.html",
36
+ "test/mocked/fixture_pages/schedule.html",
37
+ "test/mocked/fixture_pages/schedule_diff_credit_row.html",
38
+ "test/mocked/fixture_pages/schedule_empty.html",
39
+ "test/mocked/fixture_pages/schedule_no_credit_row.html",
34
40
  "test/mocked/fixture_pages/sln_does_not_exist.html",
35
41
  "test/mocked/fixture_pages/sln_status.html",
36
42
  "test/mocked/fixture_pages/welcome.html",
37
43
  "test/mocked/myuw_test.rb",
44
+ "test/mocked/schedule_test.rb",
38
45
  "test/mocked/session_test.rb",
39
46
  "test/mocked/sln_test.rb",
40
47
  "test/mocked/test_helper.rb",
@@ -47,10 +54,12 @@ Gem::Specification.new do |s|
47
54
  s.rubygems_version = %q{1.3.1}
48
55
  s.summary = %q{Library which provides a ruby interface to the University of Washington student portal.}
49
56
  s.test_files = [
50
- "test/live/session_test.rb",
57
+ "test/live/schedule_test.rb",
58
+ "test/live/session_test.rb",
51
59
  "test/live/sln_test.rb",
52
60
  "test/live/test_helper.rb",
53
61
  "test/mocked/myuw_test.rb",
62
+ "test/mocked/schedule_test.rb",
54
63
  "test/mocked/session_test.rb",
55
64
  "test/mocked/sln_test.rb",
56
65
  "test/mocked/test_helper.rb"
@@ -0,0 +1,28 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper')
2
+
3
+ # NOTE: Very little of this can actually be "live tested"
4
+ # by an automated script. The information is extremely
5
+ # volatile. We can only test the constants here. The
6
+ # rest must be "mock tested"
7
+
8
+ class LiveScheduleTest < Test::Unit::TestCase
9
+ context "fetching schedule" do
10
+ setup do
11
+ @myuw = MyUW.new
12
+ @session = @myuw.session
13
+ @session.email = MYUW_ID
14
+ @session.password = MYUW_PASSWORD
15
+ assert @session.login
16
+
17
+ @schedule = @myuw.schedule
18
+ end
19
+
20
+ should "throw an exception if not logged in" do
21
+ @session.logout
22
+
23
+ assert_raise MyUW::NotLoggedInError do
24
+ @schedule.schedule
25
+ end
26
+ end
27
+ end
28
+ end
@@ -2,4 +2,10 @@ begin
2
2
  require File.join(File.dirname(__FILE__), '..', 'password')
3
3
  rescue LoadError => e
4
4
  abort("Running live tests requires a password.rb file in the test folder with your MyUW credentials.")
5
- end
5
+ end
6
+
7
+ require File.join(File.dirname(__FILE__), '..', '..', 'lib', 'myuw')
8
+ require 'test/unit'
9
+ require "contest"
10
+ require "stories"
11
+ require "mocha"
@@ -0,0 +1,166 @@
1
+ <HTML>
2
+ <HEAD>
3
+ <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
4
+ <TITLE>Class Schedule</TITLE>
5
+ <LINK REL="stylesheet" TYPE="text/css" HREF="https://www.washington.edu/home/home.css">
6
+ </HEAD>
7
+ <BODY>
8
+ <table border='0' cellpadding='0' cellspacing='0' width='100%' align='center'>
9
+ <tr>
10
+ <td width='100%' class='rpad'>
11
+ <a href='http://www.washington.edu/' target='_top'><img src='/sdb_library/images/uwlogo150p.gif' border='0' width='150' height='28' alt='University of Washington'></a>
12
+ </td>
13
+ <td rowspan='2' valign='bottom'>
14
+
15
+ <table border='0' cellpadding='0' cellspacing='0'>
16
+ <tr><td colspan='2' bgcolor='#666666'><img src='/sdb_library/images/1px_transparent.gif' height='1'></td></tr>
17
+ <tr>
18
+ <td bgcolor='#666666'><img src='/sdb_library/images/1px_transparent.gif' width='7' height='1'></td>
19
+ <td nowrap><span class='l1text'>
20
+ &nbsp;<font color='#9999cc' face='tahoma,sans-serif,arial,helvetica' style='font-size:110%'><b>Student Personal Services</b></font>&nbsp;<span class='noprint'> | <a href='/students/logout.asp'>Logout</a>&nbsp;</span> </span></td>
21
+ </tr>
22
+ </table>
23
+
24
+ </td>
25
+ </tr>
26
+ <tr>
27
+ <td bgcolor='#666666'><img src='/sdb_library/images/1px_transparent.gif' height='1'></td>
28
+ </tr>
29
+ </table>
30
+ <table border='0' cellpadding='0' cellspacing='0' width='100%'>
31
+ <tr>
32
+ <td bgcolor='#e6e6e6'><img src='/sdb_library/images/1px_transparent.gif' width='1' height='5'></TD>
33
+ </tr>
34
+ </table>
35
+ <span class='noprint'>
36
+ <table border='0' cellpadding='0' cellspacing='0'>
37
+ <tr>
38
+ <td nowrap>&#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/register.asp' CLASS='barnav'><font color='#333399'>Registration</font></a></td>
39
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/grades.asp' CLASS='barnav'><font color='#333399'>Grade Inquiry</font></a></td>
40
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/dars.asp' CLASS='barnav'><font color='#333399'>DARS - Degree Audit</font></a></td>
41
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/finaidstatus.asp' CLASS='barnav'><font color='#333399'>Financial Aid Status</font></a></td>
42
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/sisStudents/uwnetid/tuition.aspx' CLASS='barnav'><font color='#333399'>Tuition Statement</font></a></td>
43
+ </tr>
44
+ <tr>
45
+ <td nowrap>&#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/schedule.asp' CLASS='barnav'><font color='#333399'><b>Class Schedule</b></font></a></td>
46
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/unofficial.asp' CLASS='barnav'><font color='#333399'>Unofficial Transcript</font></a></td>
47
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/address.asp' CLASS='barnav'><font color='#333399'>Change of Address</font></a></td>
48
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/emt.asp' CLASS='barnav'><font color='#333399'>Direct Deposit Transfer</font></a></td>
49
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/ccpay.asp' CLASS='barnav'><font color='#333399'>Credit Card Payment</font></a></td>
50
+ </tr>
51
+ <tr>
52
+ <td nowrap>&#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/vschedule.asp' CLASS='barnav'><font color='#333399'>Visual Schedule</font></a></td>
53
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/official.asp' CLASS='barnav'><font color='#333399'>Official Transcript</font></a></td>
54
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/op_charges.asp' CLASS='barnav'><font color='#333399'>Insurance/Optional Charges</font></a></td>
55
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/shorttermloan.asp' CLASS='barnav'><font color='#333399'>Short-Term Loan</font></a></td>
56
+ </table>
57
+ </span>
58
+ <H1>Class Schedule - Autumn 2009</H1>
59
+ <P><TABLE BORDER=0 CELLPADDING=2>
60
+ <TR><TH ALIGN=left>Prepared for:</TH><TD>Some Fake Guy </TD></TR>
61
+ <TR><TH ALIGN=left>Date prepared:</TH><TD>June 27, 2009</TD></TR>
62
+ </TABLE>
63
+ <BR>
64
+ <TABLE BORDER='1' CELLPADDING='3'>
65
+ <TR BGCOLOR="#d0d0d0">
66
+ <TH ROWSPAN=2>SLN</TH>
67
+ <TH ROWSPAN=2>Course</TH>
68
+ <TH ROWSPAN=2>Type</TH>
69
+ <TH ROWSPAN=2>Credits</TH>
70
+ <TH ROWSPAN=2>Title</TH>
71
+ <TH COLSPAN=4>Meetings</TH>
72
+ <TH ROWSPAN="2">More<BR>Information</TH>
73
+ </TR>
74
+ <TR BGCOLOR="#d0d0d0">
75
+ <TH>Days</TH>
76
+ <TH>Time</TH>
77
+ <TH>Location</TH>
78
+ <TH>Instructor</TH>
79
+ </TR>
80
+ <TR>
81
+ <TD ALIGN=center><TT><A HREF='https://sdb.admin.washington.edu/timeschd/UWNetID/sln.asp?QTRYR=AUT+2009&SLN=14368' TARGET="_blank">14368</A> </TD>
82
+ <TD NOWRAP><TT>HIST&nbsp;&nbsp; 111 A </TD>
83
+ <td align='center'><tt>LC</td>
84
+ <TD ALIGN=center><TT>5.0 </TD>
85
+ <TD><TT><A HREF="http://www.washington.edu/students/crscat/hist.html#hist111" TARGET="_HIST111">THE ANCIENT WORLD</A></TD>
86
+ <TD NOWRAP><TT>MTWTh</TD>
87
+ <TD NOWRAP><TT>&nbsp;130-&nbsp;220</TD>
88
+ <TD NOWRAP><TT><A HREF="http://www.washington.edu/students/maps/map.cgi?SMI" TARGET="_SMI">SMI</A> 120</TD>
89
+ <TD NOWRAP><TT><A HREF="http://www.washington.edu/students/icd/S/hist/111jwalker.html" TARGET="_WALKER,JOEL T">WALKER,JOEL T</A></TD>
90
+ <TD><TT><A HREF='https://catalysttools.washington.edu/workspace/jwalker/6138' TARGET='_new'>Class Web Site</A><BR><A HREF='http://digital.lib.washington.edu/php/currics/service.php?curric=HIST&sln=14368&quarter=autumn&year=2009' TARGET='_new'>Researching? Start here</A>&nbsp;</TT></TD>
91
+ </TR>
92
+ <TR>
93
+ <TD ALIGN=center><TT><A HREF='https://sdb.admin.washington.edu/timeschd/UWNetID/sln.asp?QTRYR=AUT+2009&SLN=14372' TARGET="_blank">14372</A> </TD>
94
+ <TD NOWRAP><TT>HIST&nbsp;&nbsp; 111 AD </TD>
95
+ <td align='center'><tt>QZ</td>
96
+ <TD ALIGN=center><TT>0.0 </TD>
97
+ <TD><TT><A HREF="http://www.washington.edu/students/crscat/hist.html#hist111" TARGET="_HIST111">THE ANCIENT WORLD</A></TD>
98
+ <TD NOWRAP><TT>F</TD>
99
+ <TD NOWRAP><TT>1130-1220</TD>
100
+ <TD NOWRAP><TT><A HREF="http://www.washington.edu/students/maps/map.cgi?CDH" TARGET="_CDH">CDH</A> 223B</TD>
101
+ <TD NOWRAP><TT>&nbsp;</TD>
102
+ <TD><TT>&nbsp;</TT></TD>
103
+ </TR>
104
+ <TR>
105
+ <TD ALIGN=center><TT><A HREF='https://sdb.admin.washington.edu/timeschd/UWNetID/sln.asp?QTRYR=AUT+2009&SLN=12271' TARGET="_blank">12271</A> </TD>
106
+ <TD NOWRAP><TT>CSE&nbsp;&nbsp;&nbsp; 322 A </TD>
107
+ <td align='center'><tt>LC</td>
108
+ <TD ALIGN=center><TT>3.0 </TD>
109
+ <TD><TT><A HREF="http://www.washington.edu/students/crscat/cse.html#cse322" TARGET="_CSE322">INTRO FORMAL MODELS</A></TD>
110
+ <TD NOWRAP><TT>MWF</TD>
111
+ <TD NOWRAP><TT>&nbsp;930-1020</TD>
112
+ <TD NOWRAP><TT><A HREF="http://www.washington.edu/students/maps/map.cgi?EEB" TARGET="_EEB">EEB</A> 037</TD>
113
+ <TD NOWRAP><TT>BEAME,PAUL W.</TD>
114
+ <TD><TT><A HREF='http://digital.lib.washington.edu/php/currics/service.php?curric=CSE&sln=12271&quarter=autumn&year=2009' TARGET='_new'>Researching? Start here</A>&nbsp;</TT></TD>
115
+ </TR>
116
+ <TR></TR>
117
+ <TR>
118
+ <TD ALIGN=right COLSPAN=4><TT>Total credits: 8.0&nbsp;</TD>
119
+ </TR>
120
+ </TABLE>
121
+ <TABLE BORDER="0" WIDTH="100%">
122
+ <TR><TD><BIG><A HREF="https://sdb.admin.washington.edu/textbooks/query.asp?qtr=Autumn&sln1=14368&sln2=14372&sln3=12271" TARGET="_tb">Display Textbooks</A></BIG></TD>
123
+ <td>&nbsp;&nbsp;<BIG> <A HREF="https://sdb.admin.washington.edu/students/UWNetID/examschedule.asp?Q=4">Display Final Exam Schedule</A></BIG></TD></TR></TABLE>
124
+ <span class='noprint'><p><center>
125
+ <table border='0' cellpadding='4' bgcolor='yellow' width='80%'><tr><td>
126
+
127
+ <table border='0' cellpadding='5' cellspacing='0' bgcolor='white' width='100%'><tr>
128
+ <td><img src='/sdb_library/images/caution.gif' width='30' height='30' hspace='10'></td>
129
+ <td>
130
+ To protect your privacy and prevent unauthorized use,
131
+ &nbsp;<a href='http://www.washington.edu/computing/weblogin/logout.html' target='_logout'>close
132
+ <b>ALL</b> of your web browser windows</a>
133
+ and web-enabled applications when you finish.
134
+ </td>
135
+ </tr></table>
136
+
137
+ </td></tr></table>
138
+ </center></p></span>
139
+ <P></P>
140
+ <table border='0' cellpadding='0' cellspacing='0' align='center' width='100%'>
141
+ <tr>
142
+ <td rowspan='2'>
143
+ <a href='http://www.washington.edu/'><img src='/sdb_library/images/footersealW.gif' border='0' height='48' width='48' hspace='5' vspace='7' alt='UW Seal'></a>
144
+ </td>
145
+ <td rowspan='3' bgcolor='#666666' width='5'><img src='/sdb_library/images/1px_transparent.gif' width='7' height='1'></td>
146
+ <td colspan='2' bgcolor='#666666' height='1'><img src='/sdb_library/images/1px_transparent.gif' width='1' height='1'></td>
147
+ </tr><tr>
148
+ <td width='100%'>
149
+ <table border='0' width='100%'>
150
+ <tr>
151
+ <td valign='top'><address>
152
+ Office of the Registrar<br>
153
+ regoff@u.washington.edu<br>
154
+ June 27, 2009
155
+ </address>
156
+ </td>
157
+ </tr>
158
+ </table>
159
+ </td>
160
+ </tr><tr height='1'>
161
+ <td bgcolor='#666666'><img src='/sdb_library/images/1px_transparent.gif' width='1' height='1'></td>
162
+ </tr>
163
+ </table>
164
+
165
+ </BODY>
166
+ </HTML>
@@ -0,0 +1,167 @@
1
+ <HTML>
2
+ <HEAD>
3
+ <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
4
+ <TITLE>Class Schedule</TITLE>
5
+ <LINK REL="stylesheet" TYPE="text/css" HREF="https://www.washington.edu/home/home.css">
6
+ </HEAD>
7
+ <BODY>
8
+ <table border='0' cellpadding='0' cellspacing='0' width='100%' align='center'>
9
+ <tr>
10
+ <td width='100%' class='rpad'>
11
+ <a href='http://www.washington.edu/' target='_top'><img src='/sdb_library/images/uwlogo150p.gif' border='0' width='150' height='28' alt='University of Washington'></a>
12
+ </td>
13
+ <td rowspan='2' valign='bottom'>
14
+
15
+ <table border='0' cellpadding='0' cellspacing='0'>
16
+ <tr><td colspan='2' bgcolor='#666666'><img src='/sdb_library/images/1px_transparent.gif' height='1'></td></tr>
17
+ <tr>
18
+ <td bgcolor='#666666'><img src='/sdb_library/images/1px_transparent.gif' width='7' height='1'></td>
19
+ <td nowrap><span class='l1text'>
20
+ &nbsp;<font color='#9999cc' face='tahoma,sans-serif,arial,helvetica' style='font-size:110%'><b>Student Personal Services</b></font>&nbsp;<span class='noprint'> | <a href='/students/logout.asp'>Logout</a>&nbsp;</span> </span></td>
21
+ </tr>
22
+ </table>
23
+
24
+ </td>
25
+ </tr>
26
+ <tr>
27
+ <td bgcolor='#666666'><img src='/sdb_library/images/1px_transparent.gif' height='1'></td>
28
+ </tr>
29
+ </table>
30
+ <table border='0' cellpadding='0' cellspacing='0' width='100%'>
31
+ <tr>
32
+ <td bgcolor='#e6e6e6'><img src='/sdb_library/images/1px_transparent.gif' width='1' height='5'></TD>
33
+ </tr>
34
+ </table>
35
+ <span class='noprint'>
36
+ <table border='0' cellpadding='0' cellspacing='0'>
37
+ <tr>
38
+ <td nowrap>&#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/register.asp' CLASS='barnav'><font color='#333399'>Registration</font></a></td>
39
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/grades.asp' CLASS='barnav'><font color='#333399'>Grade Inquiry</font></a></td>
40
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/dars.asp' CLASS='barnav'><font color='#333399'>DARS - Degree Audit</font></a></td>
41
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/finaidstatus.asp' CLASS='barnav'><font color='#333399'>Financial Aid Status</font></a></td>
42
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/sisStudents/uwnetid/tuition.aspx' CLASS='barnav'><font color='#333399'>Tuition Statement</font></a></td>
43
+ </tr>
44
+ <tr>
45
+ <td nowrap>&#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/schedule.asp' CLASS='barnav'><font color='#333399'><b>Class Schedule</b></font></a></td>
46
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/unofficial.asp' CLASS='barnav'><font color='#333399'>Unofficial Transcript</font></a></td>
47
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/address.asp' CLASS='barnav'><font color='#333399'>Change of Address</font></a></td>
48
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/emt.asp' CLASS='barnav'><font color='#333399'>Direct Deposit Transfer</font></a></td>
49
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/ccpay.asp' CLASS='barnav'><font color='#333399'>Credit Card Payment</font></a></td>
50
+ </tr>
51
+ <tr>
52
+ <td nowrap>&#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/vschedule.asp' CLASS='barnav'><font color='#333399'>Visual Schedule</font></a></td>
53
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/official.asp' CLASS='barnav'><font color='#333399'>Official Transcript</font></a></td>
54
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/op_charges.asp' CLASS='barnav'><font color='#333399'>Insurance/Optional Charges</font></a></td>
55
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/shorttermloan.asp' CLASS='barnav'><font color='#333399'>Short-Term Loan</font></a></td>
56
+ </table>
57
+ </span>
58
+ <H1>Class Schedule - Autumn 2009</H1>
59
+ <P><TABLE BORDER=0 CELLPADDING=2>
60
+ <TR><TH ALIGN=left>Prepared for:</TH><TD>Some Fake Guy </TD></TR>
61
+ <TR><TH ALIGN=left>Date prepared:</TH><TD>June 27, 2009</TD></TR>
62
+ </TABLE>
63
+ <BR>
64
+ <TABLE BORDER='1' CELLPADDING='3'>
65
+ <TR BGCOLOR="#d0d0d0">
66
+ <TH ROWSPAN=2>SLN</TH>
67
+ <TH ROWSPAN=2>Course</TH>
68
+ <TH ROWSPAN=2>Type</TH>
69
+ <TH ROWSPAN=2>Credits</TH>
70
+ <TH ROWSPAN=2>Title</TH>
71
+ <TH COLSPAN=4>Meetings</TH>
72
+ <TH ROWSPAN="2">More<BR>Information</TH>
73
+ </TR>
74
+ <TR BGCOLOR="#d0d0d0">
75
+ <TH>Days</TH>
76
+ <TH>Time</TH>
77
+ <TH>Location</TH>
78
+ <TH>Instructor</TH>
79
+ </TR>
80
+ <TR>
81
+ <TD ALIGN=center><TT><A HREF='https://sdb.admin.washington.edu/timeschd/UWNetID/sln.asp?QTRYR=AUT+2009&SLN=14368' TARGET="_blank">14368</A> </TD>
82
+ <TD NOWRAP><TT>HIST&nbsp;&nbsp; 111 A </TD>
83
+ <td align='center'><tt>LC</td>
84
+ <TD ALIGN=center><TT>5.0 </TD>
85
+ <TD><TT><A HREF="http://www.washington.edu/students/crscat/hist.html#hist111" TARGET="_HIST111">THE ANCIENT WORLD</A></TD>
86
+ <TD NOWRAP><TT>MTWTh</TD>
87
+ <TD NOWRAP><TT>&nbsp;130-&nbsp;220</TD>
88
+ <TD NOWRAP><TT><A HREF="http://www.washington.edu/students/maps/map.cgi?SMI" TARGET="_SMI">SMI</A> 120</TD>
89
+ <TD NOWRAP><TT><A HREF="http://www.washington.edu/students/icd/S/hist/111jwalker.html" TARGET="_WALKER,JOEL T">WALKER,JOEL T</A></TD>
90
+ <TD><TT><A HREF='https://catalysttools.washington.edu/workspace/jwalker/6138' TARGET='_new'>Class Web Site</A><BR><A HREF='http://digital.lib.washington.edu/php/currics/service.php?curric=HIST&sln=14368&quarter=autumn&year=2009' TARGET='_new'>Researching? Start here</A>&nbsp;</TT></TD>
91
+ </TR>
92
+ <TR>
93
+ <TD ALIGN=center><TT><A HREF='https://sdb.admin.washington.edu/timeschd/UWNetID/sln.asp?QTRYR=AUT+2009&SLN=14372' TARGET="_blank">14372</A> </TD>
94
+ <TD NOWRAP><TT>HIST&nbsp;&nbsp; 111 AD </TD>
95
+ <td align='center'><tt>QZ</td>
96
+ <TD ALIGN=center><TT>0.0 </TD>
97
+ <TD><TT><A HREF="http://www.washington.edu/students/crscat/hist.html#hist111" TARGET="_HIST111">THE ANCIENT WORLD</A></TD>
98
+ <TD NOWRAP><TT>F</TD>
99
+ <TD NOWRAP><TT>1130-1220</TD>
100
+ <TD NOWRAP><TT><A HREF="http://www.washington.edu/students/maps/map.cgi?CDH" TARGET="_CDH">CDH</A> 223B</TD>
101
+ <TD NOWRAP><TT>&nbsp;</TD>
102
+ <TD><TT>&nbsp;</TT></TD>
103
+ </TR>
104
+ <TR>
105
+ <TD ALIGN=center><TT><A HREF='https://sdb.admin.washington.edu/timeschd/UWNetID/sln.asp?QTRYR=AUT+2009&SLN=12271' TARGET="_blank">12271</A> </TD>
106
+ <TD NOWRAP><TT>CSE&nbsp;&nbsp;&nbsp; 322 A </TD>
107
+ <td align='center'><tt>LC</td>
108
+ <TD ALIGN=center><TT>3.0 </TD>
109
+ <TD><TT><A HREF="http://www.washington.edu/students/crscat/cse.html#cse322" TARGET="_CSE322">INTRO FORMAL MODELS</A></TD>
110
+ <TD NOWRAP><TT>MWF</TD>
111
+ <TD NOWRAP><TT>&nbsp;930-1020</TD>
112
+ <TD NOWRAP><TT><A HREF="http://www.washington.edu/students/maps/map.cgi?EEB" TARGET="_EEB">EEB</A> 037</TD>
113
+ <TD NOWRAP><TT>BEAME,PAUL W.</TD>
114
+ <TD><TT><A HREF='http://digital.lib.washington.edu/php/currics/service.php?curric=CSE&sln=12271&quarter=autumn&year=2009' TARGET='_new'>Researching? Start here</A>&nbsp;</TT></TD>
115
+ </TR>
116
+ <TR></TR>
117
+ <TR>
118
+ <!-- MODIFIED SYNTAX BELOW TO FAIL TEST -->
119
+ <TD ALIGN=right COLSPAN=4><TT>Total creditos: 8.0&nbsp;</TD>
120
+ </TR>
121
+ </TABLE>
122
+ <TABLE BORDER="0" WIDTH="100%">
123
+ <TR><TD><BIG><A HREF="https://sdb.admin.washington.edu/textbooks/query.asp?qtr=Autumn&sln1=14368&sln2=14372&sln3=12271" TARGET="_tb">Display Textbooks</A></BIG></TD>
124
+ <td>&nbsp;&nbsp;<BIG> <A HREF="https://sdb.admin.washington.edu/students/UWNetID/examschedule.asp?Q=4">Display Final Exam Schedule</A></BIG></TD></TR></TABLE>
125
+ <span class='noprint'><p><center>
126
+ <table border='0' cellpadding='4' bgcolor='yellow' width='80%'><tr><td>
127
+
128
+ <table border='0' cellpadding='5' cellspacing='0' bgcolor='white' width='100%'><tr>
129
+ <td><img src='/sdb_library/images/caution.gif' width='30' height='30' hspace='10'></td>
130
+ <td>
131
+ To protect your privacy and prevent unauthorized use,
132
+ &nbsp;<a href='http://www.washington.edu/computing/weblogin/logout.html' target='_logout'>close
133
+ <b>ALL</b> of your web browser windows</a>
134
+ and web-enabled applications when you finish.
135
+ </td>
136
+ </tr></table>
137
+
138
+ </td></tr></table>
139
+ </center></p></span>
140
+ <P></P>
141
+ <table border='0' cellpadding='0' cellspacing='0' align='center' width='100%'>
142
+ <tr>
143
+ <td rowspan='2'>
144
+ <a href='http://www.washington.edu/'><img src='/sdb_library/images/footersealW.gif' border='0' height='48' width='48' hspace='5' vspace='7' alt='UW Seal'></a>
145
+ </td>
146
+ <td rowspan='3' bgcolor='#666666' width='5'><img src='/sdb_library/images/1px_transparent.gif' width='7' height='1'></td>
147
+ <td colspan='2' bgcolor='#666666' height='1'><img src='/sdb_library/images/1px_transparent.gif' width='1' height='1'></td>
148
+ </tr><tr>
149
+ <td width='100%'>
150
+ <table border='0' width='100%'>
151
+ <tr>
152
+ <td valign='top'><address>
153
+ Office of the Registrar<br>
154
+ regoff@u.washington.edu<br>
155
+ June 27, 2009
156
+ </address>
157
+ </td>
158
+ </tr>
159
+ </table>
160
+ </td>
161
+ </tr><tr height='1'>
162
+ <td bgcolor='#666666'><img src='/sdb_library/images/1px_transparent.gif' width='1' height='1'></td>
163
+ </tr>
164
+ </table>
165
+
166
+ </BODY>
167
+ </HTML>
@@ -0,0 +1,130 @@
1
+ <HTML>
2
+ <HEAD>
3
+ <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
4
+ <TITLE>Class Schedule</TITLE>
5
+ <LINK REL="stylesheet" TYPE="text/css" HREF="https://www.washington.edu/home/home.css">
6
+ </HEAD>
7
+ <BODY>
8
+ <table border='0' cellpadding='0' cellspacing='0' width='100%' align='center'>
9
+ <tr>
10
+ <td width='100%' class='rpad'>
11
+ <a href='http://www.washington.edu/' target='_top'><img src='/sdb_library/images/uwlogo150p.gif' border='0' width='150' height='28' alt='University of Washington'></a>
12
+ </td>
13
+ <td rowspan='2' valign='bottom'>
14
+
15
+ <table border='0' cellpadding='0' cellspacing='0'>
16
+ <tr><td colspan='2' bgcolor='#666666'><img src='/sdb_library/images/1px_transparent.gif' height='1'></td></tr>
17
+ <tr>
18
+ <td bgcolor='#666666'><img src='/sdb_library/images/1px_transparent.gif' width='7' height='1'></td>
19
+ <td nowrap><span class='l1text'>
20
+ &nbsp;<font color='#9999cc' face='tahoma,sans-serif,arial,helvetica' style='font-size:110%'><b>Student Personal Services</b></font>&nbsp;<span class='noprint'> | <a href='/students/logout.asp'>Logout</a>&nbsp;</span> </span></td>
21
+ </tr>
22
+ </table>
23
+
24
+ </td>
25
+ </tr>
26
+ <tr>
27
+ <td bgcolor='#666666'><img src='/sdb_library/images/1px_transparent.gif' height='1'></td>
28
+ </tr>
29
+ </table>
30
+ <table border='0' cellpadding='0' cellspacing='0' width='100%'>
31
+ <tr>
32
+ <td bgcolor='#e6e6e6'><img src='/sdb_library/images/1px_transparent.gif' width='1' height='5'></TD>
33
+ </tr>
34
+ </table>
35
+ <span class='noprint'>
36
+ <table border='0' cellpadding='0' cellspacing='0'>
37
+ <tr>
38
+ <td nowrap>&#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/register.asp' CLASS='barnav'><font color='#333399'>Registration</font></a></td>
39
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/grades.asp' CLASS='barnav'><font color='#333399'>Grade Inquiry</font></a></td>
40
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/dars.asp' CLASS='barnav'><font color='#333399'>DARS - Degree Audit</font></a></td>
41
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/finaidstatus.asp' CLASS='barnav'><font color='#333399'>Financial Aid Status</font></a></td>
42
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/sisStudents/uwnetid/tuition.aspx' CLASS='barnav'><font color='#333399'>Tuition Statement</font></a></td>
43
+ </tr>
44
+ <tr>
45
+ <td nowrap>&#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/schedule.asp' CLASS='barnav'><font color='#333399'><b>Class Schedule</b></font></a></td>
46
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/unofficial.asp' CLASS='barnav'><font color='#333399'>Unofficial Transcript</font></a></td>
47
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/address.asp' CLASS='barnav'><font color='#333399'>Change of Address</font></a></td>
48
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/emt.asp' CLASS='barnav'><font color='#333399'>Direct Deposit Transfer</font></a></td>
49
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/ccpay.asp' CLASS='barnav'><font color='#333399'>Credit Card Payment</font></a></td>
50
+ </tr>
51
+ <tr>
52
+ <td nowrap>&#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/vschedule.asp' CLASS='barnav'><font color='#333399'>Visual Schedule</font></a></td>
53
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/official.asp' CLASS='barnav'><font color='#333399'>Official Transcript</font></a></td>
54
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/op_charges.asp' CLASS='barnav'><font color='#333399'>Insurance/Optional Charges</font></a></td>
55
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/shorttermloan.asp' CLASS='barnav'><font color='#333399'>Short-Term Loan</font></a></td>
56
+ </table>
57
+ </span>
58
+ <H1>Class Schedule - Autumn 2009</H1>
59
+ <P><TABLE BORDER=0 CELLPADDING=2>
60
+ <TR><TH ALIGN=left>Prepared for:</TH><TD>Some Fake Guy </TD></TR>
61
+ <TR><TH ALIGN=left>Date prepared:</TH><TD>June 27, 2009</TD></TR>
62
+ </TABLE>
63
+ <BR>
64
+ <TABLE BORDER='1' CELLPADDING='3'>
65
+ <TR BGCOLOR="#d0d0d0">
66
+ <TH ROWSPAN=2>SLN</TH>
67
+ <TH ROWSPAN=2>Course</TH>
68
+ <TH ROWSPAN=2>Type</TH>
69
+ <TH ROWSPAN=2>Credits</TH>
70
+ <TH ROWSPAN=2>Title</TH>
71
+ <TH COLSPAN=4>Meetings</TH>
72
+ <TH ROWSPAN="2">More<BR>Information</TH>
73
+ </TR>
74
+ <TR BGCOLOR="#d0d0d0">
75
+ <TH>Days</TH>
76
+ <TH>Time</TH>
77
+ <TH>Location</TH>
78
+ <TH>Instructor</TH>
79
+ </TR>
80
+ <TR></TR>
81
+ <TR>
82
+ <TD ALIGN=right COLSPAN=4><TT>Total credits: 8.0&nbsp;</TD>
83
+ </TR>
84
+ </TABLE>
85
+ <TABLE BORDER="0" WIDTH="100%">
86
+ <TR><TD><BIG><A HREF="https://sdb.admin.washington.edu/textbooks/query.asp?qtr=Autumn&sln1=14368&sln2=14372&sln3=12271" TARGET="_tb">Display Textbooks</A></BIG></TD>
87
+ <td>&nbsp;&nbsp;<BIG> <A HREF="https://sdb.admin.washington.edu/students/UWNetID/examschedule.asp?Q=4">Display Final Exam Schedule</A></BIG></TD></TR></TABLE>
88
+ <span class='noprint'><p><center>
89
+ <table border='0' cellpadding='4' bgcolor='yellow' width='80%'><tr><td>
90
+
91
+ <table border='0' cellpadding='5' cellspacing='0' bgcolor='white' width='100%'><tr>
92
+ <td><img src='/sdb_library/images/caution.gif' width='30' height='30' hspace='10'></td>
93
+ <td>
94
+ To protect your privacy and prevent unauthorized use,
95
+ &nbsp;<a href='http://www.washington.edu/computing/weblogin/logout.html' target='_logout'>close
96
+ <b>ALL</b> of your web browser windows</a>
97
+ and web-enabled applications when you finish.
98
+ </td>
99
+ </tr></table>
100
+
101
+ </td></tr></table>
102
+ </center></p></span>
103
+ <P></P>
104
+ <table border='0' cellpadding='0' cellspacing='0' align='center' width='100%'>
105
+ <tr>
106
+ <td rowspan='2'>
107
+ <a href='http://www.washington.edu/'><img src='/sdb_library/images/footersealW.gif' border='0' height='48' width='48' hspace='5' vspace='7' alt='UW Seal'></a>
108
+ </td>
109
+ <td rowspan='3' bgcolor='#666666' width='5'><img src='/sdb_library/images/1px_transparent.gif' width='7' height='1'></td>
110
+ <td colspan='2' bgcolor='#666666' height='1'><img src='/sdb_library/images/1px_transparent.gif' width='1' height='1'></td>
111
+ </tr><tr>
112
+ <td width='100%'>
113
+ <table border='0' width='100%'>
114
+ <tr>
115
+ <td valign='top'><address>
116
+ Office of the Registrar<br>
117
+ regoff@u.washington.edu<br>
118
+ June 27, 2009
119
+ </address>
120
+ </td>
121
+ </tr>
122
+ </table>
123
+ </td>
124
+ </tr><tr height='1'>
125
+ <td bgcolor='#666666'><img src='/sdb_library/images/1px_transparent.gif' width='1' height='1'></td>
126
+ </tr>
127
+ </table>
128
+
129
+ </BODY>
130
+ </HTML>
@@ -0,0 +1,169 @@
1
+ <HTML>
2
+ <HEAD>
3
+ <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
4
+ <TITLE>Class Schedule</TITLE>
5
+ <LINK REL="stylesheet" TYPE="text/css" HREF="https://www.washington.edu/home/home.css">
6
+ </HEAD>
7
+ <BODY>
8
+ <table border='0' cellpadding='0' cellspacing='0' width='100%' align='center'>
9
+ <tr>
10
+ <td width='100%' class='rpad'>
11
+ <a href='http://www.washington.edu/' target='_top'><img src='/sdb_library/images/uwlogo150p.gif' border='0' width='150' height='28' alt='University of Washington'></a>
12
+ </td>
13
+ <td rowspan='2' valign='bottom'>
14
+
15
+ <table border='0' cellpadding='0' cellspacing='0'>
16
+ <tr><td colspan='2' bgcolor='#666666'><img src='/sdb_library/images/1px_transparent.gif' height='1'></td></tr>
17
+ <tr>
18
+ <td bgcolor='#666666'><img src='/sdb_library/images/1px_transparent.gif' width='7' height='1'></td>
19
+ <td nowrap><span class='l1text'>
20
+ &nbsp;<font color='#9999cc' face='tahoma,sans-serif,arial,helvetica' style='font-size:110%'><b>Student Personal Services</b></font>&nbsp;<span class='noprint'> | <a href='/students/logout.asp'>Logout</a>&nbsp;</span> </span></td>
21
+ </tr>
22
+ </table>
23
+
24
+ </td>
25
+ </tr>
26
+ <tr>
27
+ <td bgcolor='#666666'><img src='/sdb_library/images/1px_transparent.gif' height='1'></td>
28
+ </tr>
29
+ </table>
30
+ <table border='0' cellpadding='0' cellspacing='0' width='100%'>
31
+ <tr>
32
+ <td bgcolor='#e6e6e6'><img src='/sdb_library/images/1px_transparent.gif' width='1' height='5'></TD>
33
+ </tr>
34
+ </table>
35
+ <span class='noprint'>
36
+ <table border='0' cellpadding='0' cellspacing='0'>
37
+ <tr>
38
+ <td nowrap>&#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/register.asp' CLASS='barnav'><font color='#333399'>Registration</font></a></td>
39
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/grades.asp' CLASS='barnav'><font color='#333399'>Grade Inquiry</font></a></td>
40
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/dars.asp' CLASS='barnav'><font color='#333399'>DARS - Degree Audit</font></a></td>
41
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/finaidstatus.asp' CLASS='barnav'><font color='#333399'>Financial Aid Status</font></a></td>
42
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/sisStudents/uwnetid/tuition.aspx' CLASS='barnav'><font color='#333399'>Tuition Statement</font></a></td>
43
+ </tr>
44
+ <tr>
45
+ <td nowrap>&#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/schedule.asp' CLASS='barnav'><font color='#333399'><b>Class Schedule</b></font></a></td>
46
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/unofficial.asp' CLASS='barnav'><font color='#333399'>Unofficial Transcript</font></a></td>
47
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/address.asp' CLASS='barnav'><font color='#333399'>Change of Address</font></a></td>
48
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/emt.asp' CLASS='barnav'><font color='#333399'>Direct Deposit Transfer</font></a></td>
49
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/ccpay.asp' CLASS='barnav'><font color='#333399'>Credit Card Payment</font></a></td>
50
+ </tr>
51
+ <tr>
52
+ <td nowrap>&#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/vschedule.asp' CLASS='barnav'><font color='#333399'>Visual Schedule</font></a></td>
53
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/official.asp' CLASS='barnav'><font color='#333399'>Official Transcript</font></a></td>
54
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/op_charges.asp' CLASS='barnav'><font color='#333399'>Insurance/Optional Charges</font></a></td>
55
+ <td nowrap> &nbsp; &#183; <a href='https://sdb.admin.washington.edu/students/uwnetid/shorttermloan.asp' CLASS='barnav'><font color='#333399'>Short-Term Loan</font></a></td>
56
+ </table>
57
+ </span>
58
+ <H1>Class Schedule - Autumn 2009</H1>
59
+ <P><TABLE BORDER=0 CELLPADDING=2>
60
+ <TR><TH ALIGN=left>Prepared for:</TH><TD>Some Fake Guy </TD></TR>
61
+ <TR><TH ALIGN=left>Date prepared:</TH><TD>June 27, 2009</TD></TR>
62
+ </TABLE>
63
+ <BR>
64
+ <TABLE BORDER='1' CELLPADDING='3'>
65
+ <TR BGCOLOR="#d0d0d0">
66
+ <TH ROWSPAN=2>SLN</TH>
67
+ <TH ROWSPAN=2>Course</TH>
68
+ <TH ROWSPAN=2>Type</TH>
69
+ <TH ROWSPAN=2>Credits</TH>
70
+ <TH ROWSPAN=2>Title</TH>
71
+ <TH COLSPAN=4>Meetings</TH>
72
+ <TH ROWSPAN="2">More<BR>Information</TH>
73
+ </TR>
74
+ <TR BGCOLOR="#d0d0d0">
75
+ <TH>Days</TH>
76
+ <TH>Time</TH>
77
+ <TH>Location</TH>
78
+ <TH>Instructor</TH>
79
+ </TR>
80
+ <TR>
81
+ <TD ALIGN=center><TT><A HREF='https://sdb.admin.washington.edu/timeschd/UWNetID/sln.asp?QTRYR=AUT+2009&SLN=14368' TARGET="_blank">14368</A> </TD>
82
+ <TD NOWRAP><TT>HIST&nbsp;&nbsp; 111 A </TD>
83
+ <td align='center'><tt>LC</td>
84
+ <TD ALIGN=center><TT>5.0 </TD>
85
+ <TD><TT><A HREF="http://www.washington.edu/students/crscat/hist.html#hist111" TARGET="_HIST111">THE ANCIENT WORLD</A></TD>
86
+ <TD NOWRAP><TT>MTWTh</TD>
87
+ <TD NOWRAP><TT>&nbsp;130-&nbsp;220</TD>
88
+ <TD NOWRAP><TT><A HREF="http://www.washington.edu/students/maps/map.cgi?SMI" TARGET="_SMI">SMI</A> 120</TD>
89
+ <TD NOWRAP><TT><A HREF="http://www.washington.edu/students/icd/S/hist/111jwalker.html" TARGET="_WALKER,JOEL T">WALKER,JOEL T</A></TD>
90
+ <TD><TT><A HREF='https://catalysttools.washington.edu/workspace/jwalker/6138' TARGET='_new'>Class Web Site</A><BR><A HREF='http://digital.lib.washington.edu/php/currics/service.php?curric=HIST&sln=14368&quarter=autumn&year=2009' TARGET='_new'>Researching? Start here</A>&nbsp;</TT></TD>
91
+ </TR>
92
+ <TR>
93
+ <TD ALIGN=center><TT><A HREF='https://sdb.admin.washington.edu/timeschd/UWNetID/sln.asp?QTRYR=AUT+2009&SLN=14372' TARGET="_blank">14372</A> </TD>
94
+ <TD NOWRAP><TT>HIST&nbsp;&nbsp; 111 AD </TD>
95
+ <td align='center'><tt>QZ</td>
96
+ <TD ALIGN=center><TT>0.0 </TD>
97
+ <TD><TT><A HREF="http://www.washington.edu/students/crscat/hist.html#hist111" TARGET="_HIST111">THE ANCIENT WORLD</A></TD>
98
+ <TD NOWRAP><TT>F</TD>
99
+ <TD NOWRAP><TT>1130-1220</TD>
100
+ <TD NOWRAP><TT><A HREF="http://www.washington.edu/students/maps/map.cgi?CDH" TARGET="_CDH">CDH</A> 223B</TD>
101
+ <TD NOWRAP><TT>&nbsp;</TD>
102
+ <TD><TT>&nbsp;</TT></TD>
103
+ </TR>
104
+ <TR>
105
+ <TD ALIGN=center><TT><A HREF='https://sdb.admin.washington.edu/timeschd/UWNetID/sln.asp?QTRYR=AUT+2009&SLN=12271' TARGET="_blank">12271</A> </TD>
106
+ <TD NOWRAP><TT>CSE&nbsp;&nbsp;&nbsp; 322 A </TD>
107
+ <td align='center'><tt>LC</td>
108
+ <TD ALIGN=center><TT>3.0 </TD>
109
+ <TD><TT><A HREF="http://www.washington.edu/students/crscat/cse.html#cse322" TARGET="_CSE322">INTRO FORMAL MODELS</A></TD>
110
+ <TD NOWRAP><TT>MWF</TD>
111
+ <TD NOWRAP><TT>&nbsp;930-1020</TD>
112
+ <TD NOWRAP><TT><A HREF="http://www.washington.edu/students/maps/map.cgi?EEB" TARGET="_EEB">EEB</A> 037</TD>
113
+ <TD NOWRAP><TT>BEAME,PAUL W.</TD>
114
+ <TD><TT><A HREF='http://digital.lib.washington.edu/php/currics/service.php?curric=CSE&sln=12271&quarter=autumn&year=2009' TARGET='_new'>Researching? Start here</A>&nbsp;</TT></TD>
115
+ </TR>
116
+ <TR></TR>
117
+ <TR>
118
+ <!--
119
+ Commented out for test
120
+ <TD ALIGN=right COLSPAN=4><TT>Total credits: 8.0&nbsp;</TD>
121
+ -->
122
+ </TR>
123
+ </TABLE>
124
+ <TABLE BORDER="0" WIDTH="100%">
125
+ <TR><TD><BIG><A HREF="https://sdb.admin.washington.edu/textbooks/query.asp?qtr=Autumn&sln1=14368&sln2=14372&sln3=12271" TARGET="_tb">Display Textbooks</A></BIG></TD>
126
+ <td>&nbsp;&nbsp;<BIG> <A HREF="https://sdb.admin.washington.edu/students/UWNetID/examschedule.asp?Q=4">Display Final Exam Schedule</A></BIG></TD></TR></TABLE>
127
+ <span class='noprint'><p><center>
128
+ <table border='0' cellpadding='4' bgcolor='yellow' width='80%'><tr><td>
129
+
130
+ <table border='0' cellpadding='5' cellspacing='0' bgcolor='white' width='100%'><tr>
131
+ <td><img src='/sdb_library/images/caution.gif' width='30' height='30' hspace='10'></td>
132
+ <td>
133
+ To protect your privacy and prevent unauthorized use,
134
+ &nbsp;<a href='http://www.washington.edu/computing/weblogin/logout.html' target='_logout'>close
135
+ <b>ALL</b> of your web browser windows</a>
136
+ and web-enabled applications when you finish.
137
+ </td>
138
+ </tr></table>
139
+
140
+ </td></tr></table>
141
+ </center></p></span>
142
+ <P></P>
143
+ <table border='0' cellpadding='0' cellspacing='0' align='center' width='100%'>
144
+ <tr>
145
+ <td rowspan='2'>
146
+ <a href='http://www.washington.edu/'><img src='/sdb_library/images/footersealW.gif' border='0' height='48' width='48' hspace='5' vspace='7' alt='UW Seal'></a>
147
+ </td>
148
+ <td rowspan='3' bgcolor='#666666' width='5'><img src='/sdb_library/images/1px_transparent.gif' width='7' height='1'></td>
149
+ <td colspan='2' bgcolor='#666666' height='1'><img src='/sdb_library/images/1px_transparent.gif' width='1' height='1'></td>
150
+ </tr><tr>
151
+ <td width='100%'>
152
+ <table border='0' width='100%'>
153
+ <tr>
154
+ <td valign='top'><address>
155
+ Office of the Registrar<br>
156
+ regoff@u.washington.edu<br>
157
+ June 27, 2009
158
+ </address>
159
+ </td>
160
+ </tr>
161
+ </table>
162
+ </td>
163
+ </tr><tr height='1'>
164
+ <td bgcolor='#666666'><img src='/sdb_library/images/1px_transparent.gif' width='1' height='1'></td>
165
+ </tr>
166
+ </table>
167
+
168
+ </BODY>
169
+ </HTML>
@@ -23,5 +23,10 @@ class MyUWTest < Test::Unit::TestCase
23
23
  assert @myuw.session
24
24
  assert @myuw.session.kind_of?(MyUW::Session)
25
25
  end
26
+
27
+ should "initialize the schedule object" do
28
+ assert @myuw.schedule
29
+ assert @myuw.schedule.kind_of?(MyUW::Schedule)
30
+ end
26
31
  end
27
32
  end
@@ -0,0 +1,132 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper')
2
+
3
+ class MockedScheduleTest < Test::Unit::TestCase
4
+ context "fetching a person's schedule" do
5
+ setup do
6
+ @myuw = MyUW.new
7
+ @myuw.stubs(:logged_in?).returns(true)
8
+ @browser = @myuw.browser
9
+ @browser.follow_meta_refresh = false
10
+ @schedule = @myuw.schedule
11
+
12
+ @courses = [
13
+ {
14
+ :sln => "14368",
15
+ :course => "HIST 111 A",
16
+ :type => "LC",
17
+ :credits => "5.0",
18
+ :title => "THE ANCIENT WORLD",
19
+ :days => "MTWTh",
20
+ :time => "130-220",
21
+ :location => "SMI 120",
22
+ :instructor => "WALKER,JOEL T"
23
+ },
24
+ {
25
+ :sln => "14372"
26
+ },
27
+ {
28
+ :sln => "12271"
29
+ }
30
+ ]
31
+ end
32
+
33
+ should "raise NotLoggedInError if not logged in and fetching schedule" do
34
+ @myuw.expects(:logged_in?).returns(false)
35
+
36
+ assert_raise MyUW::NotLoggedInError do
37
+ @myuw.schedule.schedule
38
+ end
39
+ end
40
+
41
+ should "raise InvalidPageError if there are no courses in the table" do
42
+ fixture_page = @browser.get(path_to_html("schedule_empty"))
43
+ @browser.expects(:get).returns(fixture_page)
44
+
45
+ assert_raise MyUW::InvalidPageError do
46
+ @schedule.schedule
47
+ end
48
+ end
49
+
50
+ should "get the courses" do
51
+ fixture_page = @browser.get(path_to_html("schedule"))
52
+ @browser.expects(:get).returns(fixture_page)
53
+
54
+ assert_nothing_raised { @schedule.schedule }
55
+ assert @schedule.courses
56
+ assert_equal @courses.length, @schedule.courses.length
57
+
58
+ @courses.each_index do |i|
59
+ course = @courses[i]
60
+
61
+ course.each do |k, v|
62
+ assert_equal v, @schedule.courses[i][k]
63
+ end
64
+ end
65
+ end
66
+ end
67
+
68
+ context "fetching a person's credits" do
69
+ setup do
70
+ @myuw = MyUW.new
71
+ @myuw.stubs(:logged_in?).returns(true)
72
+ @browser = @myuw.browser
73
+ @browser.follow_meta_refresh = false
74
+ @schedule = @myuw.schedule
75
+ end
76
+
77
+ should "raise InvalidPageError if the credit row is missing" do
78
+ fixture_page = @browser.get(path_to_html("schedule_no_credit_row"))
79
+ @browser.expects(:get).returns(fixture_page)
80
+
81
+ assert_raise MyUW::InvalidPageError do
82
+ @schedule.schedule
83
+ end
84
+ end
85
+
86
+ should "raise InvalidPageError if the credit row is in a different syntax" do
87
+ fixture_page = @browser.get(path_to_html("schedule_diff_credit_row"))
88
+ @browser.expects(:get).returns(fixture_page)
89
+
90
+ assert_raise MyUW::InvalidPageError do
91
+ @schedule.schedule
92
+ end
93
+ end
94
+
95
+ should "get the credits" do
96
+ fixture_page = @browser.get(path_to_html("schedule"))
97
+ @browser.expects(:get).returns(fixture_page)
98
+
99
+ assert_nothing_raised { @schedule.schedule }
100
+ assert @schedule.credits
101
+ assert_equal 8.0, @schedule.credits
102
+ end
103
+ end
104
+
105
+ context "fetching precached values for a schedule" do
106
+ setup do
107
+ @myuw = MyUW.new
108
+ @myuw.stubs(:logged_in?).returns(true)
109
+ @browser = @myuw.browser
110
+ @browser.follow_meta_refresh = false
111
+ @schedule = @myuw.schedule
112
+
113
+ # Fetch them once
114
+ fixture_page = @browser.get(path_to_html("schedule"))
115
+ @browser.expects(:get).returns(fixture_page)
116
+
117
+ assert_nothing_raised { @schedule.schedule }
118
+ end
119
+
120
+ should "not call any helper methods when getting schedule" do
121
+ @browser.expects(:get).never
122
+
123
+ @schedule.schedule
124
+ end
125
+
126
+ should "not call any helper methods when getting credits" do
127
+ @schedule.expects(:schedule).never
128
+
129
+ @schedule.credits
130
+ end
131
+ end
132
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mitchellh-rubyuw
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mitchell Hashimoto
@@ -37,9 +37,11 @@ files:
37
37
  - VERSION
38
38
  - lib/myuw.rb
39
39
  - lib/myuw/errors.rb
40
+ - lib/myuw/schedule.rb
40
41
  - lib/myuw/session.rb
41
42
  - lib/myuw/sln.rb
42
43
  - rubyuw.gemspec
44
+ - test/live/schedule_test.rb
43
45
  - test/live/session_test.rb
44
46
  - test/live/sln_test.rb
45
47
  - test/live/test_helper.rb
@@ -49,10 +51,15 @@ files:
49
51
  - test/mocked/fixture_pages/no_form_login.html
50
52
  - test/mocked/fixture_pages/no_login_button.html
51
53
  - test/mocked/fixture_pages/not_logged_in_relay.html
54
+ - test/mocked/fixture_pages/schedule.html
55
+ - test/mocked/fixture_pages/schedule_diff_credit_row.html
56
+ - test/mocked/fixture_pages/schedule_empty.html
57
+ - test/mocked/fixture_pages/schedule_no_credit_row.html
52
58
  - test/mocked/fixture_pages/sln_does_not_exist.html
53
59
  - test/mocked/fixture_pages/sln_status.html
54
60
  - test/mocked/fixture_pages/welcome.html
55
61
  - test/mocked/myuw_test.rb
62
+ - test/mocked/schedule_test.rb
56
63
  - test/mocked/session_test.rb
57
64
  - test/mocked/sln_test.rb
58
65
  - test/mocked/test_helper.rb
@@ -84,10 +91,12 @@ signing_key:
84
91
  specification_version: 2
85
92
  summary: Library which provides a ruby interface to the University of Washington student portal.
86
93
  test_files:
94
+ - test/live/schedule_test.rb
87
95
  - test/live/session_test.rb
88
96
  - test/live/sln_test.rb
89
97
  - test/live/test_helper.rb
90
98
  - test/mocked/myuw_test.rb
99
+ - test/mocked/schedule_test.rb
91
100
  - test/mocked/session_test.rb
92
101
  - test/mocked/sln_test.rb
93
102
  - test/mocked/test_helper.rb