Class: LSECourses::Course

Inherits:
Object
  • Object
show all
Defined in:
lib/lse_courses/course.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(opts = {}) ⇒ Course

Returns a new instance of Course.



8
9
10
# File 'lib/lse_courses/course.rb', line 8

def initialize(opts = {})
  opts.each { |k, v| instance_variable_set("@#{k}", v) }
end

Instance Attribute Details

#codeObject (readonly)

Returns the value of attribute code.



5
6
7
# File 'lib/lse_courses/course.rb', line 5

def code
  @code
end

#nameObject (readonly) Also known as: title

Returns the value of attribute name.



5
6
7
# File 'lib/lse_courses/course.rb', line 5

def name
  @name
end

#typeObject (readonly)

Returns the value of attribute type.



5
6
7
# File 'lib/lse_courses/course.rb', line 5

def type
  @type
end

#urlObject

Returns the value of attribute url.



6
7
8
# File 'lib/lse_courses/course.rb', line 6

def url
  @url
end

Class Method Details

.all(options = {}) ⇒ Object



198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
# File 'lib/lse_courses/course.rb', line 198

def self.all(options = {})
  defaults = { preload: false }
  options = defaults.merge(options)

  results = []

  course_lists.each_pair do |type, url|
    document = fetch_and_parse(url)
    document.css('table tr td p a').each do |link|
      abstract = link.text.split(" ")

      course_code = abstract.shift
      name = abstract.join(" ")
      course_url = URI.join(URI.parse(url), URI.parse(link['href'])).to_s

      results << self.new(
        url: course_url,
        name: name,
        code: course_code,
        type: type
      )
    end
  end

  results.each(&:fetch_attributes) if options[:preload]
  results
end

.course_listsObject

Class methods



190
191
192
193
194
195
196
# File 'lib/lse_courses/course.rb', line 190

def self.course_lists
  {
    "Undergraduate" => "http://www.lse.ac.uk/resources/calendar/courseGuides/undergraduate.htm",
    "Graduate" => "http://www.lse.ac.uk/resources/calendar/courseGuides/graduate.htm",
    "Research" => "http://www.lse.ac.uk/resources/calendar/courseGuides/research.htm"
  }
end

.fetch_and_parse(url) ⇒ Object



258
259
260
# File 'lib/lse_courses/course.rb', line 258

def self.fetch_and_parse(url)
  Nokogiri::HTML(open(url, &:read), 'UTF-8')
end

.find_by_code(code) ⇒ Object



226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
# File 'lib/lse_courses/course.rb', line 226

def self.find_by_code(code)
  course_lists.each_pair do |type, url|
    document = fetch_and_parse(url)
    document.css('table tr td p a').each do |link|
      abstract = link.text.split(" ")

      course_code = abstract.shift
      name = abstract.join(" ")
      course_url = URI.join(URI.parse(url), URI.parse(link['href'])).to_s

      if code == course_code
        return self.new(
          url: course_url,
          name: name,
          code: course_code,
          type: type
        ).fetch_attributes
      end
    end
  end

  nil
end

.general_course_pageObject



254
255
256
# File 'lib/lse_courses/course.rb', line 254

def self.general_course_page
  @general_course_page ||= open("http://www.lse.ac.uk/resources/calendar/GeneralCourse/coursesNotAvailableToGeneralCStudents.htm").read
end

.join_p_tags(elements) ⇒ Object



250
251
252
# File 'lib/lse_courses/course.rb', line 250

def self.join_p_tags(elements)
  elements.map(&:text).join("\n").strip
end

Instance Method Details

#assessmentsObject



84
85
86
87
88
89
90
91
# File 'lib/lse_courses/course.rb', line 84

def assessments
  if @assessments
    @assessments
  else
    fetch_attributes
    @assessments
  end
end

#availabilityObject



102
103
104
105
106
107
108
109
# File 'lib/lse_courses/course.rb', line 102

def availability
  if @availability
    @availability
  else
    fetch_attributes
    @availability
  end
end

#average_class_sizeObject



66
67
68
69
70
71
72
73
# File 'lib/lse_courses/course.rb', line 66

def average_class_size
  if @average_class_size
    @average_class_size
  else
    fetch_attributes
    @average_class_size
  end
end

#contentObject



120
121
122
123
124
125
126
127
# File 'lib/lse_courses/course.rb', line 120

def content
  if @content
    @content
  else
    fetch_attributes
    @content
  end
end

#departmentObject



48
49
50
51
52
53
54
55
# File 'lib/lse_courses/course.rb', line 48

def department
  if @department
    @department
  else
    fetch_attributes
    @department
  end
end

#fetch_attributesObject



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/lse_courses/course.rb', line 12

def fetch_attributes
  page = self.class.fetch_and_parse(url)
  key_facts = page.css('#keyFacts-Content p')

  @survey = if page.css('#survey-Label').any?
    SurveyResult.new(
      response_rate: page.css('#survey-Label-2 span').text.gsub("Response rate: ", "").gsub("%", "").to_f,
      recommended_by: page.css('#survey-Content-Recommend p')[1].text.gsub("%", "").to_f,
      reading_list: page.css('#survey-Content table tbody td')[1].text.to_f,
      materials: page.css('#survey-Content table tbody td')[3].text.to_f,
      satisfied: page.css('#survey-Content table tbody td')[5].text.to_f,
      lectures: page.css('#survey-Content table tbody td')[7].text.to_f,
      integration: page.css('#survey-Content table tbody td')[9].text.to_f,
      contact: page.css('#survey-Content table tbody td')[11].text.to_f,
      feedback: page.css('#survey-Content table tbody td')[13].text.to_f,
    )
  end

  @code =  page.css('#courseCode').text
  @name = page.css('span#title').text
  @department = key_facts[0].text.gsub("Department: ", "")
  @students = key_facts[1].text.gsub("Total students 2012/13:", "").to_i
  @average_class_size = key_facts[2].text.gsub("Average class size 2012/13: ", "").to_i
  @value = key_facts[3].text.gsub("Value: ", "")
  @assessments = self.class.join_p_tags(page.css('#assessment-Content p'))
  @teachers = self.class.join_p_tags(page.css('#teacherResponsible-Content p'))
  @availability = self.class.join_p_tags(page.css('#availability-Content p'))
  @prerequisites = self.class.join_p_tags(page.css('#preRequisites-Content p'))
  @content = self.class.join_p_tags(page.css('#courseContent-Content p'))
  @teaching = self.class.join_p_tags(page.css('#teaching-Content p'))
  @formative_coursework = self.class.join_p_tags(page.css('#formativeCoursework-Content p'))
  @reading = self.class.join_p_tags(page.css('#indicativeReading-Content p'))

  self
end

#formative_courseworkObject



138
139
140
141
142
143
144
145
# File 'lib/lse_courses/course.rb', line 138

def formative_coursework
  if @formative_coursework
    @formative_coursework
  else
    fetch_attributes
    @formative_coursework
  end
end

#general_course?Boolean Also known as: available_on_general_course?

Checks if this module is available to General Course students

Returns:

  • (Boolean)


178
179
180
# File 'lib/lse_courses/course.rb', line 178

def general_course?
  !self.class.general_course_page.include? code
end

#graduate?Boolean

Returns:

  • (Boolean)


169
170
171
# File 'lib/lse_courses/course.rb', line 169

def graduate?
  type == "Graduate"
end

#prerequisitesObject



111
112
113
114
115
116
117
118
# File 'lib/lse_courses/course.rb', line 111

def prerequisites
  if @prerequisites
    @prerequisites
  else
    fetch_attributes
    @prerequisites
  end
end

#readingObject



147
148
149
150
151
152
153
154
# File 'lib/lse_courses/course.rb', line 147

def reading
  if @reading
    @reading
  else
    fetch_attributes
    @reading
  end
end

#research?Boolean

Returns:

  • (Boolean)


173
174
175
# File 'lib/lse_courses/course.rb', line 173

def research?
  type == "Research"
end

#studentsObject



57
58
59
60
61
62
63
64
# File 'lib/lse_courses/course.rb', line 57

def students
  if @students
    @students
  else
    fetch_attributes
    @students
  end
end

#surveyObject



156
157
158
159
160
161
162
163
# File 'lib/lse_courses/course.rb', line 156

def survey
  if @survey
    @survey
  else
    fetch_attributes
    @survey
  end
end

#survey?Boolean

Returns:

  • (Boolean)


182
183
184
# File 'lib/lse_courses/course.rb', line 182

def survey?
  !!survey
end

#teachersObject



93
94
95
96
97
98
99
100
# File 'lib/lse_courses/course.rb', line 93

def teachers
  if @teachers
    @teachers
  else
    fetch_attributes
    @teachers
  end
end

#teachingObject



129
130
131
132
133
134
135
136
# File 'lib/lse_courses/course.rb', line 129

def teaching
  if @teaching
    @teaching
  else
    fetch_attributes
    @teaching
  end
end

#undergraduate?Boolean

Returns:

  • (Boolean)


165
166
167
# File 'lib/lse_courses/course.rb', line 165

def undergraduate?
  type == "Undergraduate"
end

#valueObject



75
76
77
78
79
80
81
82
# File 'lib/lse_courses/course.rb', line 75

def value
  if @value
    @value
  else
    fetch_attributes
    @value
  end
end