ice_cube 0.4.2 → 0.4.3

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.
@@ -60,34 +60,34 @@ module IceCube
60
60
 
61
61
  TIME_FORMAT = '%B %e, %Y'
62
62
  SEPARATOR = ' / '
63
+ NEWLINE = "\n"
63
64
 
64
65
  # use with caution
65
66
  # incomplete and not entirely tested - no time representation in dates
66
67
  # there's a lot that can happen here
67
68
  def to_s
68
- representation = ''
69
+ representation_pieces = []
69
70
  inc_dates = (@rdates - @exdates).uniq
70
- if inc_dates && !inc_dates.empty?
71
- representation << inc_dates.sort.map { |d| d.strftime(TIME_FORMAT) }.join(SEPARATOR)
72
- end
73
- if @rrule_occurrence_heads && !@rrule_occurrence_heads.empty?
74
- representation << SEPARATOR unless representation.empty?
75
- representation << @rrule_occurrence_heads.map{ |r| r.rule.to_s }.join(SEPARATOR)
76
- end
77
- if @exrule_occurrence_heads && !@exrule_occurrence_heads.empty?
78
- representation << SEPARATOR unless representation.empty?
79
- representation << @exrule_occurrence_heads.map { |r| 'not ' << r.to_s }.join(SEPARATOR)
80
- end
81
- if @exdates && !@exdates.empty?
82
- representation << SEPARATOR unless representation.empty?
83
- representation << @exdates.uniq.sort.map { |d| 'not on ' << d.strftime(TIME_FORMAT) }.join(SEPARATOR)
84
- end
85
- if @end_time
86
- representation << "until #{end_time.strftime(TIME_FORMAT)}"
87
- end
88
- representation
71
+ representation_pieces.concat inc_dates.sort.map { |d| d.strftime(TIME_FORMAT) } unless inc_dates.empty?
72
+ representation_pieces.concat @rrule_occurrence_heads.map{ |r| r.rule.to_s } if @rrule_occurrence_heads
73
+ representation_pieces.concat @exrule_occurrence_heads.map { |r| 'not ' << r.rule.to_s } if @exrule_occurrence_heads
74
+ representation_pieces.concat @exdates.uniq.sort.map { |d| 'not on ' << d.strftime(TIME_FORMAT) } if @exdates
75
+ representation_pieces << "until #{end_time.strftime(TIME_FORMAT)}" if @end_time
76
+ representation_pieces.join(SEPARATOR)
89
77
  end
90
78
 
79
+ def to_ical
80
+ representation_pieces = ["DTSTART#{TimeUtil.ical_format(@start_date)}"]
81
+ representation_pieces << "DURATION:#{TimeUtil.ical_duration(@duration)}" if @duration
82
+ inc_dates = (@rdates - @exdates).uniq
83
+ representation_pieces.concat inc_dates.sort.map { |d| "RDATE#{TimeUtil.ical_format(d)}" } if inc_dates.any?
84
+ representation_pieces.concat @exdates.uniq.sort.map { |d| "EXDATE#{TimeUtil.ical_format(d)}" } if @exdates
85
+ representation_pieces.concat @rrule_occurrence_heads.map { |r| "RRULE:#{r.rule.to_ical}" } if @rrule_occurrence_heads
86
+ representation_pieces.concat @exrule_occurrence_heads.map { |r| "EXRULE:#{r.rule.to_ical}" } if @exrule_occurrence_heads
87
+ representation_pieces << "DTEND#{TimeUtil.ical_format(@end_time)}" if @end_time
88
+ representation_pieces.join(NEWLINE)
89
+ end
90
+
91
91
  def occurring_at?(time)
92
92
  return false if @exdates.include?(time)
93
93
  return true if @rdates.include?(time)
@@ -27,5 +27,23 @@ module TimeUtil
27
27
  def self.days_in_month(date)
28
28
  is_leap?(date) ? LeapYearMonthDays[date.month - 1] : CommonYearMonthDays[date.month - 1]
29
29
  end
30
+
31
+ def self.ical_format(time)
32
+ if time.utc?
33
+ ":#{time.strftime('%Y%m%dT%H%M%SZ')}" # utc time
34
+ else
35
+ ";TZID=#{time.strftime('%Z:%Y%m%dT%H%M%S')}" # local time specified
36
+ end
37
+ end
38
+
39
+ def self.ical_duration(duration)
40
+ hours = duration / 3600; duration %= 3600
41
+ minutes = duration / 60; duration %= 60
42
+ repr = ''
43
+ repr << "#{hours}H" if hours > 0
44
+ repr << "#{minutes}M" if minutes > 0
45
+ repr << "#{duration}S" if duration > 0
46
+ "PT#{repr}"
47
+ end
30
48
 
31
49
  end
@@ -1,5 +1,5 @@
1
1
  module IceCube
2
2
 
3
- VERSION = "0.4.2"
3
+ VERSION = '0.4.3'
4
4
 
5
5
  end
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ice_cube
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 9
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
8
  - 4
8
- - 2
9
- version: 0.4.2
9
+ - 3
10
+ version: 0.4.3
10
11
  platform: ruby
11
12
  authors:
12
13
  - John Crepezzi
@@ -14,16 +15,18 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-07-06 00:00:00 -04:00
18
+ date: 2010-07-27 00:00:00 -04:00
18
19
  default_executable:
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
21
22
  name: rspec
22
23
  prerelease: false
23
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
24
26
  requirements:
25
27
  - - ">="
26
28
  - !ruby/object:Gem::Version
29
+ hash: 3
27
30
  segments:
28
31
  - 0
29
32
  version: "0"
@@ -71,23 +74,27 @@ rdoc_options: []
71
74
  require_paths:
72
75
  - lib
73
76
  required_ruby_version: !ruby/object:Gem::Requirement
77
+ none: false
74
78
  requirements:
75
79
  - - ">="
76
80
  - !ruby/object:Gem::Version
81
+ hash: 3
77
82
  segments:
78
83
  - 0
79
84
  version: "0"
80
85
  required_rubygems_version: !ruby/object:Gem::Requirement
86
+ none: false
81
87
  requirements:
82
88
  - - ">="
83
89
  - !ruby/object:Gem::Version
90
+ hash: 3
84
91
  segments:
85
92
  - 0
86
93
  version: "0"
87
94
  requirements: []
88
95
 
89
96
  rubyforge_project: ice-cube
90
- rubygems_version: 1.3.6
97
+ rubygems_version: 1.3.7
91
98
  signing_key:
92
99
  specification_version: 3
93
100
  summary: Ruby Date Recurrence Library