icalendar 2.4.1 → 2.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/main.yml +32 -0
  3. data/.gitignore +1 -0
  4. data/History.txt +39 -0
  5. data/{COPYING → LICENSE} +0 -0
  6. data/README.md +6 -22
  7. data/icalendar.gemspec +17 -18
  8. data/lib/icalendar/alarm.rb +1 -0
  9. data/lib/icalendar/calendar.rb +10 -0
  10. data/lib/icalendar/component.rb +14 -3
  11. data/lib/icalendar/event.rb +3 -0
  12. data/lib/icalendar/has_components.rb +17 -5
  13. data/lib/icalendar/has_properties.rb +27 -19
  14. data/lib/icalendar/journal.rb +2 -0
  15. data/lib/icalendar/marshable.rb +34 -0
  16. data/lib/icalendar/parser.rb +49 -16
  17. data/lib/icalendar/timezone.rb +68 -0
  18. data/lib/icalendar/timezone_store.rb +36 -0
  19. data/lib/icalendar/todo.rb +4 -1
  20. data/lib/icalendar/tzinfo.rb +2 -2
  21. data/lib/icalendar/values/array.rb +1 -2
  22. data/lib/icalendar/values/date.rb +2 -0
  23. data/lib/icalendar/values/date_or_date_time.rb +23 -11
  24. data/lib/icalendar/values/date_time.rb +4 -0
  25. data/lib/icalendar/values/time_with_zone.rb +23 -6
  26. data/lib/icalendar/values/uri.rb +2 -2
  27. data/lib/icalendar/values/utc_offset.rb +10 -2
  28. data/lib/icalendar/version.rb +1 -1
  29. data/lib/icalendar.rb +3 -1
  30. data/spec/alarm_spec.rb +7 -2
  31. data/spec/calendar_spec.rb +34 -0
  32. data/spec/event_spec.rb +24 -0
  33. data/spec/fixtures/bad_wrapping.ics +14 -0
  34. data/spec/fixtures/custom_component.ics +158 -0
  35. data/spec/fixtures/single_event.ics +1 -1
  36. data/spec/fixtures/single_event_bad_organizer.ics +22 -0
  37. data/spec/fixtures/single_event_organizer_parsed.ics +22 -0
  38. data/spec/fixtures/tzid_search.ics +31 -0
  39. data/spec/parser_spec.rb +31 -9
  40. data/spec/roundtrip_spec.rb +32 -9
  41. data/spec/timezone_spec.rb +48 -0
  42. data/spec/tzinfo_spec.rb +1 -1
  43. data/spec/values/date_or_date_time_spec.rb +10 -0
  44. metadata +65 -40
  45. data/.travis.yml +0 -18
@@ -0,0 +1,22 @@
1
+ BEGIN:VCALENDAR
2
+ VERSION:2.0
3
+ PRODID:bsprodidfortestabc123
4
+ CALSCALE:GREGORIAN
5
+ BEGIN:VEVENT
6
+ DTSTAMP:20050118T211523Z
7
+ UID:bsuidfortestabc123
8
+ DTSTART;TZID=US-Mountain:20050120T170000
9
+ DTEND;TZID=US-Mountain:20050120T184500
10
+ CLASS:PRIVATE
11
+ GEO:37.386013;-122.0829322
12
+ ORGANIZER;CN=Joe Bob\: Magician:mailto:joebob@random.net
13
+ PRIORITY:2
14
+ SUMMARY:This is a really long summary to test the method of unfolding lines
15
+ \, so I'm just going to make it a whole bunch of lines. With a twist: a "
16
+ ö" takes up multiple bytes\, and should be wrapped to the next line.
17
+ ATTACH:http://bush.sucks.org/impeach/him.rhtml
18
+ ATTACH:http://corporations-dominate.existence.net/why.rhtml
19
+ RDATE;TZID=US-Mountain:20050121T170000,20050122T170000
20
+ X-TEST-COMPONENT;QTEST="Hello, World":Shouldn't double double quotes
21
+ END:VEVENT
22
+ END:VCALENDAR
@@ -0,0 +1,22 @@
1
+ BEGIN:VCALENDAR
2
+ VERSION:2.0
3
+ PRODID:bsprodidfortestabc123
4
+ CALSCALE:GREGORIAN
5
+ BEGIN:VEVENT
6
+ DTSTAMP:20050118T211523Z
7
+ UID:bsuidfortestabc123
8
+ DTSTART;TZID=US-Mountain:20050120T170000
9
+ DTEND;TZID=US-Mountain:20050120T184500
10
+ CLASS:PRIVATE
11
+ GEO:37.386013;-122.0829322
12
+ ORGANIZER;CN=Joe Bob\:magician:mailto:joebob@random.net
13
+ PRIORITY:2
14
+ SUMMARY:This is a really long summary to test the method of unfolding lines
15
+ \, so I'm just going to make it a whole bunch of lines. With a twist: a "
16
+ ö" takes up multiple bytes\, and should be wrapped to the next line.
17
+ ATTACH:http://bush.sucks.org/impeach/him.rhtml
18
+ ATTACH:http://corporations-dominate.existence.net/why.rhtml
19
+ RDATE;TZID=US-Mountain:20050121T170000,20050122T170000
20
+ X-TEST-COMPONENT;QTEST="Hello, World":Shouldn't double double quotes
21
+ END:VEVENT
22
+ END:VCALENDAR
@@ -0,0 +1,31 @@
1
+ BEGIN:VCALENDAR
2
+ METHOD:PUBLISH
3
+ VERSION:2.0
4
+ CALSCALE:GREGORIAN
5
+ BEGIN:VTIMEZONE
6
+ TZID:(GMT-05:00) Eastern Time (US & Canada)
7
+ BEGIN:STANDARD
8
+ DTSTART:16011104T010000
9
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
10
+ TZOFFSETFROM:-0400
11
+ TZOFFSETTO:-0500
12
+ END:STANDARD
13
+ BEGIN:DAYLIGHT
14
+ DTSTART:16010311T030000
15
+ RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
16
+ TZOFFSETFROM:-0500
17
+ TZOFFSETTO:-0400
18
+ END:DAYLIGHT
19
+ END:VTIMEZONE
20
+ BEGIN:VEVENT
21
+ CREATED:20120104T225934Z
22
+ UID:23D50AF6-23D4-4CB5-85C6-4826F3F19999
23
+ DTEND;TZID="(GMT-05:00) Eastern Time (US & Canada)":20180104T130000
24
+ RRULE:FREQ=WEEKLY;INTERVAL=1
25
+ TRANSP:OPAQUE
26
+ SUMMARY:Recurring on Wed
27
+ DTSTART;TZID="(GMT-05:00) Eastern Time (US & Canada)":20180104T100000
28
+ DTSTAMP:20120104T231637Z
29
+ SEQUENCE:6
30
+ END:VEVENT
31
+ END:VCALENDAR
data/spec/parser_spec.rb CHANGED
@@ -9,9 +9,10 @@ describe Icalendar::Parser do
9
9
  let(:fn) { 'single_event.ics' }
10
10
 
11
11
  it 'returns an array of calendars' do
12
- expect(subject.parse).to be_instance_of Array
13
- expect(subject.parse.count).to eq 1
14
- expect(subject.parse[0]).to be_instance_of Icalendar::Calendar
12
+ parsed = subject.parse
13
+ expect(parsed).to be_instance_of Array
14
+ expect(parsed.count).to eq 1
15
+ expect(parsed[0]).to be_instance_of Icalendar::Calendar
15
16
  end
16
17
 
17
18
  it 'properly splits multi-valued lines' do
@@ -38,9 +39,10 @@ describe Icalendar::Parser do
38
39
  before { subject.component_class = Icalendar::Event }
39
40
 
40
41
  it 'returns an array of events' do
41
- expect(subject.parse).to be_instance_of Array
42
- expect(subject.parse.count).to be 1
43
- expect(subject.parse[0]).to be_instance_of Icalendar::Event
42
+ parsed = subject.parse
43
+ expect(parsed).to be_instance_of Array
44
+ expect(parsed.count).to be 1
45
+ expect(parsed[0]).to be_instance_of Icalendar::Event
44
46
  end
45
47
  end
46
48
  context 'events.ics' do
@@ -55,15 +57,35 @@ describe Icalendar::Parser do
55
57
  expect(events.last.uid).to eq("uid-1234-uid-4321")
56
58
  end
57
59
  end
60
+ context 'tzid_search.ics' do
61
+ let(:fn) { 'tzid_search.ics' }
62
+
63
+ it 'correctly sets the weird tzid' do
64
+ parsed = subject.parse
65
+ event = parsed.first.events.first
66
+ expect(event.dtstart.utc).to eq Time.parse("20180104T150000Z")
67
+ end
68
+ end
69
+ context 'custom_component.ics' do
70
+ let(:fn) { 'custom_component.ics' }
71
+
72
+ it 'correctly handles custom named components' do
73
+ parsed = subject.parse
74
+ calendar = parsed.first
75
+ expect(calendar.custom_component('x_event_series').size).to eq 1
76
+ expect(calendar.custom_component('X-EVENT-SERIES').size).to eq 1
77
+ end
78
+ end
58
79
  end
59
80
 
60
81
  describe '#parse with bad line' do
61
82
  let(:fn) { 'single_event_bad_line.ics' }
62
83
 
63
84
  it 'returns an array of calendars' do
64
- expect(subject.parse).to be_instance_of Array
65
- expect(subject.parse.count).to eq 1
66
- expect(subject.parse[0]).to be_instance_of Icalendar::Calendar
85
+ parsed = subject.parse
86
+ expect(parsed).to be_instance_of Array
87
+ expect(parsed.count).to eq 1
88
+ expect(parsed[0]).to be_instance_of Icalendar::Calendar
67
89
  end
68
90
 
69
91
  it 'properly splits multi-valued lines' do
@@ -15,7 +15,21 @@ describe Icalendar do
15
15
  parsed = Icalendar::Calendar.parse(source).first
16
16
  event.rdate = parsed.events.first.rdate
17
17
  expect(event.rdate.first).to be_kind_of Icalendar::Values::Array
18
- expect(event.rdate.first.ical_params).to eq 'tzid' => ['US-Mountain']
18
+ expect(event.rdate.first.params_ical).to eq ";TZID=US-Mountain"
19
+ end
20
+ end
21
+
22
+ describe 'cleanly handle facebook organizers' do
23
+ let(:source) { File.read File.join(File.dirname(__FILE__), 'fixtures', 'single_event_bad_organizer.ics') }
24
+ let(:source_lowered_uri) { File.read File.join(File.dirname(__FILE__), 'fixtures', 'single_event_organizer_parsed.ics') }
25
+ it 'will generate the same file as it parsed' do
26
+ ical = Icalendar::Calendar.parse(source).first.to_ical
27
+ source_equal = ical == source
28
+ # rbx-3 parses the organizer as a URI, which strips the space and lowercases everything after the first :
29
+ # this is correct behavior, according to the icalendar spec, so we're not fudging the parser to accomodate
30
+ # facebook not properly wrapping the CN param in dquotes
31
+ source_lowered_equal = ical == source_lowered_uri
32
+ expect(source_equal || source_lowered_equal).to be true
19
33
  end
20
34
  end
21
35
 
@@ -67,18 +81,18 @@ describe Icalendar do
67
81
  it 'sorts time events by start time' do
68
82
  events = subject.sort_by(&:dtstart)
69
83
 
70
- expect(events.first.dtstart).to eq ::DateTime.new(2014, 7, 14, 9, 0, 0, '-4')
84
+ expect(events.first.dtstart.to_datetime).to eq ::DateTime.new(2014, 7, 14, 9, 0, 0, '-4')
71
85
 
72
- expect(events.last.dtstart).to eq ::DateTime.new(2014, 7, 14, 9, 1, 0, '-4')
73
- expect(events.last.dtend).to eq ::DateTime.new(2014, 7, 14, 9, 59, 0, '-4')
86
+ expect(events.last.dtstart.to_datetime).to eq ::DateTime.new(2014, 7, 14, 9, 1, 0, '-4')
87
+ expect(events.last.dtend.to_datetime).to eq ::DateTime.new(2014, 7, 14, 9, 59, 0, '-4')
74
88
  end
75
89
 
76
90
  it 'sorts time events by end time' do
77
91
  events = subject.sort_by(&:dtend)
78
92
 
79
- expect(events.first.dtstart).to eq ::DateTime.new(2014, 7, 14, 9, 1, 0, '-4')
80
- expect(events.first.dtend).to eq ::DateTime.new(2014, 7, 14, 9, 59, 0, '-4')
81
- expect(events.last.dtstart).to eq ::DateTime.new(2014, 7, 14, 9, 0, 0, '-4')
93
+ expect(events.first.dtstart.to_datetime).to eq ::DateTime.new(2014, 7, 14, 9, 1, 0, '-4')
94
+ expect(events.first.dtend.to_datetime).to eq ::DateTime.new(2014, 7, 14, 9, 59, 0, '-4')
95
+ expect(events.last.dtstart.to_datetime).to eq ::DateTime.new(2014, 7, 14, 9, 0, 0, '-4')
82
96
  end
83
97
  end
84
98
 
@@ -89,8 +103,8 @@ describe Icalendar do
89
103
  it 'sorts time events' do
90
104
  events = subject.sort_by(&:dtstart)
91
105
 
92
- expect(events.first.dtstart).to eq ::Date.new(2014, 7, 14)
93
- expect(events.last.dtstart).to eq ::DateTime.new(2014, 7, 14, 9, 0, 0, '-4')
106
+ expect(events.first.dtstart.to_date).to eq ::Date.new(2014, 7, 14)
107
+ expect(events.last.dtstart.to_datetime).to eq ::DateTime.new(2014, 7, 14, 9, 0, 0, '-4')
94
108
  end
95
109
  end
96
110
 
@@ -121,6 +135,15 @@ describe Icalendar do
121
135
  ical = subject.parse.first.to_ical
122
136
  expect(ical).to include 'CUSTOMFIELD:Not properly noted as custom with X- prefix.'
123
137
  end
138
+
139
+ context 'custom components' do
140
+ let(:source) { File.read File.join(File.dirname(__FILE__), 'fixtures', 'custom_component.ics') }
141
+
142
+ it 'can output the custom component' do
143
+ ical = subject.parse.first.to_ical
144
+ expect(ical).to include 'BEGIN:X-EVENT-SERIES'
145
+ end
146
+ end
124
147
  end
125
148
  end
126
149
  end
@@ -28,4 +28,52 @@ describe Icalendar::Timezone do
28
28
  it { should_not be_valid }
29
29
  end
30
30
  end
31
+
32
+ context 'marshalling' do
33
+ context 'with standard/daylight components' do
34
+ before do
35
+ subject.standard do |standard|
36
+ standard.rrule = Icalendar::Values::Recur.new("FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10")
37
+ standard.dtstart = Icalendar::Values::DateTime.new("16010101T030000")
38
+ standard.tzoffsetfrom = Icalendar::Values::UtcOffset.new("+0200")
39
+ standard.tzoffsetto = Icalendar::Values::UtcOffset.new("+0100")
40
+ end
41
+
42
+ subject.daylight do |daylight|
43
+ daylight.rrule = Icalendar::Values::Recur.new("FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3")
44
+ daylight.dtstart = Icalendar::Values::DateTime.new("16010101T020000")
45
+ daylight.tzoffsetfrom = Icalendar::Values::UtcOffset.new("+0100")
46
+ daylight.tzoffsetto = Icalendar::Values::UtcOffset.new("+0200")
47
+ end
48
+ end
49
+
50
+ it 'can be de/serialized' do
51
+ first_standard = subject.standards.first
52
+ first_daylight = subject.daylights.first
53
+
54
+ expect(first_standard.valid?).to be_truthy
55
+ expect(first_daylight.valid?).to be_truthy
56
+
57
+ # calling previous_occurrence intializes @cached_occurrences with a time that's not handled by ruby marshaller
58
+ first_occurence_for = Time.new(1601, 10, 31)
59
+
60
+ standard_previous_occurrence = first_standard.previous_occurrence(first_occurence_for)
61
+ expect(standard_previous_occurrence).not_to be_nil
62
+
63
+ daylight_previous_occurrence = first_daylight.previous_occurrence(first_occurence_for)
64
+ expect(daylight_previous_occurrence).not_to be_nil
65
+
66
+ deserialized = nil
67
+
68
+ expect { deserialized = Marshal.load(Marshal.dump(subject)) }.not_to raise_exception
69
+
70
+ expect(deserialized.standards.first.previous_occurrence(first_occurence_for)).to eq(standard_previous_occurrence)
71
+ expect(deserialized.daylights.first.previous_occurrence(first_occurence_for)).to eq(daylight_previous_occurrence)
72
+ end
73
+ end
74
+
75
+ it 'can be de/serialized' do
76
+ expect { Marshal.load(Marshal.dump(subject)) }.not_to raise_exception
77
+ end
78
+ end
31
79
  end
data/spec/tzinfo_spec.rb CHANGED
@@ -34,7 +34,7 @@ describe 'TZInfo::Timezone' do
34
34
  BEGIN:VTIMEZONE
35
35
  TZID:Asia/Shanghai
36
36
  BEGIN:STANDARD
37
- DTSTART:19910914T230000
37
+ DTSTART:19910915T010000
38
38
  TZOFFSETFROM:+0900
39
39
  TZOFFSETTO:+0800
40
40
  TZNAME:CST
@@ -38,4 +38,14 @@ describe Icalendar::Values::DateOrDateTime do
38
38
  end
39
39
  end
40
40
  end
41
+
42
+ describe "#to_ical" do
43
+ let(:event) { Icalendar::Event.new }
44
+ let(:time_stamp) { Time.now.strftime Icalendar::Values::DateTime::FORMAT }
45
+
46
+ it "should call parse behind the scenes" do
47
+ event.dtstart = described_class.new time_stamp, "tzid" => "UTC"
48
+ expect(event.to_ical).to include "DTSTART:#{time_stamp}Z"
49
+ end
50
+ end
41
51
  end
metadata CHANGED
@@ -1,141 +1,155 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: icalendar
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.1
4
+ version: 2.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Ahearn
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-04 00:00:00.000000000 Z
11
+ date: 2022-07-11 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: ice_cube
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.16'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.16'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: rake
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
31
  - - "~>"
18
32
  - !ruby/object:Gem::Version
19
- version: '10.0'
33
+ version: '13.0'
20
34
  type: :development
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
24
38
  - - "~>"
25
39
  - !ruby/object:Gem::Version
26
- version: '10.0'
40
+ version: '13.0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - "~>"
32
46
  - !ruby/object:Gem::Version
33
- version: '1.3'
47
+ version: '2.0'
34
48
  type: :development
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
- version: '1.3'
54
+ version: '2.0'
41
55
  - !ruby/object:Gem::Dependency
42
- name: tzinfo
56
+ name: activesupport
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - "~>"
46
60
  - !ruby/object:Gem::Version
47
- version: '1.1'
61
+ version: '6.0'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
66
  - - "~>"
53
67
  - !ruby/object:Gem::Version
54
- version: '1.1'
68
+ version: '6.0'
55
69
  - !ruby/object:Gem::Dependency
56
- name: tzinfo-data
70
+ name: i18n
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
73
  - - "~>"
60
74
  - !ruby/object:Gem::Version
61
- version: '1.2014'
75
+ version: '1.8'
62
76
  type: :development
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
80
  - - "~>"
67
81
  - !ruby/object:Gem::Version
68
- version: '1.2014'
82
+ version: '1.8'
69
83
  - !ruby/object:Gem::Dependency
70
- name: activesupport
84
+ name: tzinfo
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
87
  - - "~>"
74
88
  - !ruby/object:Gem::Version
75
- version: '3.2'
89
+ version: '1.2'
76
90
  type: :development
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
94
  - - "~>"
81
95
  - !ruby/object:Gem::Version
82
- version: '3.2'
96
+ version: '1.2'
83
97
  - !ruby/object:Gem::Dependency
84
- name: i18n
98
+ name: tzinfo-data
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
- - - "<"
101
+ - - "~>"
88
102
  - !ruby/object:Gem::Version
89
- version: 0.7.0
103
+ version: '1.2020'
90
104
  type: :development
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
- - - "<"
108
+ - - "~>"
95
109
  - !ruby/object:Gem::Version
96
- version: 0.7.0
110
+ version: '1.2020'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: timecop
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
115
  - - "~>"
102
116
  - !ruby/object:Gem::Version
103
- version: 0.7.0
117
+ version: '0.9'
104
118
  type: :development
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
122
  - - "~>"
109
123
  - !ruby/object:Gem::Version
110
- version: 0.7.0
124
+ version: '0.9'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: rspec
113
127
  requirement: !ruby/object:Gem::Requirement
114
128
  requirements:
115
129
  - - "~>"
116
130
  - !ruby/object:Gem::Version
117
- version: '3.0'
131
+ version: '3.8'
118
132
  type: :development
119
133
  prerelease: false
120
134
  version_requirements: !ruby/object:Gem::Requirement
121
135
  requirements:
122
136
  - - "~>"
123
137
  - !ruby/object:Gem::Version
124
- version: '3.0'
138
+ version: '3.8'
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: simplecov
127
141
  requirement: !ruby/object:Gem::Requirement
128
142
  requirements:
129
143
  - - "~>"
130
144
  - !ruby/object:Gem::Version
131
- version: '0.8'
145
+ version: '0.16'
132
146
  type: :development
133
147
  prerelease: false
134
148
  version_requirements: !ruby/object:Gem::Requirement
135
149
  requirements:
136
150
  - - "~>"
137
151
  - !ruby/object:Gem::Version
138
- version: '0.8'
152
+ version: '0.16'
139
153
  description: |
140
154
  Implements the iCalendar specification (RFC-5545) in Ruby. This allows
141
155
  for the generation and parsing of .ics files, which are used by a
@@ -146,12 +160,12 @@ executables: []
146
160
  extensions: []
147
161
  extra_rdoc_files: []
148
162
  files:
163
+ - ".github/workflows/main.yml"
149
164
  - ".gitignore"
150
165
  - ".rspec"
151
- - ".travis.yml"
152
- - COPYING
153
166
  - Gemfile
154
167
  - History.txt
168
+ - LICENSE
155
169
  - README.md
156
170
  - Rakefile
157
171
  - icalendar.gemspec
@@ -166,8 +180,10 @@ files:
166
180
  - lib/icalendar/has_properties.rb
167
181
  - lib/icalendar/journal.rb
168
182
  - lib/icalendar/logger.rb
183
+ - lib/icalendar/marshable.rb
169
184
  - lib/icalendar/parser.rb
170
185
  - lib/icalendar/timezone.rb
186
+ - lib/icalendar/timezone_store.rb
171
187
  - lib/icalendar/todo.rb
172
188
  - lib/icalendar/tzinfo.rb
173
189
  - lib/icalendar/value.rb
@@ -194,6 +210,8 @@ files:
194
210
  - spec/calendar_spec.rb
195
211
  - spec/downcased_hash_spec.rb
196
212
  - spec/event_spec.rb
213
+ - spec/fixtures/bad_wrapping.ics
214
+ - spec/fixtures/custom_component.ics
197
215
  - spec/fixtures/event.ics
198
216
  - spec/fixtures/nondefault_values.ics
199
217
  - spec/fixtures/nonstandard.ics
@@ -201,11 +219,14 @@ files:
201
219
  - spec/fixtures/single_event.ics
202
220
  - spec/fixtures/single_event_bad_dtstart.ics
203
221
  - spec/fixtures/single_event_bad_line.ics
222
+ - spec/fixtures/single_event_bad_organizer.ics
223
+ - spec/fixtures/single_event_organizer_parsed.ics
204
224
  - spec/fixtures/timezone.ics
205
225
  - spec/fixtures/two_date_time_events.ics
206
226
  - spec/fixtures/two_day_events.ics
207
227
  - spec/fixtures/two_events.ics
208
228
  - spec/fixtures/two_time_events.ics
229
+ - spec/fixtures/tzid_search.ics
209
230
  - spec/freebusy_spec.rb
210
231
  - spec/journal_spec.rb
211
232
  - spec/parser_spec.rb
@@ -222,15 +243,15 @@ files:
222
243
  - spec/values/text_spec.rb
223
244
  - spec/values/utc_offset_spec.rb
224
245
  homepage: https://github.com/icalendar/icalendar
225
- licenses: []
246
+ licenses:
247
+ - BSD-2-Clause
248
+ - GPL-3.0-only
249
+ - icalendar
226
250
  metadata: {}
227
- post_install_message: |
228
- HEADS UP! iCalendar 2.0 is not backwards-compatible with 1.x. Please see the README for the new syntax
229
-
230
- HEADS UP! icalendar 2.2.0 switches to non-strict parsing as default. Please see the README if you
231
- rely on strict parsing for information on how to enable it.
251
+ post_install_message: 'ActiveSupport is required for TimeWithZone support, but not
252
+ required for general use.
232
253
 
233
- ActiveSupport is required for TimeWithZone support, but not required for general use.
254
+ '
234
255
  rdoc_options: []
235
256
  require_paths:
236
257
  - lib
@@ -238,16 +259,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
238
259
  requirements:
239
260
  - - ">="
240
261
  - !ruby/object:Gem::Version
241
- version: 1.9.2
262
+ version: 2.4.0
242
263
  required_rubygems_version: !ruby/object:Gem::Requirement
243
264
  requirements:
244
265
  - - ">="
245
266
  - !ruby/object:Gem::Version
246
267
  version: '0'
247
268
  requirements: []
248
- rubyforge_project:
249
- rubygems_version: 2.6.6
250
- signing_key:
269
+ rubygems_version: 3.3.7
270
+ signing_key:
251
271
  specification_version: 4
252
272
  summary: A ruby implementation of the iCalendar specification (RFC-5545).
253
273
  test_files:
@@ -255,6 +275,8 @@ test_files:
255
275
  - spec/calendar_spec.rb
256
276
  - spec/downcased_hash_spec.rb
257
277
  - spec/event_spec.rb
278
+ - spec/fixtures/bad_wrapping.ics
279
+ - spec/fixtures/custom_component.ics
258
280
  - spec/fixtures/event.ics
259
281
  - spec/fixtures/nondefault_values.ics
260
282
  - spec/fixtures/nonstandard.ics
@@ -262,11 +284,14 @@ test_files:
262
284
  - spec/fixtures/single_event.ics
263
285
  - spec/fixtures/single_event_bad_dtstart.ics
264
286
  - spec/fixtures/single_event_bad_line.ics
287
+ - spec/fixtures/single_event_bad_organizer.ics
288
+ - spec/fixtures/single_event_organizer_parsed.ics
265
289
  - spec/fixtures/timezone.ics
266
290
  - spec/fixtures/two_date_time_events.ics
267
291
  - spec/fixtures/two_day_events.ics
268
292
  - spec/fixtures/two_events.ics
269
293
  - spec/fixtures/two_time_events.ics
294
+ - spec/fixtures/tzid_search.ics
270
295
  - spec/freebusy_spec.rb
271
296
  - spec/journal_spec.rb
272
297
  - spec/parser_spec.rb
data/.travis.yml DELETED
@@ -1,18 +0,0 @@
1
- sudo: false
2
- before_install:
3
- - gem install bundler
4
- language: ruby
5
- rvm:
6
- - 2.3.1
7
- - 2.2
8
- - 2.1
9
- - 2.0
10
- - jruby-19mode
11
- - rbx-2
12
- - ruby-head
13
- - jruby-head
14
- matrix:
15
- allow_failures:
16
- - rvm: ruby-head
17
- - rvm: jruby-head
18
- script: bundle exec rake spec