icalendar 1.1.5 → 1.1.6
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.
- data/History.txt +4 -0
- data/Rakefile +5 -0
- data/lib/icalendar/base.rb +1 -1
- data/lib/icalendar/calendar.rb +9 -9
- data/lib/icalendar/component.rb +1 -1
- data/lib/icalendar/component/event.rb +8 -8
- data/lib/icalendar/component/timezone.rb +6 -6
- data/lib/icalendar/component/todo.rb +2 -2
- data/lib/meta.rb +3 -3
- data/test/component/test_todo.rb +26 -8
- data/test/test_component.rb +0 -1
- data/test/test_conversions.rb +16 -16
- data/test/test_helper.rb +4 -0
- metadata +47 -17
data/History.txt
CHANGED
data/Rakefile
CHANGED
|
@@ -19,6 +19,11 @@ $hoe = Hoe.spec 'icalendar' do
|
|
|
19
19
|
self.readme_file = "README.rdoc"
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
+
if ENV['UNDER_HUDSON']
|
|
23
|
+
require 'ci/reporter/rake/test_unit'
|
|
24
|
+
task :test => ["ci:setup:testunit"]
|
|
25
|
+
end
|
|
26
|
+
|
|
22
27
|
require 'newgem/tasks'
|
|
23
28
|
Dir['tasks/**/*.rake'].each { |t| load t }
|
|
24
29
|
|
data/lib/icalendar/base.rb
CHANGED
data/lib/icalendar/calendar.rb
CHANGED
|
@@ -29,11 +29,11 @@ module Icalendar
|
|
|
29
29
|
e = Event.new
|
|
30
30
|
# Note: I'm not sure this is the best way to pass this down, but it works
|
|
31
31
|
e.tzid = self.timezones[0].tzid if self.timezones.length > 0
|
|
32
|
-
|
|
32
|
+
|
|
33
33
|
self.add_component e
|
|
34
34
|
|
|
35
35
|
if block
|
|
36
|
-
e.instance_eval
|
|
36
|
+
e.instance_eval(&block)
|
|
37
37
|
if e.tzid
|
|
38
38
|
e.dtstart.ical_params = { "TZID" => e.tzid }
|
|
39
39
|
e.dtend.ical_params = { "TZID" => e.tzid }
|
|
@@ -42,7 +42,7 @@ module Icalendar
|
|
|
42
42
|
|
|
43
43
|
e
|
|
44
44
|
end
|
|
45
|
-
|
|
45
|
+
|
|
46
46
|
def find_event(uid)
|
|
47
47
|
self.events.find {|e| e.uid == uid}
|
|
48
48
|
end
|
|
@@ -51,7 +51,7 @@ module Icalendar
|
|
|
51
51
|
e = Todo.new
|
|
52
52
|
self.add_component e
|
|
53
53
|
|
|
54
|
-
e.instance_eval
|
|
54
|
+
e.instance_eval(&block) if block
|
|
55
55
|
|
|
56
56
|
e
|
|
57
57
|
end
|
|
@@ -59,12 +59,12 @@ module Icalendar
|
|
|
59
59
|
def find_todo(uid)
|
|
60
60
|
self.todos.find {|t| t.uid == uid}
|
|
61
61
|
end
|
|
62
|
-
|
|
62
|
+
|
|
63
63
|
def journal(&block)
|
|
64
64
|
e = Journal.new
|
|
65
65
|
self.add_component e
|
|
66
66
|
|
|
67
|
-
e.instance_eval
|
|
67
|
+
e.instance_eval(&block) if block
|
|
68
68
|
|
|
69
69
|
e
|
|
70
70
|
end
|
|
@@ -77,7 +77,7 @@ module Icalendar
|
|
|
77
77
|
e = Freebusy.new
|
|
78
78
|
self.add_component e
|
|
79
79
|
|
|
80
|
-
e.instance_eval
|
|
80
|
+
e.instance_eval(&block) if block
|
|
81
81
|
|
|
82
82
|
e
|
|
83
83
|
end
|
|
@@ -90,11 +90,11 @@ module Icalendar
|
|
|
90
90
|
e = Timezone.new
|
|
91
91
|
self.add_component e
|
|
92
92
|
|
|
93
|
-
e.instance_eval
|
|
93
|
+
e.instance_eval(&block) if block
|
|
94
94
|
|
|
95
95
|
e
|
|
96
96
|
end
|
|
97
|
-
|
|
97
|
+
|
|
98
98
|
# The "PUBLISH" method in a "VEVENT" calendar component is an
|
|
99
99
|
# unsolicited posting of an iCalendar object. Any CU may add published
|
|
100
100
|
# components to their calendar. The "Organizer" MUST be present in a
|
data/lib/icalendar/component.rb
CHANGED
|
@@ -144,7 +144,7 @@ module Icalendar
|
|
|
144
144
|
|
|
145
145
|
# Property value
|
|
146
146
|
value = ":#{val.to_ical}"
|
|
147
|
-
value = escape_chars(value) unless
|
|
147
|
+
value = escape_chars(value) unless ["rrule", "categories"].include?(key)
|
|
148
148
|
add_sliced_text(s, prelude + value)
|
|
149
149
|
else
|
|
150
150
|
prelude = "#{key.gsub(/_/, '-').upcase}"
|
|
@@ -19,7 +19,7 @@ module Icalendar
|
|
|
19
19
|
## Single instance properties
|
|
20
20
|
|
|
21
21
|
# Access classification (PUBLIC, PRIVATE, CONFIDENTIAL...)
|
|
22
|
-
ical_property :ip_class, :klass
|
|
22
|
+
ical_property :ip_class, :klass
|
|
23
23
|
|
|
24
24
|
# Date & time of creation
|
|
25
25
|
ical_property :created
|
|
@@ -29,13 +29,13 @@ module Icalendar
|
|
|
29
29
|
|
|
30
30
|
# Specifies the timezone for the event
|
|
31
31
|
attr_accessor :tzid
|
|
32
|
-
|
|
32
|
+
|
|
33
33
|
# Specifies date-time when calendar component begins
|
|
34
34
|
ical_property :dtstart, :start
|
|
35
35
|
|
|
36
36
|
# Latitude & longitude for specified activity
|
|
37
37
|
ical_property :geo, :geo_location
|
|
38
|
-
|
|
38
|
+
|
|
39
39
|
# Date & time this item was last modified
|
|
40
40
|
ical_property :last_modified
|
|
41
41
|
|
|
@@ -67,7 +67,7 @@ module Icalendar
|
|
|
67
67
|
ical_property :recurrence_id, :recurid
|
|
68
68
|
|
|
69
69
|
## Single but mutually exclusive properties (Not testing though)
|
|
70
|
-
|
|
70
|
+
|
|
71
71
|
# Specifies a date and time that this item ends
|
|
72
72
|
ical_property :dtend, :end
|
|
73
73
|
|
|
@@ -81,7 +81,7 @@ module Icalendar
|
|
|
81
81
|
|
|
82
82
|
# Defines an attendee for this calendar item
|
|
83
83
|
ical_multiline_property :attendee, :attendee, :attendees
|
|
84
|
-
|
|
84
|
+
|
|
85
85
|
# Defines the categories for a calendar component (school, work...)
|
|
86
86
|
ical_multi_property :categories, :category, :categories
|
|
87
87
|
|
|
@@ -102,7 +102,7 @@ module Icalendar
|
|
|
102
102
|
# recurring calendar item.
|
|
103
103
|
ical_multi_property :rdate, :recurrence_date, :recurrence_dates
|
|
104
104
|
ical_multi_property :rrule, :recurrence_rule, :recurrence_rules
|
|
105
|
-
|
|
105
|
+
|
|
106
106
|
def initialize()
|
|
107
107
|
super("VEVENT")
|
|
108
108
|
|
|
@@ -116,11 +116,11 @@ module Icalendar
|
|
|
116
116
|
a = Alarm.new
|
|
117
117
|
self.add a
|
|
118
118
|
|
|
119
|
-
a.instance_eval
|
|
119
|
+
a.instance_eval(&block) if block
|
|
120
120
|
|
|
121
121
|
a
|
|
122
122
|
end
|
|
123
|
-
|
|
123
|
+
|
|
124
124
|
def occurrences_starting(time)
|
|
125
125
|
recurrence_rules.first.occurrences_of_event_starting(self, time)
|
|
126
126
|
end
|
|
@@ -28,7 +28,7 @@ module Icalendar
|
|
|
28
28
|
ical_property :tzoffsetfrom, :timezone_offset_from
|
|
29
29
|
ical_property :tzid, :timezone_id
|
|
30
30
|
ical_property :tzname, :timezone_name
|
|
31
|
-
|
|
31
|
+
|
|
32
32
|
ical_property :created
|
|
33
33
|
ical_property :last_modified
|
|
34
34
|
ical_property :timestamp
|
|
@@ -57,18 +57,18 @@ module Icalendar
|
|
|
57
57
|
s
|
|
58
58
|
end
|
|
59
59
|
end
|
|
60
|
-
|
|
60
|
+
|
|
61
61
|
|
|
62
62
|
def initialize(name = "VTIMEZONE")
|
|
63
63
|
super(name)
|
|
64
64
|
end
|
|
65
|
-
|
|
65
|
+
|
|
66
66
|
# Allow block syntax for declaration of standard and daylight components of timezone
|
|
67
67
|
def standard(&block)
|
|
68
68
|
e = Standard.new
|
|
69
69
|
self.add_component e
|
|
70
70
|
|
|
71
|
-
e.instance_eval
|
|
71
|
+
e.instance_eval(&block) if block
|
|
72
72
|
|
|
73
73
|
e
|
|
74
74
|
end
|
|
@@ -77,14 +77,14 @@ module Icalendar
|
|
|
77
77
|
e = Daylight.new
|
|
78
78
|
self.add_component e
|
|
79
79
|
|
|
80
|
-
e.instance_eval
|
|
80
|
+
e.instance_eval(&block) if block
|
|
81
81
|
|
|
82
82
|
e
|
|
83
83
|
end
|
|
84
84
|
end
|
|
85
85
|
|
|
86
86
|
# A Standard component is a sub-component of the Timezone component which
|
|
87
|
-
# is used to describe the standard time offset.
|
|
87
|
+
# is used to describe the standard time offset.
|
|
88
88
|
class Standard < Timezone
|
|
89
89
|
|
|
90
90
|
def initialize()
|
|
@@ -25,10 +25,10 @@ module Icalendar
|
|
|
25
25
|
ical_property :last_modified
|
|
26
26
|
ical_property :location
|
|
27
27
|
ical_property :organizer
|
|
28
|
-
ical_property :percent
|
|
28
|
+
ical_property :percent_complete, :percent
|
|
29
29
|
ical_property :priority
|
|
30
30
|
ical_property :recurid, :recurrence_id
|
|
31
|
-
ical_property :
|
|
31
|
+
ical_property :sequence, :seq
|
|
32
32
|
ical_property :status
|
|
33
33
|
ical_property :summary
|
|
34
34
|
ical_property :uid, :user_id
|
data/lib/meta.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# A set of methods to help create meta-programming gizmos.
|
|
2
2
|
class Object
|
|
3
|
-
# The metaclass is the singleton behind every object.
|
|
3
|
+
# The metaclass is the singleton behind every object.
|
|
4
4
|
def metaclass
|
|
5
5
|
class << self
|
|
6
6
|
self
|
|
@@ -8,8 +8,8 @@ class Object
|
|
|
8
8
|
end
|
|
9
9
|
|
|
10
10
|
# Evaluates the block in the context of the metaclass
|
|
11
|
-
def meta_eval
|
|
12
|
-
metaclass.instance_eval
|
|
11
|
+
def meta_eval(&blk)
|
|
12
|
+
metaclass.instance_eval(&blk)
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
# Acts like an include except it adds the module's methods
|
data/test/component/test_todo.rb
CHANGED
|
@@ -1,13 +1,31 @@
|
|
|
1
|
-
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper.rb'
|
|
2
|
+
|
|
3
|
+
require 'date'
|
|
2
4
|
|
|
3
5
|
class TestTodo < Test::Unit::TestCase
|
|
6
|
+
include Icalendar
|
|
7
|
+
|
|
8
|
+
def test_todo_fields
|
|
9
|
+
|
|
10
|
+
cal = Calendar.new
|
|
11
|
+
|
|
12
|
+
t = cal.todo do
|
|
13
|
+
summary "Plan next vacations"
|
|
14
|
+
description "Let's have a break"
|
|
15
|
+
percent 50
|
|
16
|
+
seq 1
|
|
17
|
+
add_category "TRAVEL"
|
|
18
|
+
add_category "SPORTS"
|
|
19
|
+
end
|
|
4
20
|
|
|
5
|
-
|
|
6
|
-
@cal = Icalendar::Calendar.new
|
|
7
|
-
@todo = Icalendar::Todo.new
|
|
8
|
-
end
|
|
21
|
+
calString = cal.to_ical
|
|
9
22
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
23
|
+
assert_match(/PERCENT-COMPLETE:50/, calString)
|
|
24
|
+
assert_match(/DESCRIPTION:Let's have a break/, calString)
|
|
25
|
+
assert_match(/CATEGORIES:TRAVEL,SPORTS/, calString)
|
|
26
|
+
assert_match(/SEQUENCE:1/, calString)
|
|
27
|
+
|
|
28
|
+
end
|
|
13
29
|
end
|
|
30
|
+
|
|
31
|
+
|
data/test/test_component.rb
CHANGED
data/test/test_conversions.rb
CHANGED
|
@@ -14,7 +14,7 @@ CALSCALE:GREGORIAN
|
|
|
14
14
|
PRODID:iCalendar-Ruby
|
|
15
15
|
VERSION:2.0
|
|
16
16
|
BEGIN:VEVENT
|
|
17
|
-
CATEGORIES:foo
|
|
17
|
+
CATEGORIES:foo,bar,baz
|
|
18
18
|
DESCRIPTION:desc
|
|
19
19
|
DTSTAMP:20060720T174052
|
|
20
20
|
DTSTART:20060720
|
|
@@ -33,7 +33,7 @@ EOS
|
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
def test_to_ical_conversions
|
|
36
|
-
@cal.event do
|
|
36
|
+
@cal.event do
|
|
37
37
|
# String
|
|
38
38
|
description "desc"
|
|
39
39
|
|
|
@@ -42,17 +42,17 @@ EOS
|
|
|
42
42
|
|
|
43
43
|
# Float by way of Geo class
|
|
44
44
|
geo(Geo.new(46.01, 8.57))
|
|
45
|
-
|
|
45
|
+
|
|
46
46
|
# Array
|
|
47
47
|
categories ["foo", "bar"]
|
|
48
48
|
add_category "baz"
|
|
49
49
|
|
|
50
|
-
# Last Modified
|
|
50
|
+
# Last Modified
|
|
51
51
|
last_modified DateTime.parse("1996-08-17T13:30:00")
|
|
52
52
|
|
|
53
53
|
# URI
|
|
54
54
|
organizer(URI::MailTo.build(['joe@example.com', 'subject=Ruby']))
|
|
55
|
-
|
|
55
|
+
|
|
56
56
|
# Date
|
|
57
57
|
start Date.parse("2006-07-20")
|
|
58
58
|
|
|
@@ -64,13 +64,13 @@ EOS
|
|
|
64
64
|
|
|
65
65
|
uid "foobar"
|
|
66
66
|
end
|
|
67
|
-
|
|
67
|
+
|
|
68
68
|
assert_equal(RESULT.gsub("\n", "\r\n"), @cal.to_ical)
|
|
69
69
|
end
|
|
70
70
|
|
|
71
71
|
def test_to_ical_folding
|
|
72
72
|
@cal.x_wr_calname = 'Test Long Description'
|
|
73
|
-
|
|
73
|
+
|
|
74
74
|
@cal.event do
|
|
75
75
|
url 'http://test.com/events/644'
|
|
76
76
|
dtend DateTime.parse('20061215T180000')
|
|
@@ -80,18 +80,18 @@ EOS
|
|
|
80
80
|
uid 'foobar'
|
|
81
81
|
summary 'DigiWorld 2006'
|
|
82
82
|
|
|
83
|
-
description "FULL DETAILS:\nhttp://test.com/events/570\n\n" +
|
|
84
|
-
"Cary Brothers walks the same musical ground as Pete Yorn, Nick Drake, " +
|
|
85
|
-
"Jeff Buckley and others; crafting emotional melodies, with strong vocals " +
|
|
86
|
-
"and thoughtful lyrics. Brett Dennen has "that thing." " +
|
|
87
|
-
"Inspired fans describe it: "lush shimmering vocals, an intricately " +
|
|
88
|
-
"groovin' guitar style, a lyrical beauty rare in a young songwriter," +
|
|
89
|
-
"" and "this soulful blend of everything that feels good." " +
|
|
83
|
+
description "FULL DETAILS:\nhttp://test.com/events/570\n\n" +
|
|
84
|
+
"Cary Brothers walks the same musical ground as Pete Yorn, Nick Drake, " +
|
|
85
|
+
"Jeff Buckley and others; crafting emotional melodies, with strong vocals " +
|
|
86
|
+
"and thoughtful lyrics. Brett Dennen has "that thing." " +
|
|
87
|
+
"Inspired fans describe it: "lush shimmering vocals, an intricately " +
|
|
88
|
+
"groovin' guitar style, a lyrical beauty rare in a young songwriter," +
|
|
89
|
+
"" and "this soulful blend of everything that feels good." " +
|
|
90
90
|
"Rising up around him is music; transcending genres, genders and generations."
|
|
91
91
|
end
|
|
92
|
-
|
|
92
|
+
|
|
93
93
|
folded = File.read(File.join(File.dirname(__FILE__), 'fixtures/folding.ics')).gsub("\n", "\r\n")
|
|
94
94
|
assert_equal(folded, @cal.to_ical)
|
|
95
95
|
end
|
|
96
|
-
|
|
96
|
+
|
|
97
97
|
end
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: icalendar
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
|
|
4
|
+
hash: 31
|
|
5
|
+
prerelease: false
|
|
6
|
+
segments:
|
|
7
|
+
- 1
|
|
8
|
+
- 1
|
|
9
|
+
- 6
|
|
10
|
+
version: 1.1.6
|
|
5
11
|
platform: ruby
|
|
6
12
|
authors:
|
|
7
13
|
- Sean Dague
|
|
@@ -9,39 +15,57 @@ autorequire:
|
|
|
9
15
|
bindir: bin
|
|
10
16
|
cert_chain: []
|
|
11
17
|
|
|
12
|
-
date:
|
|
18
|
+
date: 2011-03-10 00:00:00 -05:00
|
|
13
19
|
default_executable:
|
|
14
20
|
dependencies:
|
|
15
21
|
- !ruby/object:Gem::Dependency
|
|
16
22
|
name: rubyforge
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
23
|
+
prerelease: false
|
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
|
25
|
+
none: false
|
|
20
26
|
requirements:
|
|
21
27
|
- - ">="
|
|
22
28
|
- !ruby/object:Gem::Version
|
|
29
|
+
hash: 9
|
|
30
|
+
segments:
|
|
31
|
+
- 2
|
|
32
|
+
- 0
|
|
33
|
+
- 3
|
|
23
34
|
version: 2.0.3
|
|
24
|
-
|
|
35
|
+
type: :development
|
|
36
|
+
version_requirements: *id001
|
|
25
37
|
- !ruby/object:Gem::Dependency
|
|
26
38
|
name: gemcutter
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
39
|
+
prerelease: false
|
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
|
41
|
+
none: false
|
|
30
42
|
requirements:
|
|
31
43
|
- - ">="
|
|
32
44
|
- !ruby/object:Gem::Version
|
|
45
|
+
hash: 19
|
|
46
|
+
segments:
|
|
47
|
+
- 0
|
|
48
|
+
- 3
|
|
49
|
+
- 0
|
|
33
50
|
version: 0.3.0
|
|
34
|
-
|
|
51
|
+
type: :development
|
|
52
|
+
version_requirements: *id002
|
|
35
53
|
- !ruby/object:Gem::Dependency
|
|
36
54
|
name: hoe
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
55
|
+
prerelease: false
|
|
56
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
|
57
|
+
none: false
|
|
40
58
|
requirements:
|
|
41
59
|
- - ">="
|
|
42
60
|
- !ruby/object:Gem::Version
|
|
61
|
+
hash: 27
|
|
62
|
+
segments:
|
|
63
|
+
- 2
|
|
64
|
+
- 5
|
|
65
|
+
- 0
|
|
43
66
|
version: 2.5.0
|
|
44
|
-
|
|
67
|
+
type: :development
|
|
68
|
+
version_requirements: *id003
|
|
45
69
|
description: |-
|
|
46
70
|
This is a Ruby library for dealing with iCalendar files. Rather than
|
|
47
71
|
explaining myself, here is the introduction from RFC-2445, which
|
|
@@ -155,21 +179,27 @@ rdoc_options:
|
|
|
155
179
|
require_paths:
|
|
156
180
|
- lib
|
|
157
181
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
182
|
+
none: false
|
|
158
183
|
requirements:
|
|
159
184
|
- - ">="
|
|
160
185
|
- !ruby/object:Gem::Version
|
|
186
|
+
hash: 3
|
|
187
|
+
segments:
|
|
188
|
+
- 0
|
|
161
189
|
version: "0"
|
|
162
|
-
version:
|
|
163
190
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
191
|
+
none: false
|
|
164
192
|
requirements:
|
|
165
193
|
- - ">="
|
|
166
194
|
- !ruby/object:Gem::Version
|
|
195
|
+
hash: 3
|
|
196
|
+
segments:
|
|
197
|
+
- 0
|
|
167
198
|
version: "0"
|
|
168
|
-
version:
|
|
169
199
|
requirements: []
|
|
170
200
|
|
|
171
201
|
rubyforge_project: icalendar
|
|
172
|
-
rubygems_version: 1.3.
|
|
202
|
+
rubygems_version: 1.3.7
|
|
173
203
|
signing_key:
|
|
174
204
|
specification_version: 3
|
|
175
205
|
summary: This is a Ruby library for dealing with iCalendar files
|