rubyredrick-ri_cal 0.0.8 → 0.0.9
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 +10 -3
- data/Manifest.txt +1 -0
- data/lib/ri_cal/core_extensions/date/conversions.rb +33 -0
- data/lib/ri_cal/core_extensions/date_time/conversions.rb +50 -0
- data/lib/ri_cal/core_extensions/date_time.rb +2 -2
- data/lib/ri_cal/core_extensions/time/conversions.rb +30 -0
- data/lib/ri_cal/occurrence_enumerator.rb +5 -9
- data/lib/ri_cal/property_value/date.rb +12 -0
- data/lib/ri_cal/property_value/date_time.rb +15 -2
- data/lib/ri_cal.rb +1 -1
- data/ri_cal.gemspec +3 -3
- data/spec/ri_cal/component/event_spec.rb +8 -0
- data/spec/ri_cal/occurrence_enumerator_spec.rb +124 -35
- metadata +3 -2
data/History.txt
CHANGED
@@ -1,7 +1,14 @@
|
|
1
|
+
=== 0.0.9
|
2
|
+
* Fixed http://rick_denatale.lighthouseapp.com/projects/30941/tickets/4
|
3
|
+
Missing comparison methods in PropertyValue::Date
|
4
|
+
* Fixed http://rick_denatale.lighthouseapp.com/projects/30941/tickets/6
|
5
|
+
Type of dtstart and dtend (DATE or DATETIME) now preserved on enumeration
|
1
6
|
=== 0.0.8
|
2
|
-
* Fixed http://rick_denatale.lighthouseapp.com/projects/30941-ri_cal/tickets/1
|
3
|
-
|
4
|
-
* Fixed http://rick_denatale.lighthouseapp.com/projects/30941/tickets/
|
7
|
+
* Fixed http://rick_denatale.lighthouseapp.com/projects/30941-ri_cal/tickets/1
|
8
|
+
EXDATE and RDATE now pick up the timezone from DateTime, Time, and TimeWithZone values
|
9
|
+
* Fixed http://rick_denatale.lighthouseapp.com/projects/30941/tickets/2
|
10
|
+
Missing arithmetic methods in PropertyValue::Date
|
11
|
+
* Fixed http://rick_denatale.lighthouseapp.com/projects/30941/tickets/3
|
5
12
|
Components with no recurrence rules or rdate properties failed on enumeration, they now
|
6
13
|
will enumerate a single occurrence
|
7
14
|
|
data/Manifest.txt
CHANGED
@@ -36,6 +36,7 @@ lib/ri_cal/core_extensions/array/conversions.rb
|
|
36
36
|
lib/ri_cal/core_extensions/date.rb
|
37
37
|
lib/ri_cal/core_extensions/date/conversions.rb
|
38
38
|
lib/ri_cal/core_extensions/date_time.rb
|
39
|
+
lib/ri_cal/core_extensions/date_time/conversions.rb
|
39
40
|
lib/ri_cal/core_extensions/object.rb
|
40
41
|
lib/ri_cal/core_extensions/object/conversions.rb
|
41
42
|
lib/ri_cal/core_extensions/string.rb
|
@@ -22,6 +22,39 @@ module RiCal
|
|
22
22
|
def to_ri_cal_property_value(timezone_finder = nil)
|
23
23
|
to_ri_cal_date_value(timezone_finder)
|
24
24
|
end
|
25
|
+
|
26
|
+
unless defined? ActiveSupport
|
27
|
+
# A method to keep Time, Date and DateTime instances interchangeable on conversions.
|
28
|
+
# In this case, it simply returns +self+.
|
29
|
+
def to_date
|
30
|
+
self
|
31
|
+
end if RUBY_VERSION < '1.9'
|
32
|
+
|
33
|
+
# Converts a Date instance to a Time, where the time is set to the beginning of the day.
|
34
|
+
# The timezone can be either :local or :utc (default :local).
|
35
|
+
#
|
36
|
+
# ==== Examples
|
37
|
+
# date = Date.new(2007, 11, 10) # => Sat, 10 Nov 2007
|
38
|
+
#
|
39
|
+
# date.to_time # => Sat Nov 10 00:00:00 0800 2007
|
40
|
+
# date.to_time(:local) # => Sat Nov 10 00:00:00 0800 2007
|
41
|
+
#
|
42
|
+
# date.to_time(:utc) # => Sat Nov 10 00:00:00 UTC 2007
|
43
|
+
def to_time(form = :local)
|
44
|
+
::Time.send("#{form}_time", year, month, day)
|
45
|
+
end
|
46
|
+
|
47
|
+
# Converts a Date instance to a DateTime, where the time is set to the beginning of the day
|
48
|
+
# and UTC offset is set to 0.
|
49
|
+
#
|
50
|
+
# ==== Examples
|
51
|
+
# date = Date.new(2007, 11, 10) # => Sat, 10 Nov 2007
|
52
|
+
#
|
53
|
+
# date.to_datetime # => Sat, 10 Nov 2007 00:00:00 0000
|
54
|
+
def to_datetime
|
55
|
+
::DateTime.civil(year, month, day, 0, 0, 0, 0)
|
56
|
+
end if RUBY_VERSION < '1.9'
|
57
|
+
end
|
25
58
|
end
|
26
59
|
end
|
27
60
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'date'
|
2
|
+
module RiCal
|
3
|
+
module CoreExtensions #:nodoc:
|
4
|
+
module DateTime #:nodoc:
|
5
|
+
#- ©2009 Rick DeNatale
|
6
|
+
#- All rights reserved. Refer to the file README.txt for the license
|
7
|
+
#
|
8
|
+
module Conversions #:nodoc:
|
9
|
+
# Return an RiCal::PropertyValue::DateTime representing the receiver
|
10
|
+
def to_ri_cal_date_time_value(timezone_finder = nil) #:nodoc:
|
11
|
+
RiCal::PropertyValue::DateTime.new(
|
12
|
+
timezone_finder,
|
13
|
+
:value => strftime("%Y%m%dT%H%M%S"),
|
14
|
+
:params => {"TZID" => self.tzid || :default})
|
15
|
+
end
|
16
|
+
|
17
|
+
alias_method :to_ri_cal_date_or_date_time_value, :to_ri_cal_date_time_value #:nodoc:
|
18
|
+
alias_method :to_ri_cal_occurrence_list_value, :to_ri_cal_date_time_value #:nodoc:
|
19
|
+
|
20
|
+
# Return the natural ri_cal_property for this object
|
21
|
+
def to_ri_cal_property_value(timezone_finder = nil) #:nodoc:
|
22
|
+
to_ri_cal_date_time_value(timezone_finder)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Return a copy of this object which will be interpreted as a floating time.
|
26
|
+
def with_floating_timezone
|
27
|
+
dup.set_tzid(:floating)
|
28
|
+
end
|
29
|
+
|
30
|
+
unless defined? ActiveSupport
|
31
|
+
# Converts self to a Ruby Date object; time portion is discarded
|
32
|
+
def to_date
|
33
|
+
::Date.new(year, month, day)
|
34
|
+
end
|
35
|
+
|
36
|
+
# Attempts to convert self to a Ruby Time object; returns self if out of range of Ruby Time class
|
37
|
+
# If self has an offset other than 0, self will just be returned unaltered, since there's no clean way to map it to a Time
|
38
|
+
def to_time
|
39
|
+
self.offset == 0 ? ::Time.utc_time(year, month, day, hour, min, sec) : self
|
40
|
+
end
|
41
|
+
|
42
|
+
# To be able to keep Times, Dates and DateTimes interchangeable on conversions
|
43
|
+
def to_datetime
|
44
|
+
self
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require "#{File.dirname(__FILE__)}/
|
1
|
+
require "#{File.dirname(__FILE__)}/date_time/conversions.rb"
|
2
2
|
require "#{File.dirname(__FILE__)}/time/tzid_access.rb"
|
3
3
|
require "#{File.dirname(__FILE__)}/time/week_day_predicates.rb"
|
4
4
|
require "#{File.dirname(__FILE__)}/time/calculations.rb"
|
@@ -11,5 +11,5 @@ class DateTime #:nodoc:
|
|
11
11
|
include RiCal::CoreExtensions::Time::WeekDayPredicates
|
12
12
|
include RiCal::CoreExtensions::Time::Calculations
|
13
13
|
include RiCal::CoreExtensions::Time::TzidAccess
|
14
|
-
include RiCal::CoreExtensions::
|
14
|
+
include RiCal::CoreExtensions::DateTime::Conversions
|
15
15
|
end
|
@@ -25,6 +25,36 @@ module RiCal
|
|
25
25
|
def with_floating_timezone
|
26
26
|
dup.set_tzid(:floating)
|
27
27
|
end
|
28
|
+
|
29
|
+
unless defined? ActiveSupport
|
30
|
+
# Converts a Time object to a Date, dropping hour, minute, and second precision.
|
31
|
+
#
|
32
|
+
# my_time = Time.now # => Mon Nov 12 22:59:51 -0500 2007
|
33
|
+
# my_time.to_date # => Mon, 12 Nov 2007
|
34
|
+
#
|
35
|
+
# your_time = Time.parse("1/13/2009 1:13:03 P.M.") # => Tue Jan 13 13:13:03 -0500 2009
|
36
|
+
# your_time.to_date # => Tue, 13 Jan 2009
|
37
|
+
def to_date
|
38
|
+
::Date.new(year, month, day)
|
39
|
+
end
|
40
|
+
|
41
|
+
# A method to keep Time, Date and DateTime instances interchangeable on conversions.
|
42
|
+
# In this case, it simply returns +self+.
|
43
|
+
def to_time
|
44
|
+
self
|
45
|
+
end
|
46
|
+
|
47
|
+
# Converts a Time instance to a Ruby DateTime instance, preserving UTC offset.
|
48
|
+
#
|
49
|
+
# my_time = Time.now # => Mon Nov 12 23:04:21 -0500 2007
|
50
|
+
# my_time.to_datetime # => Mon, 12 Nov 2007 23:04:21 -0500
|
51
|
+
#
|
52
|
+
# your_time = Time.parse("1/13/2009 1:13:03 P.M.") # => Tue Jan 13 13:13:03 -0500 2009
|
53
|
+
# your_time.to_datetime # => Tue, 13 Jan 2009 13:13:03 -0500
|
54
|
+
def to_datetime
|
55
|
+
::DateTime.civil(year, month, day, hour, min, sec, Rational(utc_offset, 86400))
|
56
|
+
end
|
57
|
+
end
|
28
58
|
end
|
29
59
|
end
|
30
60
|
end
|
@@ -94,7 +94,7 @@ module RiCal
|
|
94
94
|
# TODO: Need to research this, I beleive that this should also take the end time into account,
|
95
95
|
# but I need to research
|
96
96
|
def exclusion_match?(occurrence, exclusion)
|
97
|
-
exclusion && occurrence[:start] ==
|
97
|
+
exclusion && occurrence[:start] == exclusion[:start]
|
98
98
|
end
|
99
99
|
|
100
100
|
# Also exclude occurrences before the :starting date_time
|
@@ -172,15 +172,11 @@ module RiCal
|
|
172
172
|
@rdate_property = nil
|
173
173
|
@exdate_property = nil
|
174
174
|
@recurrence_id_property = occurrence_start
|
175
|
-
@
|
176
|
-
|
177
|
-
@dtend_property = occurrence_end
|
178
|
-
else
|
179
|
-
if dtend
|
180
|
-
my_duration = @dtend_property - @dtstart_property
|
181
|
-
@dtend_property = occurrence_start + my_duration
|
182
|
-
end
|
175
|
+
if @dtend_property && !occurrence_end
|
176
|
+
occurrence_end = occurrence_start + (@dtend_property - @dtstart_property)
|
183
177
|
end
|
178
|
+
@dtstart_property = dtstart_property.for_occurrence(occurrence_start)
|
179
|
+
@dtend_property = dtend_property.for_occurrence(occurrence_end) if @dtend_property
|
184
180
|
self
|
185
181
|
end
|
186
182
|
|
@@ -148,5 +148,17 @@ module RiCal
|
|
148
148
|
:end => date_time.advance(:hours => 24, :seconds => -1)}
|
149
149
|
end
|
150
150
|
end
|
151
|
+
|
152
|
+
def start_of_day?
|
153
|
+
true
|
154
|
+
end
|
155
|
+
|
156
|
+
def for_occurrence(occurrence)
|
157
|
+
if occurrence.start_of_day?
|
158
|
+
occurrence.to_ri_cal_date_value(timezone_finder)
|
159
|
+
else
|
160
|
+
occurrence.for_parent(timezone_finder)
|
161
|
+
end
|
162
|
+
end
|
151
163
|
end
|
152
164
|
end
|
@@ -253,8 +253,8 @@ module RiCal
|
|
253
253
|
|
254
254
|
|
255
255
|
# Return an RiCal::PropertyValue::DateTime representing the receiver.
|
256
|
-
def to_ri_cal_date_time_value
|
257
|
-
|
256
|
+
def to_ri_cal_date_time_value(timezone=nil)
|
257
|
+
for_parent(timezone)
|
258
258
|
end
|
259
259
|
|
260
260
|
def iso_year_and_week_one_start(wkst) #:nodoc:
|
@@ -269,6 +269,11 @@ module RiCal
|
|
269
269
|
def to_ri_cal_date_or_date_time_value(timezone_finder = nil) #:nodoc:
|
270
270
|
self.for_parent(timezone_finder)
|
271
271
|
end
|
272
|
+
|
273
|
+
# Return a Date property for this DateTime
|
274
|
+
def to_ri_cal_date_value(timezone_finder=nil)
|
275
|
+
PropertyValue::Date.new(timezone_finder, :value => @date_time_value.strftime("%Y%m%d"))
|
276
|
+
end
|
272
277
|
|
273
278
|
# Return the Ruby DateTime representation of the receiver
|
274
279
|
def to_datetime #:nodoc:
|
@@ -289,6 +294,14 @@ module RiCal
|
|
289
294
|
def add_date_times_to(required_timezones) #:nodoc:
|
290
295
|
required_timezones.add_datetime(self, tzid) if has_local_timezone?
|
291
296
|
end
|
297
|
+
|
298
|
+
def start_of_day?
|
299
|
+
[hour, min, sec] == [0,0,0]
|
300
|
+
end
|
301
|
+
|
302
|
+
def for_occurrence(occurrence)
|
303
|
+
occurrence.to_ri_cal_date_time_value(timezone_finder)
|
304
|
+
end
|
292
305
|
end
|
293
306
|
end
|
294
307
|
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.9'
|
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.9"
|
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-21}
|
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/gem_loader/load_active_support.rb", "tasks/gem_loader/load_tzinfo_gem.rb", "tasks/ri_cal.rake", "tasks/spec.rake"]
|
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/date_time/conversions.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"]
|
@@ -309,6 +309,14 @@ describe RiCal::Component::Event do
|
|
309
309
|
@it.dtstart = Date.parse("April 22, 2009")
|
310
310
|
unfold(@it.export).should match(/^DTSTART;VALUE=DATE:20090422$/)
|
311
311
|
end
|
312
|
+
|
313
|
+
it "should properly fold on export" do
|
314
|
+
@it.description = "Weather report looks nice, 80 degrees and partly cloudy, so following Michael's suggestion, let's meet at the food court at Crossroads:\n\nhttp://www.shopcrossroadsplaza.c...\n"
|
315
|
+
export_string = @it.export
|
316
|
+
export_string.should match(%r(^DESCRIPTION:Weather report looks nice\\, 80 degrees and partly cloudy\\, so$))
|
317
|
+
export_string.should match(%r(^ following Michael's suggestion\\, let's meet at the food court at Crossr$))
|
318
|
+
export_string.should match(%r(^ oads:\\n\\nhttp://www.shopcrossroadsplaza\.c\.\.\.\\n$))
|
319
|
+
end
|
312
320
|
end
|
313
321
|
|
314
322
|
if RiCal::TimeWithZone
|
@@ -8,7 +8,7 @@ end
|
|
8
8
|
|
9
9
|
# Note that this is more of a functional spec
|
10
10
|
describe RiCal::OccurrenceEnumerator do
|
11
|
-
|
11
|
+
|
12
12
|
Fr13Unbounded_Zulu = <<-TEXT
|
13
13
|
BEGIN:VEVENT
|
14
14
|
DTSTART:19970902T090000Z
|
@@ -45,24 +45,24 @@ TEXT
|
|
45
45
|
before(:each) do
|
46
46
|
@it = RiCal.parse_string(Fr13Unbounded_Zulu).first
|
47
47
|
end
|
48
|
-
|
48
|
+
|
49
49
|
it "should raise an ArgumentError with no options to limit result" do
|
50
50
|
lambda {@it.occurrences}.should raise_error(ArgumentError)
|
51
51
|
end
|
52
|
-
|
52
|
+
|
53
53
|
it "should have the right five occurrences when :count => 5 option is used" do
|
54
54
|
result = @it.occurrences(:count => 5)
|
55
55
|
result.should == Fr13UnboundedZuluExpectedFive
|
56
56
|
end
|
57
|
-
|
57
|
+
|
58
58
|
end
|
59
59
|
end
|
60
|
-
|
60
|
+
|
61
61
|
describe ".occurrences" do
|
62
62
|
before(:each) do
|
63
63
|
@it = RiCal.parse_string(Fr13Unbounded_Zulu).first
|
64
64
|
end
|
65
|
-
|
65
|
+
|
66
66
|
describe "with :starting specified" do
|
67
67
|
it "should exclude dates before :starting" do
|
68
68
|
result = @it.occurrences(:starting => Fr13UnboundedZuluExpectedFive[1].dtstart,
|
@@ -70,7 +70,7 @@ TEXT
|
|
70
70
|
result.map{|o|o.dtstart}.should == Fr13UnboundedZuluExpectedFive[1..-2].map{|e| e.dtstart}
|
71
71
|
end
|
72
72
|
end
|
73
|
-
|
73
|
+
|
74
74
|
describe "with :before specified" do
|
75
75
|
it "should exclude dates after :before" do
|
76
76
|
result = @it.occurrences(:before => Fr13UnboundedZuluExpectedFive[3].dtstart,
|
@@ -79,7 +79,7 @@ TEXT
|
|
79
79
|
end
|
80
80
|
end
|
81
81
|
end
|
82
|
-
|
82
|
+
|
83
83
|
|
84
84
|
describe ".each" do
|
85
85
|
describe " for Every Friday the 13th, forever" do
|
@@ -105,7 +105,7 @@ describe RiCal::OccurrenceEnumerator::OccurrenceMerger do
|
|
105
105
|
before(:each) do
|
106
106
|
@merger = RiCal::OccurrenceEnumerator::OccurrenceMerger
|
107
107
|
end
|
108
|
-
|
108
|
+
|
109
109
|
describe ".for" do
|
110
110
|
it "should return an EmptyEnumerator if the rules parameter is nil" do
|
111
111
|
@merger.for(nil, nil).should == RiCal::OccurrenceEnumerator::EmptyRulesEnumerator
|
@@ -114,23 +114,23 @@ describe RiCal::OccurrenceEnumerator::OccurrenceMerger do
|
|
114
114
|
it "should return an EmptyEnumerator if the rules parameter is empty" do
|
115
115
|
@merger.for(nil, []).should == RiCal::OccurrenceEnumerator::EmptyRulesEnumerator
|
116
116
|
end
|
117
|
-
|
117
|
+
|
118
118
|
describe "with a single rrule" do
|
119
119
|
before(:each) do
|
120
120
|
@component = mock("component", :dtstart => :dtstart_value)
|
121
121
|
@rrule = mock("rrule", :enumerator => :rrule_enumerator)
|
122
122
|
end
|
123
|
-
|
123
|
+
|
124
124
|
it "should return the enumerator the rrule" do
|
125
125
|
@merger.for(@component, [@rrule]).should == :rrule_enumerator
|
126
126
|
end
|
127
|
-
|
127
|
+
|
128
128
|
it "should pass the component to the enumerator instantiation" do
|
129
129
|
@rrule.should_receive(:enumerator).with(@component)
|
130
130
|
@merger.for(@component, [@rrule])
|
131
131
|
end
|
132
132
|
end
|
133
|
-
|
133
|
+
|
134
134
|
describe "with multiple rrules" do
|
135
135
|
before(:each) do
|
136
136
|
@component = mock("component", :dtstart => :dtstart_value)
|
@@ -139,25 +139,25 @@ describe RiCal::OccurrenceEnumerator::OccurrenceMerger do
|
|
139
139
|
@rrule1 = mock("rrule", :enumerator => @enum1)
|
140
140
|
@rrule2 = mock("rrule", :enumerator => @enum2)
|
141
141
|
end
|
142
|
-
|
142
|
+
|
143
143
|
it "should return an instance of RiCal::OccurrenceEnumerator::OccurrenceMerger" do
|
144
144
|
@merger.for(@component, [@rrule1, @rrule2]).should be_kind_of(RiCal::OccurrenceEnumerator::OccurrenceMerger)
|
145
145
|
end
|
146
|
-
|
146
|
+
|
147
147
|
it "should pass the component to the enumerator instantiation" do
|
148
148
|
@rrule1.should_receive(:enumerator).with(@component).and_return(@enum1)
|
149
149
|
@rrule2.should_receive(:enumerator).with(@component).and_return(@enum2)
|
150
150
|
@merger.for(@component, [@rrule1, @rrule2])
|
151
151
|
end
|
152
|
-
|
152
|
+
|
153
153
|
it "should preload the next occurrences" do
|
154
154
|
@enum1.should_receive(:next_occurrence).and_return(:occ1)
|
155
155
|
@enum2.should_receive(:next_occurrence).and_return(:occ2)
|
156
|
-
@merger.for(@component, [@rrule1, @rrule2])
|
156
|
+
@merger.for(@component, [@rrule1, @rrule2])
|
157
157
|
end
|
158
158
|
end
|
159
159
|
end
|
160
|
-
|
160
|
+
|
161
161
|
describe "#next_occurence" do
|
162
162
|
|
163
163
|
describe "with unique nexts" do
|
@@ -168,28 +168,28 @@ describe RiCal::OccurrenceEnumerator::OccurrenceMerger do
|
|
168
168
|
@rrule2 = mock("rrule", :enumerator => @enum2)
|
169
169
|
@it = @merger.new(0, [@rrule1, @rrule2])
|
170
170
|
end
|
171
|
-
|
171
|
+
|
172
172
|
it "should return the earliest occurrence" do
|
173
173
|
@it.next_occurrence.should == 2
|
174
174
|
end
|
175
|
-
|
175
|
+
|
176
176
|
it "should advance the enumerator which returned the result" do
|
177
177
|
@enum2.should_receive(:next_occurrence).and_return(4)
|
178
178
|
@it.next_occurrence
|
179
179
|
end
|
180
|
-
|
180
|
+
|
181
181
|
it "should not advance the other enumerator" do
|
182
182
|
@enum1.should_not_receive(:next_occurrence)
|
183
183
|
@it.next_occurrence
|
184
184
|
end
|
185
|
-
|
185
|
+
|
186
186
|
it "should properly update the next array" do
|
187
187
|
@enum2.stub!(:next_occurrence).and_return(4)
|
188
188
|
@it.next_occurrence
|
189
189
|
@it.nexts.should == [3, 4]
|
190
190
|
end
|
191
191
|
end
|
192
|
-
|
192
|
+
|
193
193
|
describe "with duplicated nexts" do
|
194
194
|
before(:each) do
|
195
195
|
@enum1 = mock_enumerator("rrule_enumerator1", 2)
|
@@ -198,26 +198,26 @@ describe RiCal::OccurrenceEnumerator::OccurrenceMerger do
|
|
198
198
|
@rrule2 = mock("rrule", :enumerator => @enum2)
|
199
199
|
@it = @merger.new(0, [@rrule1, @rrule2])
|
200
200
|
end
|
201
|
-
|
201
|
+
|
202
202
|
it "should return the earliest occurrence" do
|
203
203
|
@it.next_occurrence.should == 2
|
204
204
|
end
|
205
|
-
|
205
|
+
|
206
206
|
it "should advance both enumerators" do
|
207
207
|
@enum1.should_receive(:next_occurrence).and_return(5)
|
208
208
|
@enum2.should_receive(:next_occurrence).and_return(4)
|
209
209
|
@it.next_occurrence
|
210
210
|
end
|
211
|
-
|
211
|
+
|
212
212
|
it "should properly update the next array" do
|
213
213
|
@enum1.stub!(:next_occurrence).and_return(5)
|
214
214
|
@enum2.stub!(:next_occurrence).and_return(4)
|
215
215
|
@it.next_occurrence
|
216
216
|
@it.nexts.should == [5, 4]
|
217
217
|
end
|
218
|
-
|
218
|
+
|
219
219
|
end
|
220
|
-
|
220
|
+
|
221
221
|
describe "with all enumerators at end" do
|
222
222
|
before(:each) do
|
223
223
|
@enum1 = mock_enumerator("rrule_enumerator1", nil)
|
@@ -226,11 +226,11 @@ describe RiCal::OccurrenceEnumerator::OccurrenceMerger do
|
|
226
226
|
@rrule2 = mock("rrule", :enumerator => @enum2)
|
227
227
|
@it = @merger.new(0, [@rrule1, @rrule2])
|
228
228
|
end
|
229
|
-
|
229
|
+
|
230
230
|
it "should return nil" do
|
231
231
|
@it.next_occurrence.should == nil
|
232
232
|
end
|
233
|
-
|
233
|
+
|
234
234
|
it "should not advance the enumerators which returned the result" do
|
235
235
|
@enum1.should_not_receive(:next_occurrence)
|
236
236
|
@enum2.should_not_receive(:next_occurrence)
|
@@ -238,10 +238,42 @@ describe RiCal::OccurrenceEnumerator::OccurrenceMerger do
|
|
238
238
|
end
|
239
239
|
end
|
240
240
|
end
|
241
|
+
|
242
|
+
context "Ticket #4 from paulsm" do
|
243
|
+
it "should produce 4 occurrences" do
|
244
|
+
cal = RiCal.parse_string <<ENDCAL
|
245
|
+
BEGIN:VCALENDAR
|
246
|
+
METHOD:PUBLISH
|
247
|
+
PRODID:-//Apple Inc.//iCal 3.0//EN
|
248
|
+
CALSCALE:GREGORIAN
|
249
|
+
X-WR-CALNAME:Australian32Holidays
|
250
|
+
X-WR-CALDESC:Australian Public Holidays. Compiled from http://www.indust
|
251
|
+
rialrelations.nsw.gov.au/holidays/default.html and the links for the oth
|
252
|
+
er states at the bottom of that page
|
253
|
+
X-WR-RELCALID:AC1E4CE8-6690-49F6-A144-2F8891DFFD8D
|
254
|
+
VERSION:2.0
|
255
|
+
X-WR-TIMEZONE:Australia/Sydney
|
256
|
+
BEGIN:VEVENT
|
257
|
+
SEQUENCE:8
|
258
|
+
TRANSP:OPAQUE
|
259
|
+
UID:5B5579F3-2137-11D7-B491-00039301B0C2
|
260
|
+
DTSTART;VALUE=DATE:20020520
|
261
|
+
DTSTAMP:20060602T045619Z
|
262
|
+
SUMMARY:Adelaide Cup Carnival and Volunteers Day (SA)
|
263
|
+
EXDATE;VALUE=DATE:20060515
|
264
|
+
CREATED:20080916T000924Z
|
265
|
+
DTEND;VALUE=DATE:20020521
|
266
|
+
RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20070520;BYMONTH=5;BYDAY=3MO
|
267
|
+
END:VEVENT
|
268
|
+
END:VCALENDAR
|
269
|
+
ENDCAL
|
270
|
+
cal.first.events.first.occurrences.length.should == 4
|
271
|
+
end
|
272
|
+
end
|
241
273
|
|
242
|
-
|
243
|
-
|
244
|
-
|
274
|
+
context "Ticket #2 from paulsm" do
|
275
|
+
before(:each) do
|
276
|
+
cals = RiCal.parse_string <<ENDCAL
|
245
277
|
BEGIN:VCALENDAR
|
246
278
|
X-WR-TIMEZONE:America/New_York
|
247
279
|
PRODID:-//Apple Inc.//iCal 3.0//EN
|
@@ -327,10 +359,67 @@ END:VCALENDAR
|
|
327
359
|
ENDCAL
|
328
360
|
@event = cals.first.events.first
|
329
361
|
end
|
330
|
-
|
362
|
+
|
331
363
|
it "should be able to enumerate occurrences" do
|
332
364
|
@event.occurrences.should == [@event]
|
333
365
|
end
|
334
366
|
end
|
367
|
+
|
368
|
+
context "An event with a DATE dtstart, Ticket #6" do
|
369
|
+
before(:each) do
|
370
|
+
cal = RiCal.parse_string <<ENDCAL
|
371
|
+
BEGIN:VCALENDAR
|
372
|
+
PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN
|
373
|
+
VERSION:2.0
|
374
|
+
BEGIN:VEVENT
|
375
|
+
CREATED:20090520T092032Z
|
376
|
+
LAST-MODIFIED:20090520T092052Z
|
377
|
+
DTSTAMP:20090520T092032Z
|
378
|
+
UID:d41c124a-65c3-400e-bd04-1d2ee7b98352
|
379
|
+
SUMMARY:event2
|
380
|
+
RRULE:FREQ=MONTHLY;INTERVAL=1
|
381
|
+
DTSTART;VALUE=DATE:20090603
|
382
|
+
DTEND;VALUE=DATE:20090604
|
383
|
+
TRANSP:TRANSPARENT
|
384
|
+
END:VEVENT
|
385
|
+
END:VCALENDAR
|
386
|
+
ENDCAL
|
387
|
+
@occurrences = cal.first.events.first.occurrences(
|
388
|
+
:after => Date.parse('01/01/1990'),
|
389
|
+
:before => Date.parse("01/01/2010")
|
390
|
+
)
|
391
|
+
end
|
335
392
|
|
336
|
-
|
393
|
+
it "should produce the right dtstart values" do
|
394
|
+
@occurrences.map {|o| o.dtstart}.should == [
|
395
|
+
Date.parse("2009-06-03"),
|
396
|
+
Date.parse("2009-07-03"),
|
397
|
+
Date.parse("2009-08-03"),
|
398
|
+
Date.parse("2009-09-03"),
|
399
|
+
Date.parse("2009-10-03"),
|
400
|
+
Date.parse("2009-11-03"),
|
401
|
+
Date.parse("2009-12-03")
|
402
|
+
]
|
403
|
+
end
|
404
|
+
|
405
|
+
it "should produce events whose dtstarts are all dates" do
|
406
|
+
@occurrences.all? {|o| o.dtstart.class == ::Date}.should be_true
|
407
|
+
end
|
408
|
+
|
409
|
+
it "should produce the right dtend values" do
|
410
|
+
@occurrences.map {|o| o.dtend}.should == [
|
411
|
+
Date.parse("2009-06-04"),
|
412
|
+
Date.parse("2009-07-04"),
|
413
|
+
Date.parse("2009-08-04"),
|
414
|
+
Date.parse("2009-09-04"),
|
415
|
+
Date.parse("2009-10-04"),
|
416
|
+
Date.parse("2009-11-04"),
|
417
|
+
Date.parse("2009-12-04")
|
418
|
+
]
|
419
|
+
end
|
420
|
+
|
421
|
+
it "should produce events whose dtstends are all dates" do
|
422
|
+
@occurrences.all? {|o| o.dtend.class == ::Date}.should be_true
|
423
|
+
end
|
424
|
+
end
|
425
|
+
end
|
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.9
|
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-21 00:00:00 -07:00
|
13
13
|
default_executable: ri_cal
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -86,6 +86,7 @@ files:
|
|
86
86
|
- lib/ri_cal/core_extensions/date.rb
|
87
87
|
- lib/ri_cal/core_extensions/date/conversions.rb
|
88
88
|
- lib/ri_cal/core_extensions/date_time.rb
|
89
|
+
- lib/ri_cal/core_extensions/date_time/conversions.rb
|
89
90
|
- lib/ri_cal/core_extensions/object.rb
|
90
91
|
- lib/ri_cal/core_extensions/object/conversions.rb
|
91
92
|
- lib/ri_cal/core_extensions/string.rb
|