icalendar 1.1.5 → 1.1.6
Sign up to get free protection for your applications and to get access to all the features.
- 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
|