omnievent-icalendar 0.1.0.pre2 → 0.1.0.pre3

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