icalendar 2.1.2 → 2.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 961c1bb54f8d041206166d436da335415ffa8373
4
- data.tar.gz: 559c04b6e5456b74649baf53db4c60d2dd2f2485
3
+ metadata.gz: 1247afeb6249a4562ed23fdf9a01345f10513d8e
4
+ data.tar.gz: edb231f0a00055c53bafec1e92a4006b741d14fb
5
5
  SHA512:
6
- metadata.gz: e0e4f2ee01e35b88c0d8916f7a17bd441338b6eda24aba19ab4e78c6cbf25b4bf2614fa94e82c1e085b9cf4bd006a863d690e17234c05aad0a670bc883f97534
7
- data.tar.gz: db81643632c9054fcc1595d344949cd36848b7c3c5dea2fccced3322069320dde48c7ece037f6087025df04719b86b62fe369a1f34fbfb7a1c59107b2bbeac9a
6
+ metadata.gz: 3c93f4624d028b364b42ed6054df4b7bffe2296bdd392985aff5d929be4fff0ebea3ff15ae93799277935497385d28f0f210ff7928309dac9488b42d1c25bc0c
7
+ data.tar.gz: 59a6178deb2fc347b0487306aff201d64360ed52aae18fe3e905082988f827f7c6f509fdde39d15461cfb38a1b34b506c6caaa821fe3ede4af0eda7259121570
data/History.txt CHANGED
@@ -1,3 +1,10 @@
1
+ === 2.2.0 2014-09-23
2
+ * Default to non-strict parsing
3
+ * Enable sorting events by dtstart - Mark Rickert
4
+ * Better tolerate malformed lines in parser - Gary Shutler
5
+ * Deduplicate timezone code - Jan Vlnas
6
+ * Eliminate warnings - rochefort
7
+
1
8
  === 2.1.2 2014-09-10
2
9
  * Fix timezone abbreviation generation - Jan Vlnas
3
10
  * Fix timezone repeat rules for end of month
data/README.md CHANGED
@@ -233,13 +233,13 @@ Parsing iCalendars
233
233
  puts "start date-time timezone: #{event.dtstart.ical_params['tzid']}"
234
234
  puts "summary: #{event.summary}"
235
235
 
236
- You can also create a `Parser` instance directly, this can be used to disable
237
- the strict parsing:
236
+ You can also create a `Parser` instance directly, this can be used to enable
237
+ strict parsing:
238
238
 
239
- # Some calendars contain non-standard parameters (e.g. Apple iCloud
240
- # calendars). You can pass in a `strict` value when creating a new parser.
241
- unstrict_parser = Icalendar::Parser.new(cal_file, false)
242
- cal = unstrict_parser.parse
239
+ # Sometimes you want to strongly verify only rfc-approved properties are
240
+ # used
241
+ strict_parser = Icalendar::Parser.new(cal_file, true)
242
+ cal = strict_parser.parse
243
243
 
244
244
  Finders
245
245
  ---
data/icalendar.gemspec CHANGED
@@ -18,6 +18,9 @@ variety of calendaring applications.
18
18
  s.post_install_message = <<-EOM
19
19
  HEADS UP! iCalendar 2.0 is not backwards-compatible with 1.x. Please see the README for the new syntax
20
20
 
21
+ HEADS UP! icalendar 2.2.0 switches to non-strict parsing as default. Please see the README if you
22
+ rely on strict parsing for information on how to enable it.
23
+
21
24
  ActiveSupport is required for TimeWithZone support, but not required for general use.
22
25
  EOM
23
26
 
@@ -4,7 +4,7 @@ module Icalendar
4
4
 
5
5
  attr_reader :source, :strict
6
6
 
7
- def initialize(source, strict = true)
7
+ def initialize(source, strict = false)
8
8
  if source.respond_to? :gets
9
9
  @source = source
10
10
  elsif source.respond_to? :to_s
@@ -119,9 +119,18 @@ module Icalendar
119
119
  PARAM = "(#{NAME})=(#{PVALUE}(?:,#{PVALUE})*)"
120
120
  VALUE = '.*'
121
121
  LINE = "(?<name>#{NAME})(?<params>(?:;#{PARAM})*):(?<value>#{VALUE})"
122
+ BAD_LINE = "(?<name>#{NAME})(?<params>(?:;#{PARAM})*)"
122
123
 
123
124
  def parse_fields(input)
124
- parts = %r{#{LINE}}.match(input) or fail "Invalid iCalendar input line: #{input}"
125
+ if parts = %r{#{LINE}}.match(input)
126
+ value = parts[:value]
127
+ else
128
+ parts = %r{#{BAD_LINE}}.match(input) unless strict?
129
+ parts or fail "Invalid iCalendar input line: #{input}"
130
+ # Non-strict and bad line so use a value of empty string
131
+ value = ''
132
+ end
133
+
125
134
  params = {}
126
135
  parts[:params].scan %r{#{PARAM}} do |match|
127
136
  param_name = match[0].downcase
@@ -134,7 +143,7 @@ module Icalendar
134
143
  {
135
144
  name: parts[:name].downcase.gsub('-', '_'),
136
145
  params: params,
137
- value: parts[:value]
146
+ value: value
138
147
  }
139
148
  end
140
149
  end
@@ -128,38 +128,29 @@ module TZInfo
128
128
  end
129
129
 
130
130
  class TimezonePeriod
131
+
132
+ # For DST, use the start_transition,
133
+ # for standard TZ, use the following period (starting from the end_transition).
131
134
  def daylight
132
- Icalendar::Timezone::Daylight.new.tap do |day|
133
- if dst?
134
- day.tzname = abbreviation.to_s
135
- day.tzoffsetfrom = start_transition.offset_from
136
- day.tzoffsetto = start_transition.offset_to
137
- day.dtstart = start_transition.dtstart
138
- day.rrule = start_transition.rrule unless end_transition.nil?
139
- else
140
- day.tzname = end_transition.offset_abbreviation
141
- day.tzoffsetfrom = end_transition.offset_from
142
- day.tzoffsetto = end_transition.offset_to
143
- day.dtstart = end_transition.dtstart
144
- day.rrule = end_transition.rrule
135
+ transition = dst? ? start_transition : end_transition
136
+ day = Icalendar::Timezone::Daylight.new
137
+ build_timezone(day, transition) do |tz|
138
+ # rrule should not be set for the current [==DST/daylight] period
139
+ # if there is no recurrence rule for the end transition
140
+ if !dst? || !end_transition.nil?
141
+ tz.rrule = transition.rrule
145
142
  end
146
143
  end
147
144
  end
148
145
 
146
+ # For standard TZ, use the start_transition,
147
+ # for DST, use the following period, (starting from the end_transition)
149
148
  def standard
150
- Icalendar::Timezone::Standard.new.tap do |std|
151
- if dst?
152
- std.tzname = end_transition.offset_abbreviation
153
- std.tzoffsetfrom = end_transition.offset_from
154
- std.tzoffsetto = end_transition.offset_to
155
- std.dtstart = end_transition.dtstart
156
- std.rrule = end_transition.rrule
157
- else
158
- std.tzname = abbreviation.to_s
159
- std.tzoffsetfrom = start_transition.offset_from
160
- std.tzoffsetto = start_transition.offset_to
161
- std.dtstart = start_transition.dtstart
162
- std.rrule = start_transition.rrule unless end_transition.nil?
149
+ transition = dst? ? end_transition : start_transition
150
+ std = Icalendar::Timezone::Standard.new
151
+ build_timezone(std, transition) do |tz|
152
+ if dst? || !end_transition.nil?
153
+ tz.rrule = transition.rrule
163
154
  end
164
155
  end
165
156
  end
@@ -172,5 +163,16 @@ module TZInfo
172
163
  std.dtstart = DateTime.new(1970).strftime '%Y%m%dT%H%M%S'
173
164
  end
174
165
  end
166
+
167
+ private
168
+ def build_timezone(timezone, transition)
169
+ timezone.tap do |tz|
170
+ tz.tzname = transition.offset_abbreviation
171
+ tz.tzoffsetfrom = transition.offset_from
172
+ tz.tzoffsetto = transition.offset_to
173
+ tz.dtstart = transition.dtstart
174
+ yield tz
175
+ end
176
+ end
175
177
  end
176
178
  end
@@ -20,7 +20,15 @@ module Icalendar
20
20
  value.strftime FORMAT
21
21
  end
22
22
 
23
+ def <=>(other)
24
+ if other.is_a?(Icalendar::Values::Date) || other.is_a?(Icalendar::Values::DateTime)
25
+ value_ical <=> other.value_ical
26
+ else
27
+ nil
28
+ end
29
+ end
30
+
23
31
  end
24
32
 
25
33
  end
26
- end
34
+ end
@@ -28,7 +28,15 @@ module Icalendar
28
28
  end
29
29
  end
30
30
 
31
+ def <=>(other)
32
+ if other.is_a?(Icalendar::Values::Date) || other.is_a?(Icalendar::Values::DateTime)
33
+ value_ical <=> other.value_ical
34
+ else
35
+ nil
36
+ end
37
+ end
38
+
31
39
  end
32
40
 
33
41
  end
34
- end
42
+ end
@@ -1,12 +1,10 @@
1
1
  module Icalendar
2
2
  module Values
3
-
4
3
  class Text < Value
5
-
6
4
  def initialize(value, params = {})
7
- value = value.gsub '\n', "\n"
8
- value.gsub! '\,', ','
9
- value.gsub! '\;', ';'
5
+ value = value.gsub('\n', "\n")
6
+ value.gsub!('\,', ',')
7
+ value.gsub!('\;', ';')
10
8
  value.gsub!('\\\\') { '\\' }
11
9
  super value, params
12
10
  end
@@ -14,13 +12,11 @@ module Icalendar
14
12
  def value_ical
15
13
  value.dup.tap do |v|
16
14
  v.gsub!('\\') { '\\\\' }
17
- v.gsub! ';', '\;'
18
- v.gsub! ',', '\,'
19
- v.gsub! /\r?\n/, '\n'
15
+ v.gsub!(';', '\;')
16
+ v.gsub!(',', '\,')
17
+ v.gsub!(/\r?\n/, '\n')
20
18
  end
21
19
  end
22
-
23
20
  end
24
-
25
21
  end
26
- end
22
+ end
@@ -2,9 +2,7 @@ require 'ostruct'
2
2
 
3
3
  module Icalendar
4
4
  module Values
5
-
6
5
  class UtcOffset < Value
7
-
8
6
  def initialize(value, params = {})
9
7
  if value.is_a? Icalendar::Values::UtcOffset
10
8
  value = value.value
@@ -30,7 +28,7 @@ module Icalendar
30
28
  end
31
29
 
32
30
  def parse_fields(value)
33
- value.gsub! /\s+/, ''
31
+ value.gsub!(/\s+/, '')
34
32
  md = /\A(?<behind>[+-])(?<hours>\d{2})(?<minutes>\d{2})(?<seconds>\d{2})?\z/.match value
35
33
  {
36
34
  behind: (md[:behind] == '-'),
@@ -1,5 +1,5 @@
1
1
  module Icalendar
2
2
 
3
- VERSION = '2.1.2'
3
+ VERSION = '2.2.0'
4
4
 
5
5
  end
@@ -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: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.
16
+ ATTACH:http://bush.sucks.org/impeach/him.rhtml
17
+ ATTACH:http://corporations-dominate.existence.net/why.rhtml
18
+ RDATE;TZID=US-Mountain:20050121T170000,20050122T170000
19
+ X-TEST-COMPONENT;QTEST="Hello, World":Shouldn't double double quotes
20
+ X-NO-VALUE
21
+ END:VEVENT
22
+ END:VCALENDAR
@@ -0,0 +1,64 @@
1
+ BEGIN:VCALENDAR
2
+ METHOD:PUBLISH
3
+ VERSION:2.0
4
+ X-WR-CALNAME:TMP
5
+ PRODID:-//Apple Inc.//Mac OS X 10.9.4//EN
6
+ X-APPLE-CALENDAR-COLOR:#0E61B9
7
+ X-WR-TIMEZONE:America/New_York
8
+ CALSCALE:GREGORIAN
9
+ BEGIN:VTIMEZONE
10
+ TZID:America/New_York
11
+ BEGIN:DAYLIGHT
12
+ TZOFFSETFROM:-0500
13
+ RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
14
+ DTSTART:20070311T020000
15
+ TZNAME:EDT
16
+ TZOFFSETTO:-0400
17
+ END:DAYLIGHT
18
+ BEGIN:STANDARD
19
+ TZOFFSETFROM:-0400
20
+ RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
21
+ DTSTART:20071104T020000
22
+ TZNAME:EST
23
+ TZOFFSETTO:-0500
24
+ END:STANDARD
25
+ END:VTIMEZONE
26
+ BEGIN:VEVENT
27
+ STATUS:CONFIRMED
28
+ CREATED:20140731T162556Z
29
+ UID:7C4A5440-ABA5-4B32-A69D-AFD243B39FE1
30
+ DTEND;TZID=America/New_York:20140714T100000
31
+ TRANSP:OPAQUE
32
+ SUMMARY:9am
33
+ LAST-MODIFIED:20140731T162556Z
34
+ DTSTAMP:20140731T164042Z
35
+ DTSTART;TZID=America/New_York:20140714T090000
36
+ LOCATION:
37
+ SEQUENCE:13
38
+ BEGIN:VALARM
39
+ X-WR-ALARMUID:6F54CD66-F2A9-491D-8892-7E3209F6A2E4
40
+ UID:6F54CD66-F2A9-491D-8892-7E3209F6A2E4
41
+ TRIGGER;VALUE=DATE-TIME:19760401T005545Z
42
+ ACTION:NONE
43
+ END:VALARM
44
+ END:VEVENT
45
+ BEGIN:VEVENT
46
+ STATUS:CONFIRMED
47
+ CREATED:20140731T162556Z
48
+ UID:A50FA12F-BCA9-4822-A61D-E86EB7440A16
49
+ DTEND;VALUE=DATE:20140715
50
+ TRANSP:TRANSPARENT
51
+ SUMMARY:All Day
52
+ LAST-MODIFIED:20140731T162556Z
53
+ DTSTAMP:20140731T164829Z
54
+ DTSTART;VALUE=DATE:20140714
55
+ LOCATION:
56
+ SEQUENCE:18
57
+ BEGIN:VALARM
58
+ X-WR-ALARMUID:295F2CF7-1C48-4E76-A8FC-718A1EBEDB76
59
+ UID:295F2CF7-1C48-4E76-A8FC-718A1EBEDB76
60
+ TRIGGER;VALUE=DATE-TIME:19760401T005545Z
61
+ ACTION:NONE
62
+ END:VALARM
63
+ END:VEVENT
64
+ END:VCALENDAR
@@ -0,0 +1,35 @@
1
+ BEGIN:VCALENDAR
2
+ METHOD:PUBLISH
3
+ VERSION:2.0
4
+ X-WR-CALNAME:TMP
5
+ PRODID:-//Apple Inc.//Mac OS X 10.9.4//EN
6
+ X-APPLE-CALENDAR-COLOR:#0E61B9
7
+ X-WR-TIMEZONE:America/New_York
8
+ CALSCALE:GREGORIAN
9
+ BEGIN:VEVENT
10
+ STATUS:CONFIRMED
11
+ CREATED:20140731T162556Z
12
+ UID:A50FA12F-BCA9-4822-A61D-E86EB7440A16
13
+ DTEND;VALUE=DATE:20140715
14
+ TRANSP:TRANSPARENT
15
+ SUMMARY:Monday
16
+ LAST-MODIFIED:20140731T162556Z
17
+ DTSTAMP:20140731T162628Z
18
+ DTSTART;VALUE=DATE:20140714
19
+ LOCATION:
20
+ SEQUENCE:3
21
+ END:VEVENT
22
+ BEGIN:VEVENT
23
+ STATUS:CONFIRMED
24
+ CREATED:20140731T162556Z
25
+ UID:7C4A5440-ABA5-4B32-A69D-AFD243B39FE1
26
+ DTEND;VALUE=DATE:20140714
27
+ TRANSP:TRANSPARENT
28
+ SUMMARY:Sunday
29
+ LAST-MODIFIED:20140731T162556Z
30
+ DTSTAMP:20140731T162611Z
31
+ DTSTART;VALUE=DATE:20140713
32
+ LOCATION:
33
+ SEQUENCE:5
34
+ END:VEVENT
35
+ END:VCALENDAR
@@ -0,0 +1,64 @@
1
+ BEGIN:VCALENDAR
2
+ METHOD:PUBLISH
3
+ VERSION:2.0
4
+ X-WR-CALNAME:TMP
5
+ PRODID:-//Apple Inc.//Mac OS X 10.9.4//EN
6
+ X-APPLE-CALENDAR-COLOR:#0E61B9
7
+ X-WR-TIMEZONE:America/New_York
8
+ CALSCALE:GREGORIAN
9
+ BEGIN:VTIMEZONE
10
+ TZID:America/New_York
11
+ BEGIN:DAYLIGHT
12
+ TZOFFSETFROM:-0500
13
+ RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
14
+ DTSTART:20070311T020000
15
+ TZNAME:EDT
16
+ TZOFFSETTO:-0400
17
+ END:DAYLIGHT
18
+ BEGIN:STANDARD
19
+ TZOFFSETFROM:-0400
20
+ RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
21
+ DTSTART:20071104T020000
22
+ TZNAME:EST
23
+ TZOFFSETTO:-0500
24
+ END:STANDARD
25
+ END:VTIMEZONE
26
+ BEGIN:VEVENT
27
+ STATUS:CONFIRMED
28
+ CREATED:20140731T162556Z
29
+ UID:7C4A5440-ABA5-4B32-A69D-AFD243B39FE1
30
+ DTEND;TZID=America/New_York:20140714T100000
31
+ TRANSP:OPAQUE
32
+ SUMMARY:9am
33
+ LAST-MODIFIED:20140731T162556Z
34
+ DTSTAMP:20140731T164042Z
35
+ DTSTART;TZID=America/New_York:20140714T090000
36
+ LOCATION:
37
+ SEQUENCE:13
38
+ BEGIN:VALARM
39
+ X-WR-ALARMUID:6F54CD66-F2A9-491D-8892-7E3209F6A2E4
40
+ UID:6F54CD66-F2A9-491D-8892-7E3209F6A2E4
41
+ TRIGGER;VALUE=DATE-TIME:19760401T005545Z
42
+ ACTION:NONE
43
+ END:VALARM
44
+ END:VEVENT
45
+ BEGIN:VEVENT
46
+ STATUS:CONFIRMED
47
+ CREATED:20140731T162556Z
48
+ UID:A50FA12F-BCA9-4822-A61D-E86EB7440A16
49
+ DTEND;TZID=America/New_York:20140714T095900
50
+ TRANSP:OPAQUE
51
+ SUMMARY:9:01-9:59
52
+ LAST-MODIFIED:20140731T162556Z
53
+ DTSTAMP:20140731T164405Z
54
+ DTSTART;TZID=America/New_York:20140714T090100
55
+ LOCATION:
56
+ SEQUENCE:16
57
+ BEGIN:VALARM
58
+ X-WR-ALARMUID:295F2CF7-1C48-4E76-A8FC-718A1EBEDB76
59
+ UID:295F2CF7-1C48-4E76-A8FC-718A1EBEDB76
60
+ TRIGGER;VALUE=DATE-TIME:19760401T005545Z
61
+ ACTION:NONE
62
+ END:VALARM
63
+ END:VEVENT
64
+ END:VCALENDAR
data/spec/parser_spec.rb CHANGED
@@ -1,11 +1,11 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Icalendar::Parser do
4
-
5
- let(:source) { File.read File.join(File.dirname(__FILE__), 'fixtures', 'single_event.ics') }
6
4
  subject { described_class.new source, false }
7
5
 
8
6
  describe '#parse' do
7
+ let(:source) { File.read File.join(File.dirname(__FILE__), 'fixtures', 'single_event.ics') }
8
+
9
9
  it 'returns an array of calendars' do
10
10
  expect(subject.parse).to be_instance_of Array
11
11
  expect(subject.parse.count).to eq 1
@@ -23,4 +23,23 @@ describe Icalendar::Parser do
23
23
  end
24
24
  end
25
25
 
26
- end
26
+ describe '#parse with bad line' do
27
+ let(:source) { File.read File.join(File.dirname(__FILE__), 'fixtures', 'single_event_bad_line.ics') }
28
+
29
+ it 'returns an array of calendars' do
30
+ expect(subject.parse).to be_instance_of Array
31
+ expect(subject.parse.count).to eq 1
32
+ expect(subject.parse[0]).to be_instance_of Icalendar::Calendar
33
+ end
34
+
35
+ it 'properly splits multi-valued lines' do
36
+ event = subject.parse.first.events.first
37
+ expect(event.geo).to eq [37.386013,-122.0829322]
38
+ end
39
+
40
+ it 'saves params' do
41
+ event = subject.parse.first.events.first
42
+ expect(event.dtstart.ical_params).to eq('tzid' => ['US-Mountain'])
43
+ end
44
+ end
45
+ end
@@ -38,6 +38,52 @@ describe Icalendar do
38
38
  end
39
39
  end
40
40
 
41
+ describe 'sorting daily events' do
42
+ let(:source) { File.read File.join(File.dirname(__FILE__), 'fixtures', 'two_day_events.ics') }
43
+ subject { Icalendar.parse(source, true).events }
44
+
45
+ it 'sorts day events' do
46
+ events = subject.sort_by(&:dtstart)
47
+
48
+ expect(events.first.dtstart).to eq ::Date.new(2014, 7, 13)
49
+ expect(events.last.dtstart).to eq ::Date.new(2014, 7, 14)
50
+ end
51
+ end
52
+
53
+ describe 'sorting time events' do
54
+ let(:source) { File.read File.join(File.dirname(__FILE__), 'fixtures', 'two_time_events.ics') }
55
+ subject { Icalendar.parse(source, true).events }
56
+
57
+ it 'sorts time events by start time' do
58
+ events = subject.sort_by(&:dtstart)
59
+
60
+ expect(events.first.dtstart).to eq ::DateTime.new(2014, 7, 14, 9, 0, 0, '-4')
61
+
62
+ expect(events.last.dtstart).to eq ::DateTime.new(2014, 7, 14, 9, 1, 0, '-4')
63
+ expect(events.last.dtend).to eq ::DateTime.new(2014, 7, 14, 9, 59, 0, '-4')
64
+ end
65
+
66
+ it 'sorts time events by end time' do
67
+ events = subject.sort_by(&:dtend)
68
+
69
+ expect(events.first.dtstart).to eq ::DateTime.new(2014, 7, 14, 9, 1, 0, '-4')
70
+ expect(events.first.dtend).to eq ::DateTime.new(2014, 7, 14, 9, 59, 0, '-4')
71
+ expect(events.last.dtstart).to eq ::DateTime.new(2014, 7, 14, 9, 0, 0, '-4')
72
+ end
73
+ end
74
+
75
+ describe 'sorting date / time events' do
76
+ let(:source) { File.read File.join(File.dirname(__FILE__), 'fixtures', 'two_date_time_events.ics') }
77
+ subject { Icalendar.parse(source, true).events }
78
+
79
+ it 'sorts time events' do
80
+ events = subject.sort_by(&:dtstart)
81
+
82
+ expect(events.first.dtstart).to eq ::Date.new(2014, 7, 14)
83
+ expect(events.last.dtstart).to eq ::DateTime.new(2014, 7, 14, 9, 0, 0, '-4')
84
+ end
85
+ end
86
+
41
87
  describe 'non-standard values' do
42
88
  if defined? File::NULL
43
89
  before(:all) { Icalendar.logger = Icalendar::Logger.new File::NULL }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: icalendar
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.2
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Ahearn
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-10 00:00:00.000000000 Z
11
+ date: 2014-09-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -179,7 +179,11 @@ files:
179
179
  - spec/fixtures/nondefault_values.ics
180
180
  - spec/fixtures/nonstandard.ics
181
181
  - spec/fixtures/single_event.ics
182
+ - spec/fixtures/single_event_bad_line.ics
182
183
  - spec/fixtures/timezone.ics
184
+ - spec/fixtures/two_date_time_events.ics
185
+ - spec/fixtures/two_day_events.ics
186
+ - spec/fixtures/two_time_events.ics
183
187
  - spec/freebusy_spec.rb
184
188
  - spec/journal_spec.rb
185
189
  - spec/parser_spec.rb
@@ -200,6 +204,9 @@ metadata: {}
200
204
  post_install_message: |
201
205
  HEADS UP! iCalendar 2.0 is not backwards-compatible with 1.x. Please see the README for the new syntax
202
206
 
207
+ HEADS UP! icalendar 2.2.0 switches to non-strict parsing as default. Please see the README if you
208
+ rely on strict parsing for information on how to enable it.
209
+
203
210
  ActiveSupport is required for TimeWithZone support, but not required for general use.
204
211
  rdoc_options: []
205
212
  require_paths:
@@ -227,7 +234,11 @@ test_files:
227
234
  - spec/fixtures/nondefault_values.ics
228
235
  - spec/fixtures/nonstandard.ics
229
236
  - spec/fixtures/single_event.ics
237
+ - spec/fixtures/single_event_bad_line.ics
230
238
  - spec/fixtures/timezone.ics
239
+ - spec/fixtures/two_date_time_events.ics
240
+ - spec/fixtures/two_day_events.ics
241
+ - spec/fixtures/two_time_events.ics
231
242
  - spec/freebusy_spec.rb
232
243
  - spec/journal_spec.rb
233
244
  - spec/parser_spec.rb