icalendar 2.4.0 → 2.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.txt +6 -1
- data/README.md +1 -1
- data/lib/icalendar.rb +1 -1
- data/lib/icalendar/component.rb +32 -4
- data/lib/icalendar/parser.rb +4 -3
- data/lib/icalendar/version.rb +1 -1
- data/spec/fixtures/single_event.ics +2 -1
- data/spec/fixtures/two_events.ics +28 -0
- data/spec/parser_spec.rb +13 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 617189d256108d77d8cbf965621d324794e5ceb6
|
4
|
+
data.tar.gz: 10041e3a5a825c812dc849d6ddc2997b5fcc5776
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ae3cf91f03aec36792d2f8a90b82265a71b66971bb535c6e41018bb6c611680e49d2535a0d165535011fffc85101447d545873d1f389960a4adb95e528891b59
|
7
|
+
data.tar.gz: 59bb0240f2ff661a885792bacc976b273c2b10d234bc3cb32ca5c1f26031418d4f4ac58f6971dc1a2c6957c9074408674c557b98686dee83bdc6e24123efa1d5
|
data/History.txt
CHANGED
@@ -1,4 +1,9 @@
|
|
1
|
-
=== 2.4.
|
1
|
+
=== 2.4.1 2016-09-03
|
2
|
+
* Fix parsing multiple calendars or components in same file - Patrick Schnetger
|
3
|
+
* Fix multi-byte folding bug - Niels Laukens
|
4
|
+
* Fix typos across the code - Martin Edenhofer & yuuji.yaginuma
|
5
|
+
|
6
|
+
=== 2.4.0 2016-07-04
|
2
7
|
* Enable parsing individual ICalendar components - Patrick Schnetger
|
3
8
|
* many bug fixes. Thanks to Quan Sun, Garry Shutler, Ryan Bigg, Patrick Schnetger and others
|
4
9
|
* README/documentation updates. Thanks to JonMidhir and Hendrik Sollich
|
data/README.md
CHANGED
@@ -97,7 +97,7 @@ Sometimes we don't care if an event's start or end are `Date` or `DateTime` obje
|
|
97
97
|
```ruby
|
98
98
|
event = cal.event do |e|
|
99
99
|
e.dtstart = Icalendar::Values::DateOrDateTime.new('20140924').call
|
100
|
-
e.dtend = Icalendar::Values::DateOrDateTime.new('
|
100
|
+
e.dtend = Icalendar::Values::DateOrDateTime.new('20140925').call
|
101
101
|
e.summary = 'This is an all-day event, because DateOrDateTime will return Dates'
|
102
102
|
end
|
103
103
|
```
|
data/lib/icalendar.rb
CHANGED
@@ -13,7 +13,7 @@ module Icalendar
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def self.parse(source, single = false)
|
16
|
-
warn "**** DEPRECATION WARNING ****\
|
16
|
+
warn "**** DEPRECATION WARNING ****\nIcalendar.parse will be removed. Please switch to Icalendar::Calendar.parse."
|
17
17
|
calendars = Parser.new(source).parse
|
18
18
|
single ? calendars.first : calendars
|
19
19
|
end
|
data/lib/icalendar/component.rb
CHANGED
@@ -12,7 +12,7 @@ module Icalendar
|
|
12
12
|
|
13
13
|
def self.parse(source)
|
14
14
|
parser = Parser.new(source)
|
15
|
-
parser.
|
15
|
+
parser.component_class = self
|
16
16
|
parser.parse
|
17
17
|
end
|
18
18
|
|
@@ -56,9 +56,37 @@ module Icalendar
|
|
56
56
|
prop_name.gsub(/\Aip_/, '').gsub('_', '-').upcase
|
57
57
|
end
|
58
58
|
|
59
|
-
def ical_fold(
|
60
|
-
|
61
|
-
|
59
|
+
def ical_fold(long_line, indent = "\x20")
|
60
|
+
# rfc2445 says:
|
61
|
+
# Lines of text SHOULD NOT be longer than 75 octets, excluding the line
|
62
|
+
# break. Long content lines SHOULD be split into a multiple line
|
63
|
+
# representations using a line "folding" technique. That is, a long
|
64
|
+
# line can be split between any two characters by inserting a CRLF
|
65
|
+
# immediately followed by a single linear white space character (i.e.,
|
66
|
+
# SPACE, US-ASCII decimal 32 or HTAB, US-ASCII decimal 9). Any sequence
|
67
|
+
# of CRLF followed immediately by a single linear white space character
|
68
|
+
# is ignored (i.e., removed) when processing the content type.
|
69
|
+
#
|
70
|
+
# Note the useage of "octets" and "characters": a line should not be longer
|
71
|
+
# than 75 octets, but you need to split between characters, not bytes.
|
72
|
+
# This is challanging with Unicode composing accents, for example.
|
73
|
+
|
74
|
+
chars = long_line.scan(/\P{M}\p{M}*/u) # split in graphenes
|
75
|
+
folded = ['']
|
76
|
+
bytes = 0
|
77
|
+
while chars.count > 0
|
78
|
+
c = chars.shift
|
79
|
+
cb = c.bytes.count
|
80
|
+
if bytes + cb > Icalendar::MAX_LINE_LENGTH
|
81
|
+
# Split here
|
82
|
+
folded.push "#{indent}"
|
83
|
+
bytes = indent.bytes.count
|
84
|
+
end
|
85
|
+
folded[-1] += c
|
86
|
+
bytes += cb
|
87
|
+
end
|
88
|
+
|
89
|
+
folded.join("\r\n")
|
62
90
|
end
|
63
91
|
|
64
92
|
def ical_components
|
data/lib/icalendar/parser.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Icalendar
|
2
2
|
|
3
3
|
class Parser
|
4
|
-
attr_writer :
|
4
|
+
attr_writer :component_class
|
5
5
|
attr_reader :source, :strict
|
6
6
|
|
7
7
|
def initialize(source, strict = false)
|
@@ -23,6 +23,7 @@ module Icalendar
|
|
23
23
|
read_in_data
|
24
24
|
components = []
|
25
25
|
while (fields = next_fields)
|
26
|
+
component = component_class.new
|
26
27
|
if fields[:name] == 'begin' && fields[:value].downcase == component.ical_name.downcase
|
27
28
|
components << parse_component(component)
|
28
29
|
end
|
@@ -93,8 +94,8 @@ module Icalendar
|
|
93
94
|
|
94
95
|
private
|
95
96
|
|
96
|
-
def
|
97
|
-
@
|
97
|
+
def component_class
|
98
|
+
@component_class ||= Icalendar::Calendar
|
98
99
|
end
|
99
100
|
|
100
101
|
def parse_component(component)
|
data/lib/icalendar/version.rb
CHANGED
@@ -12,7 +12,8 @@ GEO:37.386013;-122.0829322
|
|
12
12
|
ORGANIZER:mailto:joebob@random.net
|
13
13
|
PRIORITY:2
|
14
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.
|
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.
|
16
17
|
ATTACH:http://bush.sucks.org/impeach/him.rhtml
|
17
18
|
ATTACH:http://corporations-dominate.existence.net/why.rhtml
|
18
19
|
RDATE;TZID=US-Mountain:20050121T170000,20050122T170000
|
@@ -0,0 +1,28 @@
|
|
1
|
+
BEGIN:VEVENT
|
2
|
+
DTSTAMP:20050118T211523Z
|
3
|
+
UID:bsuidfortestabc123
|
4
|
+
DTSTART;TZID=US-Mountain:20050120T170000
|
5
|
+
DTEND;TZID=US-Mountain:20050120T184500
|
6
|
+
CLASS:PRIVATE
|
7
|
+
GEO:37.386013;-122.0829322
|
8
|
+
ORGANIZER:mailto:joebob@random.net
|
9
|
+
PRIORITY:2
|
10
|
+
SUMMARY:This is a really long summary to test the method of unfolding lines
|
11
|
+
\, so I'm just going to make it a whole bunch of lines.
|
12
|
+
ATTACH:http://bush.sucks.org/impeach/him.rhtml
|
13
|
+
ATTACH:http://corporations-dominate.existence.net/why.rhtml
|
14
|
+
RDATE;TZID=US-Mountain:20050121T170000,20050122T170000
|
15
|
+
X-TEST-COMPONENT;QTEST="Hello, World":Shouldn't double double quotes
|
16
|
+
END:VEVENT
|
17
|
+
BEGIN:VEVENT
|
18
|
+
DTSTAMP:20110118T211523Z
|
19
|
+
UID:uid-1234-uid-4321
|
20
|
+
DTSTART;TZID=US-Mountain:20110120T170000
|
21
|
+
DTEND;TZID=US-Mountain:20110120T184500
|
22
|
+
CLASS:PRIVATE
|
23
|
+
GEO:37.386013;-122.0829322
|
24
|
+
ORGANIZER:mailto:jmera@jmera.human
|
25
|
+
PRIORITY:2
|
26
|
+
SUMMARY:This is a very short summary.
|
27
|
+
RDATE;TZID=US-Mountain:20110121T170000,20110122T170000
|
28
|
+
END:VEVENT
|
data/spec/parser_spec.rb
CHANGED
@@ -35,7 +35,7 @@ describe Icalendar::Parser do
|
|
35
35
|
context 'event.ics' do
|
36
36
|
let(:fn) { 'event.ics' }
|
37
37
|
|
38
|
-
before { subject.
|
38
|
+
before { subject.component_class = Icalendar::Event }
|
39
39
|
|
40
40
|
it 'returns an array of events' do
|
41
41
|
expect(subject.parse).to be_instance_of Array
|
@@ -43,6 +43,18 @@ describe Icalendar::Parser do
|
|
43
43
|
expect(subject.parse[0]).to be_instance_of Icalendar::Event
|
44
44
|
end
|
45
45
|
end
|
46
|
+
context 'events.ics' do
|
47
|
+
let(:fn) { 'two_events.ics' }
|
48
|
+
|
49
|
+
before { subject.component_class = Icalendar::Event }
|
50
|
+
|
51
|
+
it 'returns an array of events' do
|
52
|
+
events = subject.parse
|
53
|
+
expect(events.count).to be 2
|
54
|
+
expect(events.first.uid).to eq("bsuidfortestabc123")
|
55
|
+
expect(events.last.uid).to eq("uid-1234-uid-4321")
|
56
|
+
end
|
57
|
+
end
|
46
58
|
end
|
47
59
|
|
48
60
|
describe '#parse with bad line' do
|
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.4.
|
4
|
+
version: 2.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Ahearn
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-09-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -204,6 +204,7 @@ files:
|
|
204
204
|
- spec/fixtures/timezone.ics
|
205
205
|
- spec/fixtures/two_date_time_events.ics
|
206
206
|
- spec/fixtures/two_day_events.ics
|
207
|
+
- spec/fixtures/two_events.ics
|
207
208
|
- spec/fixtures/two_time_events.ics
|
208
209
|
- spec/freebusy_spec.rb
|
209
210
|
- spec/journal_spec.rb
|
@@ -245,7 +246,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
245
246
|
version: '0'
|
246
247
|
requirements: []
|
247
248
|
rubyforge_project:
|
248
|
-
rubygems_version: 2.
|
249
|
+
rubygems_version: 2.6.6
|
249
250
|
signing_key:
|
250
251
|
specification_version: 4
|
251
252
|
summary: A ruby implementation of the iCalendar specification (RFC-5545).
|
@@ -264,6 +265,7 @@ test_files:
|
|
264
265
|
- spec/fixtures/timezone.ics
|
265
266
|
- spec/fixtures/two_date_time_events.ics
|
266
267
|
- spec/fixtures/two_day_events.ics
|
268
|
+
- spec/fixtures/two_events.ics
|
267
269
|
- spec/fixtures/two_time_events.ics
|
268
270
|
- spec/freebusy_spec.rb
|
269
271
|
- spec/journal_spec.rb
|