Skip to content

Commit 92634aa

Browse files
authored
Merge pull request #1190 from DaanVanVugt/bugfix/han_to_event
change han from materials to events
2 parents 8e11ae8 + 919f35a commit 92634aa

3 files changed

Lines changed: 1494 additions & 31 deletions

File tree

lib/ingestors/taxila/han_ingestor.rb

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ module Taxila
77
class HanIngestor < Ingestor
88
def self.config
99
{
10-
key: 'han_material',
11-
title: 'HAN Materials API',
12-
category: :materials
10+
key: 'han_event',
11+
title: 'HAN Events API',
12+
category: :events
1313
}
1414
end
1515

@@ -29,17 +29,53 @@ def read(url)
2929
def process_han(_url)
3030
url = 'https://www.han.nl/studeren/scholing-voor-werkenden/laboratorium/'
3131

32-
material_page = Nokogiri::HTML5.parse(open_url(url.to_s, raise: true)).css('#content > .section--cards-skinny > .section-wrapper > .section__content > .cards-skinny > .cards-skinny-wrapper > .cards-skinny__item > .card-skinny > .card-skinny__content')
33-
material_page.each_with_index do |el, _idx|
34-
material = OpenStruct.new
35-
material.title = el.css('.card-skinny__content__title').first.text
36-
material.url = "https://www.han.nl#{el.css('.card-skinny__content__buttons > .buttons > .buttons__button > a').first.get_attribute('href')}"
37-
material.description = el.css('.card-skinny__content__body').first.text
38-
add_material(material)
32+
event_page = Nokogiri::HTML5.parse(open_url(url.to_s, raise: true)).css('#content > .section--cards-skinny > .section-wrapper > .section__content > .cards-skinny > .cards-skinny-wrapper > .cards-skinny__item > .card-skinny > .card-skinny__content')
33+
event_page.each_with_index do |el, _idx|
34+
event = OpenStruct.new
35+
event.title = el.css('.card-skinny__content__title').first.text
36+
event.url = "https://www.han.nl#{el.css('.card-skinny__content__buttons > .buttons > .buttons__button > a').first.get_attribute('href')}"
37+
event.description = el.css('.card-skinny__content__body').first.text
38+
39+
sleep(1) unless Rails.env.test? and File.exist?('test/vcr_cassettes/ingestors/han.yml')
40+
event_page2 = Nokogiri::HTML5.parse(open_url(event.url.to_s, raise: true))
41+
start_str = event_page2.css("div[class='course-superhero__payoff__content']")[0].css('p > span.course-superhero__payoff__subtitle')[0].text
42+
start_str = convert_months(start_str)
43+
event.start = Time.zone.parse(start_str.split('en')[0].strip)
44+
event.end = event.start
45+
event.set_default_times
46+
47+
course_details = event_page2.css("div[class='course-details__sidebar__item']")[0]
48+
venue_sub_css = course_details.css("span[class='nav-subswitch__title__label__sub']")[0]
49+
venue_super_css = venue_sub_css.parent.css("strong.nav-subswitch__title__label__super")[0]
50+
event.venue = "#{venue_super_css.text} #{venue_sub_css.text}"
51+
event.source = "HAN"
52+
event.timezone = 'Amsterdam'
53+
54+
add_event(event)
3955
rescue Exception => e
4056
@messages << "Extract event fields failed with: #{e.message}"
4157
end
4258
end
59+
60+
def convert_months(my_str)
61+
{
62+
'januari': 'january',
63+
'februari': 'february',
64+
'maart': 'march',
65+
'april': 'april',
66+
'mei': 'may',
67+
'juni': 'june',
68+
'juli': 'july',
69+
'augustus': 'august',
70+
'september': 'september',
71+
'oktober': 'october',
72+
'november': 'november',
73+
'december': 'december',
74+
}.each do |key, value|
75+
my_str = my_str.gsub(key.to_s, value.to_s)
76+
end
77+
my_str
78+
end
4379
end
4480
end
45-
end
81+
end

test/unit/ingestors/taxila/han_ingestor_test.rb

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class HanIngestorTest < ActiveSupport::TestCase
1212
reset_timezone
1313
end
1414

15-
test 'can ingest materials from han' do
15+
test 'can ingest events from han' do
1616
source = @content_provider.sources.build(
1717
url: 'https://www.han.nl/studeren/scholing-voor-werkenden/laboratorium/',
1818
method: 'han',
@@ -21,13 +21,13 @@ class HanIngestorTest < ActiveSupport::TestCase
2121

2222
ingestor = Ingestors::Taxila::HanIngestor.new
2323

24-
# check materials don't exist
24+
# check events don't exist
2525
new_title = 'Synthetiseren en Karakteriseren van Moleculen'
2626
new_url = 'https://www.han.nl/opleidingen/module/synthetiseren-karakteriseren-moleculen/'
27-
refute Material.where(title: new_title, url: new_url).any?
27+
refute Event.where(title: new_title, url: new_url).any?
2828

2929
# run task
30-
assert_difference('Material.count', 27) do
30+
assert_difference('Event.count', 15) do
3131
freeze_time(2019) do
3232
VCR.use_cassette('ingestors/han') do
3333
ingestor.read(source.url)
@@ -37,13 +37,15 @@ class HanIngestorTest < ActiveSupport::TestCase
3737
end
3838

3939
# check event does exist
40-
material = Material.where(title: new_title, url: new_url).first
41-
assert material
42-
assert_equal new_title, material.title
43-
assert_equal new_url, material.url
44-
45-
# check other fields
46-
# assert_equal 'Software Carpentry lessons introduce basic lab skills for research computing. They cover three core topics: the Unix shell, version control with Git, and a programming language (Python or R). ',
47-
# material.description
40+
event = Event.where(title: new_title, url: new_url).first
41+
assert event
42+
assert_equal new_title, event.title
43+
assert_equal new_url, event.url
44+
45+
assert_equal 'HAN', event.source
46+
assert_equal 'Amsterdam', event.timezone
47+
assert_equal 'Nijmegen Laan van Scheut 2', event.venue
48+
assert_equal Time.zone.parse('Mon, 1 Feb 2026 09:00:00.000000000 UTC +00:00'), event.start
49+
assert_equal Time.zone.parse('Mon, 1 Feb 2026 17:00:00.000000000 UTC +00:00'), event.end
4850
end
4951
end

test/vcr_cassettes/ingestors/han.yml

Lines changed: 1433 additions & 8 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)