rubyredrick-ri_cal 0.0.7 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +7 -0
- data/Manifest.txt +2 -2
- data/lib/ri_cal/core_extensions/time/tzid_access.rb +6 -4
- data/lib/ri_cal/occurrence_enumerator.rb +28 -11
- data/lib/ri_cal/property_value/date.rb +22 -1
- data/lib/ri_cal/property_value/duration.rb +2 -1
- data/lib/ri_cal/property_value/occurrence_list.rb +4 -0
- data/lib/ri_cal/property_value/recurrence_rule/enumerator.rb +9 -6
- data/lib/ri_cal.rb +1 -1
- data/ri_cal.gemspec +3 -3
- data/spec/ri_cal/component/event_spec.rb +27 -0
- data/spec/ri_cal/occurrence_enumerator_spec.rb +57 -11
- data/spec/ri_cal/property_value/date_spec.rb +36 -4
- data/spec/ri_cal/property_value/duration_spec.rb +68 -32
- data/tasks/spec.rake +1 -0
- metadata +4 -4
data/History.txt
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
=== 0.0.8
|
2
|
+
* Fixed http://rick_denatale.lighthouseapp.com/projects/30941-ri_cal/tickets/1-occurrence-lists-not-picking-up-timewithzone-identifier#ticket-1-2
|
3
|
+
* Fixed http://rick_denatale.lighthouseapp.com/projects/30941/tickets/2-date-property-subtraction-bug
|
4
|
+
* Fixed http://rick_denatale.lighthouseapp.com/projects/30941/tickets/3-fwd-ri_cal-question
|
5
|
+
Components with no recurrence rules or rdate properties failed on enumeration, they now
|
6
|
+
will enumerate a single occurrence
|
7
|
+
|
1
8
|
=== 0.0.7
|
2
9
|
* Fixed a bug relating to properly recognizing ActiveRecord::TimeWithZone
|
3
10
|
* DATETIME propertyvalues will now return an instance of TimeWithZone instead of DateTime when
|
data/Manifest.txt
CHANGED
@@ -121,7 +121,7 @@ spec/ri_cal/required_timezones_spec.rb
|
|
121
121
|
spec/ri_cal_spec.rb
|
122
122
|
spec/spec.opts
|
123
123
|
spec/spec_helper.rb
|
124
|
-
tasks/ri_cal.rake
|
125
|
-
tasks/spec.rake
|
126
124
|
tasks/gem_loader/load_active_support.rb
|
127
125
|
tasks/gem_loader/load_tzinfo_gem.rb
|
126
|
+
tasks/ri_cal.rake
|
127
|
+
tasks/spec.rake
|
@@ -17,12 +17,12 @@ module RiCal
|
|
17
17
|
self.tzid = time_zone_identifier
|
18
18
|
self
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
# Predicate indicating whether or not the instance represents a floating time
|
22
22
|
def has_floating_timezone?
|
23
23
|
tzid == :floating
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
@@ -36,10 +36,12 @@ module RiCal
|
|
36
36
|
def has_floating_timezone?
|
37
37
|
false
|
38
38
|
end
|
39
|
-
|
40
|
-
def
|
39
|
+
|
40
|
+
def to_ri_cal_date_time_value(timezone_finder=nil)
|
41
41
|
::RiCal::PropertyValue::DateTime.new(timezone_finder, :params => {"TZID" => tzid}, :value => strftime("%Y%m%dT%H%M%S"))
|
42
42
|
end
|
43
|
+
alias_method :to_ri_cal_date_or_date_time_value, :to_ri_cal_date_time_value
|
44
|
+
alias_method :to_ri_cal_occurrence_list_value, :to_ri_cal_date_time_value
|
43
45
|
end
|
44
46
|
end
|
45
47
|
|
@@ -20,6 +20,14 @@ module RiCal
|
|
20
20
|
def self.next_occurrence
|
21
21
|
nil
|
22
22
|
end
|
23
|
+
|
24
|
+
def self.bounded?
|
25
|
+
true
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.empty?
|
29
|
+
true
|
30
|
+
end
|
23
31
|
end
|
24
32
|
|
25
33
|
# OccurrenceMerger takes multiple recurrence rules and enumerates the combination in sequence.
|
@@ -39,9 +47,14 @@ module RiCal
|
|
39
47
|
def initialize(component, rules)
|
40
48
|
self.enumerators = rules.map {|rrule| rrule.enumerator(component)}
|
41
49
|
@bounded = enumerators.all? {|enumerator| enumerator.bounded?}
|
50
|
+
@empty = enumerators.all? {|enumerator| enumerator.empty?}
|
42
51
|
self.nexts = @enumerators.map {|enumerator| enumerator.next_occurrence}
|
43
52
|
end
|
44
53
|
|
54
|
+
def empty?
|
55
|
+
@empty
|
56
|
+
end
|
57
|
+
|
45
58
|
# return the earliest of each of the enumerators next occurrences
|
46
59
|
def next_occurrence
|
47
60
|
result = nexts.compact.sort.first
|
@@ -93,18 +106,22 @@ module RiCal
|
|
93
106
|
# yield each occurrence to a block
|
94
107
|
# some components may be open-ended, e.g. have no COUNT or DTEND
|
95
108
|
def each
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
109
|
+
if @rrules.empty?
|
110
|
+
yield @component
|
111
|
+
else
|
112
|
+
occurrence = @rrules.next_occurrence
|
113
|
+
yielded = 0
|
114
|
+
@next_exclusion = @exrules.next_occurrence
|
115
|
+
while (occurrence)
|
116
|
+
if (@cutoff && occurrence[:start].to_datetime >= @cutoff) || (@count && yielded >= @count)
|
117
|
+
occurrence = nil
|
118
|
+
else
|
119
|
+
unless exclude?(occurrence)
|
120
|
+
yielded += 1
|
121
|
+
yield @component.recurrence(occurrence)
|
122
|
+
end
|
123
|
+
occurrence = @rrules.next_occurrence
|
106
124
|
end
|
107
|
-
occurrence = @rrules.next_occurrence
|
108
125
|
end
|
109
126
|
end
|
110
127
|
end
|
@@ -76,7 +76,7 @@ module RiCal
|
|
76
76
|
|
77
77
|
# Return an instance of RiCal::PropertyValue::DateTime representing the start of this date
|
78
78
|
def to_ri_cal_date_time_value
|
79
|
-
PropertyValue::DateTime.new(:value => @date_time_value)
|
79
|
+
PropertyValue::DateTime.new(timezone_finder, :value => @date_time_value)
|
80
80
|
end
|
81
81
|
|
82
82
|
# Return this date property
|
@@ -113,6 +113,27 @@ module RiCal
|
|
113
113
|
# Do nothing since dates don't have a timezone
|
114
114
|
end
|
115
115
|
|
116
|
+
# Return the difference between the receiver and other
|
117
|
+
#
|
118
|
+
# The parameter other should be either a RiCal::PropertyValue::Duration or a RiCal::PropertyValue::DateTime
|
119
|
+
#
|
120
|
+
# If other is a Duration, the result will be a DateTime, if it is a DateTime the result will be a Duration
|
121
|
+
def -(other)
|
122
|
+
other.subtract_from_date_time_value(to_ri_cal_date_time_value)
|
123
|
+
end
|
124
|
+
|
125
|
+
def subtract_from_date_time_value(date_time)
|
126
|
+
to_ri_cal_date_time_value.subtract_from_date_time_value(date_time)
|
127
|
+
end
|
128
|
+
|
129
|
+
# Return the sum of the receiver and duration
|
130
|
+
#
|
131
|
+
# The parameter other duration should be a RiCal::PropertyValue::Duration
|
132
|
+
#
|
133
|
+
# The result will be an RiCal::PropertyValue::DateTime
|
134
|
+
def +(duration)
|
135
|
+
duration.add_to_date_time_value(to_ri_cal_date_time_value)
|
136
|
+
end
|
116
137
|
|
117
138
|
# Delegate unknown messages to the wrappered Date instance.
|
118
139
|
# TODO: Is this really necessary?
|
@@ -28,7 +28,8 @@ module RiCal
|
|
28
28
|
hour_part = value_part('H', hour_diff)
|
29
29
|
min_part = value_part('M', min_diff)
|
30
30
|
sec_part = value_part('S', sec_diff)
|
31
|
-
|
31
|
+
t_part = (hour_diff.abs + min_diff.abs + sec_diff.abs) == 0 ? "" : "T"
|
32
|
+
new(parent, :value => "#{sign}P#{day_part}#{t_part}#{hour_part}#{min_part}#{sec_part}")
|
32
33
|
end
|
33
34
|
end
|
34
35
|
|
@@ -19,16 +19,19 @@ module RiCal
|
|
19
19
|
@next_occurrence_count = 0
|
20
20
|
@incrementer = YearlyIncrementer.from_rrule(recurrence_rule, start_time)
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
def self.for(recurrence_rule, component, setpos_list) # :nodoc:
|
24
24
|
if !setpos_list || setpos_list.all? {|setpos| setpos > 1}
|
25
25
|
self.new(recurrence_rule, component, setpos_list)
|
26
26
|
else
|
27
27
|
NegativeSetposEnumerator.new(recurrence_rule, component, setpos_list)
|
28
28
|
end
|
29
|
-
end
|
30
|
-
|
31
|
-
|
29
|
+
end
|
30
|
+
|
31
|
+
def empty?
|
32
|
+
false
|
33
|
+
end
|
34
|
+
|
32
35
|
def bounded?
|
33
36
|
@bounded
|
34
37
|
end
|
@@ -54,7 +57,7 @@ module RiCal
|
|
54
57
|
def result_passes_filters?(result)
|
55
58
|
if @setpos_list
|
56
59
|
result_passes_setpos_filter?(result)
|
57
|
-
else
|
60
|
+
else
|
58
61
|
result >= start_time
|
59
62
|
end
|
60
63
|
end
|
@@ -65,7 +68,7 @@ module RiCal
|
|
65
68
|
result = next_time
|
66
69
|
self.next_time = @incrementer.next_time(result)
|
67
70
|
if result_passes_filters?(result)
|
68
|
-
@count += 1
|
71
|
+
@count += 1
|
69
72
|
return recurrence_rule.exhausted?(@count, result) ? nil : result_hash(result)
|
70
73
|
end
|
71
74
|
end
|
data/lib/ri_cal.rb
CHANGED
@@ -11,7 +11,7 @@ module RiCal
|
|
11
11
|
autoload :OccurrenceEnumerator, "#{my_dir}/ri_cal/occurrence_enumerator.rb"
|
12
12
|
|
13
13
|
# :stopdoc:
|
14
|
-
VERSION = '0.0.
|
14
|
+
VERSION = '0.0.8'
|
15
15
|
LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
|
16
16
|
PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
|
17
17
|
|
data/ri_cal.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{ri_cal}
|
5
|
-
s.version = "0.0.
|
5
|
+
s.version = "0.0.8"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["author=Rick DeNatale"]
|
9
|
-
s.date = %q{2009-05-
|
9
|
+
s.date = %q{2009-05-19}
|
10
10
|
s.default_executable = %q{ri_cal}
|
11
11
|
s.description = %q{This is an UNOFFICIAL version. The public official version will be released on RubyForge. Github will be used
|
12
12
|
for interim versions. USE THIS VERSION AT YOUR OWN RISK.
|
@@ -22,7 +22,7 @@ A Google group for discussion of this library has been set up http://groups.goog
|
|
22
22
|
s.email = ["rick.denatale@gmail.com"]
|
23
23
|
s.executables = ["ri_cal"]
|
24
24
|
s.extra_rdoc_files = ["History.txt", "Manifest.txt", "README.txt", "copyrights.txt", "docs/draft-ietf-calsify-2446bis-08.txt", "docs/draft-ietf-calsify-rfc2445bis-09.txt", "docs/incrementers.txt"]
|
25
|
-
s.files = ["History.txt", "Manifest.txt", "README.txt", "Rakefile", "bin/ri_cal", "component_attributes/alarm.yml", "component_attributes/calendar.yml", "component_attributes/component_property_defs.yml", "component_attributes/event.yml", "component_attributes/freebusy.yml", "component_attributes/journal.yml", "component_attributes/timezone.yml", "component_attributes/timezone_period.yml", "component_attributes/todo.yml", "copyrights.txt", "docs/draft-ietf-calsify-2446bis-08.txt", "docs/draft-ietf-calsify-rfc2445bis-09.txt", "docs/incrementers.txt", "docs/rfc2445.pdf", "lib/ri_cal.rb", "lib/ri_cal/component.rb", "lib/ri_cal/component/alarm.rb", "lib/ri_cal/component/calendar.rb", "lib/ri_cal/component/event.rb", "lib/ri_cal/component/freebusy.rb", "lib/ri_cal/component/journal.rb", "lib/ri_cal/component/t_z_info_timezone.rb", "lib/ri_cal/component/timezone.rb", "lib/ri_cal/component/timezone/daylight_period.rb", "lib/ri_cal/component/timezone/standard_period.rb", "lib/ri_cal/component/timezone/timezone_period.rb", "lib/ri_cal/component/todo.rb", "lib/ri_cal/core_extensions.rb", "lib/ri_cal/core_extensions/array.rb", "lib/ri_cal/core_extensions/array/conversions.rb", "lib/ri_cal/core_extensions/date.rb", "lib/ri_cal/core_extensions/date/conversions.rb", "lib/ri_cal/core_extensions/date_time.rb", "lib/ri_cal/core_extensions/object.rb", "lib/ri_cal/core_extensions/object/conversions.rb", "lib/ri_cal/core_extensions/string.rb", "lib/ri_cal/core_extensions/string/conversions.rb", "lib/ri_cal/core_extensions/time.rb", "lib/ri_cal/core_extensions/time/calculations.rb", "lib/ri_cal/core_extensions/time/conversions.rb", "lib/ri_cal/core_extensions/time/tzid_access.rb", "lib/ri_cal/core_extensions/time/week_day_predicates.rb", "lib/ri_cal/floating_timezone.rb", "lib/ri_cal/invalid_property_value.rb", "lib/ri_cal/invalid_timezone_identifer.rb", "lib/ri_cal/occurrence_enumerator.rb", "lib/ri_cal/parser.rb", "lib/ri_cal/properties/alarm.rb", "lib/ri_cal/properties/calendar.rb", "lib/ri_cal/properties/event.rb", "lib/ri_cal/properties/freebusy.rb", "lib/ri_cal/properties/journal.rb", "lib/ri_cal/properties/timezone.rb", "lib/ri_cal/properties/timezone_period.rb", "lib/ri_cal/properties/todo.rb", "lib/ri_cal/property_value.rb", "lib/ri_cal/property_value/array.rb", "lib/ri_cal/property_value/cal_address.rb", "lib/ri_cal/property_value/date.rb", "lib/ri_cal/property_value/date_time.rb", "lib/ri_cal/property_value/date_time/additive_methods.rb", "lib/ri_cal/property_value/date_time/time_machine.rb", "lib/ri_cal/property_value/date_time/timezone_support.rb", "lib/ri_cal/property_value/duration.rb", "lib/ri_cal/property_value/geo.rb", "lib/ri_cal/property_value/integer.rb", "lib/ri_cal/property_value/occurrence_list.rb", "lib/ri_cal/property_value/period.rb", "lib/ri_cal/property_value/recurrence_rule.rb", "lib/ri_cal/property_value/recurrence_rule/enumeration_support_methods.rb", "lib/ri_cal/property_value/recurrence_rule/enumerator.rb", "lib/ri_cal/property_value/recurrence_rule/initialization_methods.rb", "lib/ri_cal/property_value/recurrence_rule/negative_setpos_enumerator.rb", "lib/ri_cal/property_value/recurrence_rule/numbered_span.rb", "lib/ri_cal/property_value/recurrence_rule/occurence_incrementer.rb", "lib/ri_cal/property_value/recurrence_rule/recurring_day.rb", "lib/ri_cal/property_value/recurrence_rule/recurring_month_day.rb", "lib/ri_cal/property_value/recurrence_rule/recurring_numbered_week.rb", "lib/ri_cal/property_value/recurrence_rule/recurring_year_day.rb", "lib/ri_cal/property_value/recurrence_rule/validations.rb", "lib/ri_cal/property_value/text.rb", "lib/ri_cal/property_value/uri.rb", "lib/ri_cal/property_value/utc_offset.rb", "lib/ri_cal/required_timezones.rb", "ri_cal.gemspec", "sample_ical_files/from_ical_dot_app/test1.ics", "script/console", "script/destroy", "script/generate", "script/txt2html", "spec/ri_cal/component/alarm_spec.rb", "spec/ri_cal/component/calendar_spec.rb", "spec/ri_cal/component/event_spec.rb", "spec/ri_cal/component/freebusy_spec.rb", "spec/ri_cal/component/journal_spec.rb", "spec/ri_cal/component/t_z_info_timezone_spec.rb", "spec/ri_cal/component/timezone_spec.rb", "spec/ri_cal/component/todo_spec.rb", "spec/ri_cal/component_spec.rb", "spec/ri_cal/core_extensions/string/conversions_spec.rb", "spec/ri_cal/core_extensions/time/calculations_spec.rb", "spec/ri_cal/core_extensions/time/week_day_predicates_spec.rb", "spec/ri_cal/occurrence_enumerator_spec.rb", "spec/ri_cal/parser_spec.rb", "spec/ri_cal/property_value/date_spec.rb", "spec/ri_cal/property_value/date_time_spec.rb", "spec/ri_cal/property_value/duration_spec.rb", "spec/ri_cal/property_value/occurrence_list_spec.rb", "spec/ri_cal/property_value/period_spec.rb", "spec/ri_cal/property_value/recurrence_rule/recurring_year_day_spec.rb", "spec/ri_cal/property_value/recurrence_rule_spec.rb", "spec/ri_cal/property_value/text_spec.rb", "spec/ri_cal/property_value/utc_offset_spec.rb", "spec/ri_cal/property_value_spec.rb", "spec/ri_cal/required_timezones_spec.rb", "spec/ri_cal_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "tasks/
|
25
|
+
s.files = ["History.txt", "Manifest.txt", "README.txt", "Rakefile", "bin/ri_cal", "component_attributes/alarm.yml", "component_attributes/calendar.yml", "component_attributes/component_property_defs.yml", "component_attributes/event.yml", "component_attributes/freebusy.yml", "component_attributes/journal.yml", "component_attributes/timezone.yml", "component_attributes/timezone_period.yml", "component_attributes/todo.yml", "copyrights.txt", "docs/draft-ietf-calsify-2446bis-08.txt", "docs/draft-ietf-calsify-rfc2445bis-09.txt", "docs/incrementers.txt", "docs/rfc2445.pdf", "lib/ri_cal.rb", "lib/ri_cal/component.rb", "lib/ri_cal/component/alarm.rb", "lib/ri_cal/component/calendar.rb", "lib/ri_cal/component/event.rb", "lib/ri_cal/component/freebusy.rb", "lib/ri_cal/component/journal.rb", "lib/ri_cal/component/t_z_info_timezone.rb", "lib/ri_cal/component/timezone.rb", "lib/ri_cal/component/timezone/daylight_period.rb", "lib/ri_cal/component/timezone/standard_period.rb", "lib/ri_cal/component/timezone/timezone_period.rb", "lib/ri_cal/component/todo.rb", "lib/ri_cal/core_extensions.rb", "lib/ri_cal/core_extensions/array.rb", "lib/ri_cal/core_extensions/array/conversions.rb", "lib/ri_cal/core_extensions/date.rb", "lib/ri_cal/core_extensions/date/conversions.rb", "lib/ri_cal/core_extensions/date_time.rb", "lib/ri_cal/core_extensions/object.rb", "lib/ri_cal/core_extensions/object/conversions.rb", "lib/ri_cal/core_extensions/string.rb", "lib/ri_cal/core_extensions/string/conversions.rb", "lib/ri_cal/core_extensions/time.rb", "lib/ri_cal/core_extensions/time/calculations.rb", "lib/ri_cal/core_extensions/time/conversions.rb", "lib/ri_cal/core_extensions/time/tzid_access.rb", "lib/ri_cal/core_extensions/time/week_day_predicates.rb", "lib/ri_cal/floating_timezone.rb", "lib/ri_cal/invalid_property_value.rb", "lib/ri_cal/invalid_timezone_identifer.rb", "lib/ri_cal/occurrence_enumerator.rb", "lib/ri_cal/parser.rb", "lib/ri_cal/properties/alarm.rb", "lib/ri_cal/properties/calendar.rb", "lib/ri_cal/properties/event.rb", "lib/ri_cal/properties/freebusy.rb", "lib/ri_cal/properties/journal.rb", "lib/ri_cal/properties/timezone.rb", "lib/ri_cal/properties/timezone_period.rb", "lib/ri_cal/properties/todo.rb", "lib/ri_cal/property_value.rb", "lib/ri_cal/property_value/array.rb", "lib/ri_cal/property_value/cal_address.rb", "lib/ri_cal/property_value/date.rb", "lib/ri_cal/property_value/date_time.rb", "lib/ri_cal/property_value/date_time/additive_methods.rb", "lib/ri_cal/property_value/date_time/time_machine.rb", "lib/ri_cal/property_value/date_time/timezone_support.rb", "lib/ri_cal/property_value/duration.rb", "lib/ri_cal/property_value/geo.rb", "lib/ri_cal/property_value/integer.rb", "lib/ri_cal/property_value/occurrence_list.rb", "lib/ri_cal/property_value/period.rb", "lib/ri_cal/property_value/recurrence_rule.rb", "lib/ri_cal/property_value/recurrence_rule/enumeration_support_methods.rb", "lib/ri_cal/property_value/recurrence_rule/enumerator.rb", "lib/ri_cal/property_value/recurrence_rule/initialization_methods.rb", "lib/ri_cal/property_value/recurrence_rule/negative_setpos_enumerator.rb", "lib/ri_cal/property_value/recurrence_rule/numbered_span.rb", "lib/ri_cal/property_value/recurrence_rule/occurence_incrementer.rb", "lib/ri_cal/property_value/recurrence_rule/recurring_day.rb", "lib/ri_cal/property_value/recurrence_rule/recurring_month_day.rb", "lib/ri_cal/property_value/recurrence_rule/recurring_numbered_week.rb", "lib/ri_cal/property_value/recurrence_rule/recurring_year_day.rb", "lib/ri_cal/property_value/recurrence_rule/validations.rb", "lib/ri_cal/property_value/text.rb", "lib/ri_cal/property_value/uri.rb", "lib/ri_cal/property_value/utc_offset.rb", "lib/ri_cal/required_timezones.rb", "ri_cal.gemspec", "sample_ical_files/from_ical_dot_app/test1.ics", "script/console", "script/destroy", "script/generate", "script/txt2html", "spec/ri_cal/component/alarm_spec.rb", "spec/ri_cal/component/calendar_spec.rb", "spec/ri_cal/component/event_spec.rb", "spec/ri_cal/component/freebusy_spec.rb", "spec/ri_cal/component/journal_spec.rb", "spec/ri_cal/component/t_z_info_timezone_spec.rb", "spec/ri_cal/component/timezone_spec.rb", "spec/ri_cal/component/todo_spec.rb", "spec/ri_cal/component_spec.rb", "spec/ri_cal/core_extensions/string/conversions_spec.rb", "spec/ri_cal/core_extensions/time/calculations_spec.rb", "spec/ri_cal/core_extensions/time/week_day_predicates_spec.rb", "spec/ri_cal/occurrence_enumerator_spec.rb", "spec/ri_cal/parser_spec.rb", "spec/ri_cal/property_value/date_spec.rb", "spec/ri_cal/property_value/date_time_spec.rb", "spec/ri_cal/property_value/duration_spec.rb", "spec/ri_cal/property_value/occurrence_list_spec.rb", "spec/ri_cal/property_value/period_spec.rb", "spec/ri_cal/property_value/recurrence_rule/recurring_year_day_spec.rb", "spec/ri_cal/property_value/recurrence_rule_spec.rb", "spec/ri_cal/property_value/text_spec.rb", "spec/ri_cal/property_value/utc_offset_spec.rb", "spec/ri_cal/property_value_spec.rb", "spec/ri_cal/required_timezones_spec.rb", "spec/ri_cal_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "tasks/gem_loader/load_active_support.rb", "tasks/gem_loader/load_tzinfo_gem.rb", "tasks/ri_cal.rake", "tasks/spec.rake"]
|
26
26
|
s.has_rdoc = true
|
27
27
|
s.homepage = %q{http://rical.rubyforge.org/}
|
28
28
|
s.rdoc_options = ["--main", "README.txt"]
|
@@ -1,4 +1,5 @@
|
|
1
1
|
#- ©2009 Rick DeNatale, All rights reserved. Refer to the file README.txt for the license
|
2
|
+
|
2
3
|
require File.join(File.dirname(__FILE__), %w[.. .. spec_helper])
|
3
4
|
|
4
5
|
describe RiCal::Component::Event do
|
@@ -312,6 +313,32 @@ describe RiCal::Component::Event do
|
|
312
313
|
|
313
314
|
if RiCal::TimeWithZone
|
314
315
|
context "with ActiveSupport loaded" do
|
316
|
+
|
317
|
+
context "an event with an timezoned exdate" do
|
318
|
+
before(:each) do
|
319
|
+
@old_timezone = Time.zone
|
320
|
+
Time.zone = "America/New_York"
|
321
|
+
@exception_date_time = Time.zone.local(2009, 5, 19, 11, 13)
|
322
|
+
cal = RiCal.Calendar do |cal|
|
323
|
+
cal.event do |event|
|
324
|
+
event.add_exdate @exception_date_time
|
325
|
+
end
|
326
|
+
end
|
327
|
+
@event = cal.events.first
|
328
|
+
end
|
329
|
+
|
330
|
+
after(:each) do
|
331
|
+
Time.zone = @old_timezone
|
332
|
+
end
|
333
|
+
|
334
|
+
it "should pickup the timezone in the exdate property" do
|
335
|
+
@event.exdate.first.first.tzid.should == "America/New_York"
|
336
|
+
end
|
337
|
+
|
338
|
+
it "should have the timezone in the ical representation of the exdate property" do
|
339
|
+
@event.exdate_property.to_s.should match(%r{;TZID=America/New_York[:;]})
|
340
|
+
end
|
341
|
+
end
|
315
342
|
|
316
343
|
context "An event in a non-tzinfo source calendar" do
|
317
344
|
before(:each) do
|
@@ -2,6 +2,10 @@
|
|
2
2
|
|
3
3
|
require File.join(File.dirname(__FILE__), %w[.. spec_helper.rb])
|
4
4
|
|
5
|
+
def mock_enumerator(name, next_occurrence)
|
6
|
+
mock(name, :next_occurrence => next_occurrence, :bounded? => true, :empty? => false)
|
7
|
+
end
|
8
|
+
|
5
9
|
# Note that this is more of a functional spec
|
6
10
|
describe RiCal::OccurrenceEnumerator do
|
7
11
|
|
@@ -130,8 +134,8 @@ describe RiCal::OccurrenceEnumerator::OccurrenceMerger do
|
|
130
134
|
describe "with multiple rrules" do
|
131
135
|
before(:each) do
|
132
136
|
@component = mock("component", :dtstart => :dtstart_value)
|
133
|
-
@enum1 =
|
134
|
-
@enum2 =
|
137
|
+
@enum1 = mock_enumerator("rrule_enumerator1", :occ1)
|
138
|
+
@enum2 = mock_enumerator("rrule_enumerator2", :occ2)
|
135
139
|
@rrule1 = mock("rrule", :enumerator => @enum1)
|
136
140
|
@rrule2 = mock("rrule", :enumerator => @enum2)
|
137
141
|
end
|
@@ -158,8 +162,8 @@ describe RiCal::OccurrenceEnumerator::OccurrenceMerger do
|
|
158
162
|
|
159
163
|
describe "with unique nexts" do
|
160
164
|
before(:each) do
|
161
|
-
@enum1 =
|
162
|
-
@enum2 =
|
165
|
+
@enum1 = mock_enumerator("rrule_enumerator1",3)
|
166
|
+
@enum2 = mock_enumerator("rrule_enumerator2", 2)
|
163
167
|
@rrule1 = mock("rrule", :enumerator => @enum1)
|
164
168
|
@rrule2 = mock("rrule", :enumerator => @enum2)
|
165
169
|
@it = @merger.new(0, [@rrule1, @rrule2])
|
@@ -188,8 +192,8 @@ describe RiCal::OccurrenceEnumerator::OccurrenceMerger do
|
|
188
192
|
|
189
193
|
describe "with duplicated nexts" do
|
190
194
|
before(:each) do
|
191
|
-
@enum1 =
|
192
|
-
@enum2 =
|
195
|
+
@enum1 = mock_enumerator("rrule_enumerator1", 2)
|
196
|
+
@enum2 = mock_enumerator("rrule_enumerator2", 2)
|
193
197
|
@rrule1 = mock("rrule", :enumerator => @enum1)
|
194
198
|
@rrule2 = mock("rrule", :enumerator => @enum2)
|
195
199
|
@it = @merger.new(0, [@rrule1, @rrule2])
|
@@ -216,8 +220,8 @@ describe RiCal::OccurrenceEnumerator::OccurrenceMerger do
|
|
216
220
|
|
217
221
|
describe "with all enumerators at end" do
|
218
222
|
before(:each) do
|
219
|
-
@enum1 =
|
220
|
-
@enum2 =
|
223
|
+
@enum1 = mock_enumerator("rrule_enumerator1", nil)
|
224
|
+
@enum2 = mock_enumerator("rrule_enumerator2", nil)
|
221
225
|
@rrule1 = mock("rrule", :enumerator => @enum1)
|
222
226
|
@rrule2 = mock("rrule", :enumerator => @enum2)
|
223
227
|
@it = @merger.new(0, [@rrule1, @rrule2])
|
@@ -284,7 +288,49 @@ ENDCAL
|
|
284
288
|
lambda {@event.occurrences}.should_not raise_error
|
285
289
|
end
|
286
290
|
end
|
287
|
-
|
291
|
+
|
292
|
+
context "Lighthouse bug #3" do
|
293
|
+
before(:each) do
|
294
|
+
cals = RiCal.parse_string <<ENDCAL
|
295
|
+
BEGIN:VCALENDAR
|
296
|
+
VERSION:2.0
|
297
|
+
PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN
|
298
|
+
BEGIN:VTIMEZONE
|
299
|
+
TZID:/mozilla.org/20070129_1/Europe/Paris
|
300
|
+
X-LIC-LOCATION:Europe/Paris
|
301
|
+
BEGIN:DAYLIGHT
|
302
|
+
TZOFFSETFROM:+0100
|
303
|
+
TZOFFSETTO:+0200
|
304
|
+
TZNAME:CEST
|
305
|
+
DTSTART:19700329T020000
|
306
|
+
RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3
|
307
|
+
END:DAYLIGHT
|
308
|
+
BEGIN:STANDARD
|
309
|
+
TZOFFSETFROM:+0200
|
310
|
+
TZOFFSETTO:+0100
|
311
|
+
TZNAME:CET
|
312
|
+
DTSTART:19701025T030000
|
313
|
+
RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
|
314
|
+
END:STANDARD
|
315
|
+
END:VTIMEZONE
|
316
|
+
BEGIN:VEVENT
|
317
|
+
CREATED:20070606T141629Z
|
318
|
+
LAST-MODIFIED:20070606T154611Z
|
319
|
+
DTSTAMP:20070607T120859Z
|
320
|
+
UID:5d1ae55f-3910-4de9-8b65-d652768fb2f2
|
321
|
+
SUMMARY:Lundi de Pâques
|
322
|
+
DTSTART;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20070409
|
323
|
+
DTEND;VALUE=DATE;TZID=/mozilla.org/20070129_1/Europe/Paris:20070410
|
324
|
+
CATEGORIES:Jours fériés
|
325
|
+
END:VEVENT
|
326
|
+
END:VCALENDAR
|
327
|
+
ENDCAL
|
328
|
+
@event = cals.first.events.first
|
329
|
+
end
|
330
|
+
|
331
|
+
it "should be able to enumerate occurrences" do
|
332
|
+
@event.occurrences.should == [@event]
|
333
|
+
end
|
334
|
+
end
|
335
|
+
|
288
336
|
end
|
289
|
-
|
290
|
-
|
@@ -3,19 +3,51 @@
|
|
3
3
|
require File.join(File.dirname(__FILE__), %w[.. .. spec_helper])
|
4
4
|
|
5
5
|
describe RiCal::PropertyValue::Date do
|
6
|
-
|
6
|
+
context ".advance" do
|
7
7
|
it "should advance by one week if passed :days => 7" do
|
8
8
|
dt1 = RiCal::PropertyValue::Date.new(nil, :value => "20050131")
|
9
9
|
dt2 = RiCal::PropertyValue::Date.new(nil, :value => "20050207")
|
10
10
|
dt1.advance(:days => 7).should == dt2
|
11
11
|
end
|
12
|
-
|
13
|
-
|
12
|
+
|
13
|
+
context ".==" do
|
14
14
|
it "should return true for two instances representing the same date" do
|
15
15
|
dt1 = RiCal::PropertyValue::Date.new(nil, :value => DateTime.parse("20050131T010000"))
|
16
16
|
dt2 = RiCal::PropertyValue::Date.new(nil, :value => DateTime.parse("20050131T010001"))
|
17
|
-
dt1.should == dt2
|
17
|
+
dt1.should == dt2
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
21
|
+
|
22
|
+
context ".-" do
|
23
|
+
|
24
|
+
it "should return a Duration property when the argument is also a Date property" do
|
25
|
+
dt1 = RiCal::PropertyValue::Date.new(nil, :value => DateTime.parse("20090519"))
|
26
|
+
dt2 = RiCal::PropertyValue::Date.new(nil, :value => DateTime.parse("20090518"))
|
27
|
+
(dt1 - dt2).should == RiCal::PropertyValue::Duration.new(nil, :value => "+P1D")
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should return a Duration property when the argument is a DateTime property" do
|
31
|
+
dt1 = RiCal::PropertyValue::Date.new(nil, :value => DateTime.parse("20090519"))
|
32
|
+
dt2 = RiCal::PropertyValue::DateTime.new(nil, :value => DateTime.parse("20090518T120000"))
|
33
|
+
(dt1 - dt2).should == RiCal::PropertyValue::Duration.new(nil, :value => "+PT12H")
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should return a DateTime property when the argument is a Duration Property" do
|
37
|
+
dt1 = RiCal::PropertyValue::Date.new(nil, :value => "19980119")
|
38
|
+
duration = RiCal::PropertyValue::Duration.new(nil, :value => "+PT2H")
|
39
|
+
@it = dt1 - duration
|
40
|
+
@it.should == RiCal::PropertyValue::DateTime.new(nil, :value => "19980118T220000")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context ".+" do
|
45
|
+
|
46
|
+
it "should return a DateTime property when the argument is a Duration Property" do
|
47
|
+
dt1 = RiCal::PropertyValue::Date.new(nil, :value => "19980119")
|
48
|
+
duration = RiCal::PropertyValue::Duration.new(nil, :value => "+PT2H")
|
49
|
+
@it = dt1 + duration
|
50
|
+
@it.should == RiCal::PropertyValue::DateTime.new(nil, :value => "19980119T020000")
|
51
|
+
end
|
52
|
+
end
|
21
53
|
end
|
@@ -4,8 +4,8 @@ require File.join(File.dirname(__FILE__), %w[.. .. spec_helper])
|
|
4
4
|
require 'date'
|
5
5
|
|
6
6
|
describe RiCal::PropertyValue::Duration do
|
7
|
-
|
8
|
-
|
7
|
+
|
8
|
+
context "with various values" do
|
9
9
|
def value_expectations(dv, values = {})
|
10
10
|
values = {:weeks => 0, :days => 0, :hours => 0, :minutes => 0, :seconds => 0}.merge(values)
|
11
11
|
dv.weeks.should == values[:weeks]
|
@@ -14,77 +14,113 @@ describe RiCal::PropertyValue::Duration do
|
|
14
14
|
dv.minutes.should == values[:minutes]
|
15
15
|
dv.seconds.should == values[:seconds]
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
it ".+P7W should have represent 7 weeks" do
|
19
19
|
value_expectations(RiCal::PropertyValue::Duration.new(nil, :value => "+P7W"), :weeks => 7)
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
it ".P15DT5H0M20S should have represent 15 days, 5 hours and 20 seconds" do
|
23
23
|
value_expectations(RiCal::PropertyValue::Duration.new(nil, :value => "P15DT5H0M20S"), :days => 15, :hours => 5, :seconds => 20)
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
it ".+P2D should have represent 2 days" do
|
27
27
|
value_expectations(RiCal::PropertyValue::Duration.new(nil, :value => "+P2D"), :days => 2)
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
it ".+PT3H should have represent 3 hours" do
|
31
31
|
value_expectations(RiCal::PropertyValue::Duration.new(nil, :value => "+PT3H"), :hours => 3)
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
it ".+PT15M should have represent 15 minutes" do
|
35
35
|
value_expectations(RiCal::PropertyValue::Duration.new(nil, :value => "+PT15M"), :minutes => 15)
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
it ".+PT45S should have represent 45 seconds" do
|
39
39
|
value_expectations(RiCal::PropertyValue::Duration.new(nil, :value => "+PT45S"), :seconds => 45)
|
40
40
|
end
|
41
41
|
end
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
42
|
+
|
43
|
+
context ".==" do
|
44
|
+
it "should return true for two durations of one day" do
|
45
|
+
RiCal::PropertyValue.new(nil, :value => "+P1D").should == RiCal::PropertyValue.new(nil, :value => "+P1D")
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context ".from_datetimes" do
|
50
|
+
|
51
|
+
context "starting at 11:00 pm, and ending at 1:01:02 am the next day" do
|
46
52
|
before(:each) do
|
47
|
-
@it = RiCal::PropertyValue::Duration.from_datetimes(nil,
|
48
|
-
|
49
|
-
|
50
|
-
|
53
|
+
@it = RiCal::PropertyValue::Duration.from_datetimes(nil,
|
54
|
+
DateTime.parse("Sep 1, 2008 23:00"),
|
55
|
+
DateTime.parse("Sep 2, 2008 1:01:02")
|
56
|
+
)
|
51
57
|
end
|
52
58
|
|
53
59
|
it "should produce a duration" do
|
54
60
|
@it.class.should == RiCal::PropertyValue::Duration
|
55
61
|
end
|
56
|
-
|
62
|
+
|
57
63
|
it "should have a value of '+P2H1M2S'" do
|
58
64
|
@it.value.should == '+PT2H1M2S'
|
59
65
|
end
|
60
|
-
|
66
|
+
|
61
67
|
it "should contain zero days" do
|
62
68
|
@it.days.should == 0
|
63
69
|
end
|
64
|
-
|
70
|
+
|
65
71
|
it "should contain two hours" do
|
66
72
|
@it.hours.should == 2
|
67
73
|
end
|
68
|
-
|
74
|
+
|
69
75
|
it "should contain one minute" do
|
70
76
|
@it.minutes.should == 1
|
71
77
|
end
|
72
|
-
|
78
|
+
|
73
79
|
it "should contain one minute" do
|
74
80
|
@it.minutes.should == 1
|
75
81
|
end
|
76
82
|
end
|
77
|
-
|
78
|
-
|
79
|
-
|
83
|
+
|
84
|
+
context "starting at 00:00, and ending at 00:00 the next day" do
|
85
|
+
before(:each) do
|
86
|
+
@it = RiCal::PropertyValue::Duration.from_datetimes(nil,
|
87
|
+
DateTime.parse("Sep 1, 2008 00:00"),
|
88
|
+
DateTime.parse("Sep 2, 2008 00:00")
|
89
|
+
)
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should produce a duration" do
|
93
|
+
@it.class.should == RiCal::PropertyValue::Duration
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should have a value of '+P1D'" do
|
97
|
+
@it.value.should == '+P1D'
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should contain zero days" do
|
101
|
+
@it.days.should == 1
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should contain zero hours" do
|
105
|
+
@it.hours.should == 0
|
106
|
+
end
|
107
|
+
|
108
|
+
it "should contain zero minutes" do
|
109
|
+
@it.minutes.should == 0
|
110
|
+
end
|
111
|
+
|
112
|
+
it "should contain zero minutes" do
|
113
|
+
@it.minutes.should == 0
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
80
117
|
it "should work when start > finish" do
|
81
118
|
lambda {
|
82
|
-
RiCal::PropertyValue::Duration.from_datetimes(nil,
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
119
|
+
RiCal::PropertyValue::Duration.from_datetimes(nil,
|
120
|
+
DateTime.parse("Sep 2, 2008 1:01:02"),
|
121
|
+
DateTime.parse("Sep 1, 2008 23:00")
|
122
|
+
)
|
123
|
+
}.should_not raise_error(ArgumentError)
|
124
|
+
end
|
87
125
|
end
|
88
|
-
end
|
89
|
-
|
90
|
-
end
|
126
|
+
end
|
data/tasks/spec.rake
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubyredrick-ri_cal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- author=Rick DeNatale
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-05-
|
12
|
+
date: 2009-05-19 00:00:00 -07:00
|
13
13
|
default_executable: ri_cal
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -171,10 +171,10 @@ files:
|
|
171
171
|
- spec/ri_cal_spec.rb
|
172
172
|
- spec/spec.opts
|
173
173
|
- spec/spec_helper.rb
|
174
|
-
- tasks/ri_cal.rake
|
175
|
-
- tasks/spec.rake
|
176
174
|
- tasks/gem_loader/load_active_support.rb
|
177
175
|
- tasks/gem_loader/load_tzinfo_gem.rb
|
176
|
+
- tasks/ri_cal.rake
|
177
|
+
- tasks/spec.rake
|
178
178
|
has_rdoc: true
|
179
179
|
homepage: http://rical.rubyforge.org/
|
180
180
|
post_install_message:
|