Skip to content

Commit 774e7c4

Browse files
authored
Merge pull request #1274 from ElixirTeSS/ical-bump
icalendar bump + fixes
2 parents 670ee72 + 96e9ddf commit 774e7c4

8 files changed

Lines changed: 45 additions & 109 deletions

File tree

Gemfile.lock

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -230,9 +230,12 @@ GEM
230230
concurrent-ruby (~> 1.0)
231231
i18n_data (0.17.1)
232232
simple_po_parser (~> 1.1)
233-
icalendar (2.9.0)
233+
icalendar (2.12.2)
234+
base64
234235
ice_cube (~> 0.16)
235-
ice_cube (0.16.4)
236+
logger
237+
ostruct
238+
ice_cube (0.17.0)
236239
io-console (0.8.2)
237240
irb (1.15.2)
238241
pp (>= 0.6.0)

lib/ingestors/bioschemas_ingestor.rb

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
module Ingestors
44
class BioschemasIngestor < Ingestor
5+
include Ingestors::Concerns::SitemapHelpers
6+
57
DUMMY_URL = 'https://example.com'
68

79
attr_reader :verbose
@@ -15,27 +17,8 @@ def self.config
1517
end
1618

1719
def read(source_url)
18-
sitemap_regex = nil
1920
@verbose = false
20-
sources = if source_url.downcase.match?(/sitemap(.*)?.xml\Z/)
21-
sitemap_message = "Parsing .xml sitemap: #{source_url}\n"
22-
urls = SitemapParser.new(source_url, {
23-
recurse: true,
24-
url_regex: sitemap_regex,
25-
headers: { 'User-Agent' => config[:user_agent] }
26-
}).to_a.uniq.map(&:strip)
27-
sitemap_message << "\n - #{urls.count} URLs found"
28-
@messages << sitemap_message
29-
urls
30-
elsif source_url.downcase.match?(/sitemap(.*)?.txt\Z/)
31-
sitemap_message = "Parsing .txt sitemap: #{source_url}\n"
32-
urls = open_url(source_url).to_a.uniq.map(&:strip)
33-
sitemap_message << "\n - #{urls.count} URLs found"
34-
@messages << sitemap_message
35-
urls
36-
else
37-
[source_url]
38-
end
21+
sources = parse_sitemap(source_url)
3922

4023
provider_events = []
4124
provider_materials = []

lib/ingestors/concerns/sitemap_helpers.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ module SitemapHelpers
77
private
88

99
# Reads either a sitemap.{xml|txt} or a single URL
10-
# Returns a list of URLs from 1 to n URLs
10+
# Returns a list of URLs from 0 to n URLs
1111
def parse_sitemap(source_url)
1212
case source_url.downcase
1313
when /sitemap(.*)?\.xml\Z/
@@ -28,9 +28,9 @@ def parse_xml_sitemap(url)
2828

2929
log_sitemap('xml', url, urls.count)
3030
urls
31-
rescue StandardError => e
31+
rescue RuntimeError => e # sitemap-parser gem raises RuntimeErrors
3232
@messages << "Extract from sitemap[#{url}] failed with: #{e.message}"
33-
nil
33+
[]
3434
end
3535

3636
def parse_txt_sitemap(url)

lib/ingestors/event_ingestion.rb

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,6 @@ def convert_event_types(input)
2929
EventTypeDictionary.instance.lookup_value(input, 'title')
3030
end
3131

32-
def convert_location(input)
33-
input
34-
end
35-
3632
def parse_dates(input, timezone = nil)
3733
Time.use_zone(timezone) do
3834
# try to split on obvious interval markers

lib/ingestors/ical_ingestor.rb

Lines changed: 31 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
module Ingestors
66
class IcalIngestor < Ingestor
7+
include Ingestors::Concerns::SitemapHelpers
8+
79
def self.config
810
{
911
key: 'ical',
@@ -13,111 +15,63 @@ def self.config
1315
end
1416

1517
def read(url)
16-
unless url.nil?
17-
if url.to_s.downcase.end_with? 'sitemap.xml'
18-
process_sitemap url
19-
else
20-
process_icalendar url
21-
end
18+
sources = parse_sitemap(url)
19+
sources.each do |source|
20+
process_icalendar(source)
2221
end
2322
end
2423

2524
private
2625

27-
def process_sitemap(url)
28-
# find urls for individual icalendar files
29-
begin
30-
sitemap = Nokogiri::XML.parse(open_url(url, raise: true))
31-
locs = sitemap.xpath('/ns:urlset/ns:url/ns:loc', {
32-
'ns' => 'http://www.sitemaps.org/schemas/sitemap/0.9'
33-
})
34-
locs.each do |loc|
35-
process_icalendar(loc.text)
36-
end
37-
rescue Exception => e
38-
@messages << "Extract from sitemap[#{url}] failed with: #{e.message}"
39-
end
40-
41-
# finished
42-
nil
43-
end
44-
4526
def process_icalendar(url)
4627
# process individual ics file
4728
query = '?ical=true'
4829

49-
begin
50-
# append query (if required)
51-
file_url = url
52-
file_url << query unless url.to_s.downcase.ends_with? query
30+
# append query (if required)
31+
file_url = url
32+
file_url << query unless url.to_s.downcase.ends_with? query
5333

54-
# process file
55-
events = Icalendar::Event.parse(open_url(file_url, raise: true).set_encoding('utf-8'))
34+
# process file
35+
data = open_url(file_url)
36+
if data
37+
events = Icalendar::Event.parse(data.set_encoding('utf-8'))
5638

5739
# process each event
58-
events.each do |e|
59-
process_event(e)
40+
events.each do |ical_event|
41+
add_event(process_event(ical_event))
6042
end
61-
rescue Exception => e
62-
@messages << "Process file url[#{file_url}] failed with: #{e.message}"
6343
end
64-
6544
# finished
66-
nil
6745
end
6846

6947
def process_event(calevent)
70-
# puts "calevent: #{calevent.inspect}"
71-
begin
72-
# set fields
73-
event = OpenStruct.new
74-
event.url = calevent.url.to_s
75-
event.title = calevent.summary.to_s
76-
event.description = process_description calevent.description
77-
78-
# puts "\n\ncalevent.description = #{calevent.description}"
79-
# puts "\n\n... converted = #{event.description}"
80-
81-
event.end = calevent.dtend&.to_time
82-
unless calevent.dtstart.nil?
83-
dtstart = calevent.dtstart
84-
event.start = dtstart&.to_time
85-
tzid = dtstart.ical_params['tzid']
86-
event.timezone = tzid.first.to_s if !tzid.nil? and tzid.size > 0
87-
end
48+
# set fields
49+
event = OpenStruct.new
50+
event.url = calevent.url&.to_s
51+
event.title = calevent.summary&.to_s
52+
event.description = process_description(calevent.description)
53+
54+
event.end = calevent.dtend&.to_time
55+
unless calevent.dtstart.nil?
56+
dtstart = calevent.dtstart
57+
event.start = dtstart&.to_time
58+
tzid = dtstart.ical_params['tzid']
59+
event.timezone = tzid.first.to_s if tzid.present?
60+
end
8861

62+
if calevent.location
8963
event.venue = calevent.location.to_s
9064
if calevent.location.downcase.include?('online')
9165
event.online = true
9266
event.city = nil
9367
event.postcode = nil
9468
event.country = nil
95-
else
96-
location = convert_location(calevent.location)
97-
event.city = location['suburb'] unless location['suburb'].nil?
98-
event.country = location['country'] unless location['country'].nil?
99-
event.postcode = location['postcode'] unless location['postcode'].nil?
10069
end
101-
event.keywords = []
102-
unless calevent.categories.nil? or calevent.categories.first.nil?
103-
cats = calevent.categories.first
104-
if cats.is_a?(Icalendar::Values::Array)
105-
cats.each do |item|
106-
event.keywords << item.to_s.lstrip
107-
end
108-
else
109-
event.keywords << cats.to_s.strip
110-
end
111-
end
112-
113-
# store event
114-
@events << event
115-
rescue Exception => e
116-
@messages << "Process iCalendar failed with: #{e.message}"
11770
end
11871

119-
# finished
120-
nil
72+
event.keywords = calevent.categories.flatten.map(&:strip)
73+
74+
event
12175
end
12276

12377
def process_description(input)

lib/ingestors/indico_ingestor.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ def read(source_url)
2121
@token = Rails.application.config.secrets.indico_api_token
2222
@verbose = false
2323
sources = parse_sitemap(source_url)
24-
return if sources.nil?
2524

2625
sources.each do |url|
2726
process_url(url)

test/test_helper.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ class ActiveSupport::TestCase
4848

4949
teardown do
5050
User.current_user = nil
51+
Space.current_space = nil
5152
end
5253

5354
# WARNING: Do not be tempted to include Devise TestHelpers here (e.g. include Devise::TestHelpers)

test/unit/ingestors/ical_ingestor_test.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class IcalIngestorTest < ActiveSupport::TestCase
2626

2727
assert ingestor.events.empty?
2828
assert ingestor.materials.empty?
29-
assert_includes ingestor.messages, 'Extract from sitemap[https://missing.org/sitemap.xml] failed with: 404 '
29+
assert_includes ingestor.messages, 'Extract from sitemap[https://missing.org/sitemap.xml] failed with: HTTP request to https://missing.org/sitemap.xml failed'
3030
end
3131

3232
test 'ingest valid sitemap' do
@@ -68,7 +68,7 @@ class IcalIngestorTest < ActiveSupport::TestCase
6868

6969
# check individual events
7070
# check not found
71-
assert_includes ingestor.messages, "Process file url\[https://pawsey.org.au/events/\?ical=true\] failed with: 404 "
71+
assert_includes ingestor.messages, "Couldn't open URL https://pawsey.org.au/events/?ical=true: 404 "
7272

7373
# check rejected
7474
event = ingestor.events.detect { |e| e.title == 'NVIDIA cuQuantum Session' }

0 commit comments

Comments
 (0)