omnievent-icalendar 0.1.0.pre2 → 0.1.0.pre3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4fa79ecad05173ba82fe902d262b306f62efc15e422c61913041f0fbfc307444
4
- data.tar.gz: 96479a4d9592eb0933e04e3343ce0514b2bd4402ecf712c40b2ff5e406cfa864
3
+ metadata.gz: 478361c4c57731a099c80c38f58324a9596e5868b6b24f50e3c404382b56b3b9
4
+ data.tar.gz: fa69074455c32057662f0d1e66496b6337bdde8c529bcae4c5eaa8e392916896
5
5
  SHA512:
6
- metadata.gz: 3539a526615916b232c394ae6399f9532a9d324d731c29baf19e06bbea75c2c383a310a43791d9991fa20855716ffd477a9fd38dae7d204b7ea9fabd364aea75
7
- data.tar.gz: 64defa9e542f040b0bcc169d69cfc7bd2ae264ac80f158f1a76d840ba57e589f9dc3e7864d26c6fe228ed9caade086647d68e782e9722fc80996e06040c115b3
6
+ metadata.gz: 7aa84afb2b0062dde09e598554fb68ac416fbff767ce3aa923b2bfd737048f2b64811d61bb4552c39165348cf1aa4f2fe0f7dbf8643c59095b1b1e2cd34dd6ff
7
+ data.tar.gz: 96b84d19fbd6dcb7de58ffc6043a091c4eecf660dcfcb9c4d60799fbaf37997d00953f590309ee21737287a6db151c962e370aafe62c1276342f824f5e05cf21
data/.rspec CHANGED
@@ -1,3 +1,4 @@
1
1
  --format documentation
2
2
  --color
3
+ --exclude-pattern vendor/**/*_spec.rb
3
4
  --require spec_helper
data/CHANGELOG.md CHANGED
@@ -7,3 +7,7 @@
7
7
  ## [0.1.0.pre2] - 2022-10-21
8
8
 
9
9
  - Add recurrence support
10
+
11
+ ## [0.1.0.pre3] - 2022-11-20
12
+
13
+ - Fix various recurrence issues
data/Gemfile.lock CHANGED
@@ -1,12 +1,12 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- omnievent-icalendar (0.1.0.pre2)
4
+ omnievent-icalendar (0.1.0.pre3)
5
5
  addressable (~> 2.7)
6
6
  icalendar
7
7
  icalendar-recurrence (~> 1.1)
8
8
  omnievent
9
- open-uri
9
+ open-uri (= 0.1.0)
10
10
 
11
11
  GEM
12
12
  remote: https://rubygems.org/
@@ -18,7 +18,6 @@ GEM
18
18
  concurrent-ruby (1.1.10)
19
19
  crack (0.4.5)
20
20
  rexml
21
- date (3.2.2)
22
21
  diff-lcs (1.5.0)
23
22
  hashdiff (1.0.1)
24
23
  hashie (5.0.0)
@@ -34,51 +33,44 @@ GEM
34
33
  hashie (>= 3.4.6)
35
34
  iso-639 (~> 0.3.5)
36
35
  tzinfo (~> 2.0)
37
- open-uri (0.2.0)
38
- stringio
39
- time
40
- uri
36
+ open-uri (0.1.0)
41
37
  parallel (1.22.1)
42
38
  parser (3.1.2.1)
43
39
  ast (~> 2.4.1)
44
40
  public_suffix (5.0.0)
45
41
  rainbow (3.1.1)
46
42
  rake (13.0.6)
47
- regexp_parser (2.6.0)
43
+ regexp_parser (2.6.1)
48
44
  rexml (3.2.5)
49
- rspec (3.11.0)
50
- rspec-core (~> 3.11.0)
51
- rspec-expectations (~> 3.11.0)
52
- rspec-mocks (~> 3.11.0)
53
- rspec-core (3.11.0)
54
- rspec-support (~> 3.11.0)
55
- rspec-expectations (3.11.1)
45
+ rspec (3.12.0)
46
+ rspec-core (~> 3.12.0)
47
+ rspec-expectations (~> 3.12.0)
48
+ rspec-mocks (~> 3.12.0)
49
+ rspec-core (3.12.0)
50
+ rspec-support (~> 3.12.0)
51
+ rspec-expectations (3.12.0)
56
52
  diff-lcs (>= 1.2.0, < 2.0)
57
- rspec-support (~> 3.11.0)
58
- rspec-mocks (3.11.1)
53
+ rspec-support (~> 3.12.0)
54
+ rspec-mocks (3.12.0)
59
55
  diff-lcs (>= 1.2.0, < 2.0)
60
- rspec-support (~> 3.11.0)
61
- rspec-support (3.11.1)
62
- rubocop (1.36.0)
56
+ rspec-support (~> 3.12.0)
57
+ rspec-support (3.12.0)
58
+ rubocop (1.39.0)
63
59
  json (~> 2.3)
64
60
  parallel (~> 1.10)
65
61
  parser (>= 3.1.2.1)
66
62
  rainbow (>= 2.2.2, < 4.0)
67
63
  regexp_parser (>= 1.8, < 3.0)
68
64
  rexml (>= 3.2.5, < 4.0)
69
- rubocop-ast (>= 1.20.1, < 2.0)
65
+ rubocop-ast (>= 1.23.0, < 2.0)
70
66
  ruby-progressbar (~> 1.7)
71
67
  unicode-display_width (>= 1.4.0, < 3.0)
72
- rubocop-ast (1.21.0)
68
+ rubocop-ast (1.23.0)
73
69
  parser (>= 3.1.1.0)
74
70
  ruby-progressbar (1.11.0)
75
- stringio (3.0.2)
76
- time (0.2.0)
77
- date
78
71
  tzinfo (2.0.5)
79
72
  concurrent-ruby (~> 1.0)
80
73
  unicode-display_width (2.3.0)
81
- uri (0.11.0)
82
74
  webmock (3.18.1)
83
75
  addressable (>= 2.8.0)
84
76
  crack (>= 0.3.2)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module OmniEvent
4
4
  module Icalendar
5
- VERSION = "0.1.0.pre2"
5
+ VERSION = "0.1.0.pre3"
6
6
  end
7
7
  end
@@ -95,10 +95,8 @@ module OmniEvent
95
95
  end
96
96
 
97
97
  def format_uid(event)
98
- # See https://datatracker.ietf.org/doc/html/rfc5545#section-3.8.4.4
99
98
  event_uid = event.uid.to_s
100
99
  event_uid += "#{options.uid_delimiter}#{event.recurrence_id}" if event.recurrence_id
101
- event_uid += "#{options.uid_delimiter}#{event.sequence}" if event.sequence
102
100
  event_uid
103
101
  end
104
102
 
@@ -116,23 +114,53 @@ module OmniEvent
116
114
  end
117
115
 
118
116
  def expand_recurrences(events)
119
- events.each_with_object([]) do |event, res|
120
- schedule = ::Icalendar::Recurrence::Schedule.new(event)
121
-
122
- occurrences = if options.from_time && options.to_time
123
- schedule.occurrences_between(options.from_time, options.to_time)
124
- else
125
- schedule.all_occurrences
126
- end
127
-
128
- occurrences.each do |occurrence|
129
- occurrence_event = event.clone
130
- occurrence_event.recurrence_id = occurrence.start_time
131
- occurrence_event.dtstart = occurrence.start_time
132
- occurrence_event.dtend = occurrence.end_time
133
- res << occurrence_event
117
+ result = []
118
+
119
+ events.each do |event|
120
+ if recurrence?(event)
121
+ schedule = ::Icalendar::Recurrence::Schedule.new(event)
122
+ exceptions = events.select { |e| e.recurrence_id && (e.uid == event.uid) }
123
+
124
+ extract_occurences(schedule).each do |occurrence|
125
+ next if exception?(exceptions, occurrence)
126
+
127
+ occurrence_event = event.clone
128
+ occurrence_event.recurrence_id = occurrence.start_time
129
+ occurrence_event.dtstart = occurrence.start_time
130
+ occurrence_event.dtend = occurrence.end_time
131
+
132
+ result << occurrence_event
133
+ end
134
+ else
135
+ siblings = events
136
+ .select { |e| e.recurrence_id.to_i == event.recurrence_id.to_i }
137
+ .sort_by(&:sequence)
138
+
139
+ result << event if siblings.none? || (siblings.last.sequence == event.sequence)
134
140
  end
135
141
  end
142
+
143
+ result.sort_by(&:dtstart)
144
+ end
145
+
146
+ def extract_occurences(schedule)
147
+ if options.from_time && options.to_time
148
+ schedule.occurrences_between(options.from_time, options.to_time)
149
+ else
150
+ schedule.all_occurrences
151
+ end
152
+ end
153
+
154
+ def recurrence?(event)
155
+ present?(event.rrule) || present?(event.rdate)
156
+ end
157
+
158
+ def present?(property)
159
+ !!property && property.any?
160
+ end
161
+
162
+ def exception?(exceptions, occurrence)
163
+ exceptions.any? { |e| e.recurrence_id.to_i == occurrence.start_time.to_i }
136
164
  end
137
165
  end
138
166
  end
@@ -32,7 +32,7 @@ Gem::Specification.new do |spec|
32
32
  spec.add_dependency "icalendar"
33
33
  spec.add_dependency "icalendar-recurrence", "~> 1.1"
34
34
  spec.add_dependency "omnievent"
35
- spec.add_dependency "open-uri"
35
+ spec.add_dependency "open-uri", "0.1.0"
36
36
  spec.add_development_dependency "byebug"
37
37
  spec.add_development_dependency "webmock"
38
38
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: omnievent-icalendar
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.pre2
4
+ version: 0.1.0.pre3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Angus McLeod
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-10-21 00:00:00.000000000 Z
11
+ date: 2022-11-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -70,16 +70,16 @@ dependencies:
70
70
  name: open-uri
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - '='
74
74
  - !ruby/object:Gem::Version
75
- version: '0'
75
+ version: 0.1.0
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - '='
81
81
  - !ruby/object:Gem::Version
82
- version: '0'
82
+ version: 0.1.0
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: byebug
85
85
  requirement: !ruby/object:Gem::Requirement