reprise 0.1.0-x86_64-linux → 0.1.2-x86_64-linux

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: 2a2b8caf64132a48a6659be0fb6d594d90cd68496d4f6f3591b8ca8b20e8b360
4
- data.tar.gz: a0fcbb0466d95efcd23a6eb2c2dd01ea62089f1294f5ae6c7eaa93b0c7ceacc0
3
+ metadata.gz: 7131c46eebe9117738a4876a8ab79f7724eba1e5ff2fef8c2ff4f216bbd54288
4
+ data.tar.gz: 323287de6d54b70f99d434599578414329f5286a903b1e05223afdef82d3eb3d
5
5
  SHA512:
6
- metadata.gz: 011d606bdef67626a699ef034ad5e6bbd8077d30ca4736132f7fa8705e3424bd3de0352052a924756126a4d7c9aa81b635d4bc06ca9fd9701ef0da707b5cdc27
7
- data.tar.gz: c9c3a537b0da59d90f13f8e267979b958810b24aaac2623706a34b1cb016040683a6031ba89b4137adc5f03fe1b54aa6421e496d652c6ad0a429489dccce7eb8
6
+ metadata.gz: 07e227ef61e9133e3a6de73beaccf707fec8bf288b6a0fc5b9e1a6462cc75d0a2c5c64a85c633478f5b9c53226013e834a6dd23c8f7db0d5a107afab1c622f54
7
+ data.tar.gz: 77e4e5ea23b838d907f3f51f2ecc5a17141d901c2d40b3eae8203aa61fb5fcf9635972864d22fb8ef53b7a9b917cc0dbe1bb5a76e7001eb1d9224d6851cc1bfd
data/Cargo.lock CHANGED
@@ -594,7 +594,7 @@ checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b"
594
594
 
595
595
  [[package]]
596
596
  name = "reprise"
597
- version = "0.1.0"
597
+ version = "0.1.2"
598
598
  dependencies = [
599
599
  "chrono",
600
600
  "chrono-tz",
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Reprise
2
2
 
3
- [![Tests](https://github.com/jordanhiltunen/reprise/actions/workflows/test.yml/badge.svg)](https://github.com/jordanhiltunen/reprise/actions/workflows/test.yml) | [![Test CRuby Gem Build](https://github.com/jordanhiltunen/reprise/actions/workflows/cruby-build-and-install.yml/badge.svg)](https://github.com/jordanhiltunen/reprise/actions/workflows/cruby-build-and-install.yml)
3
+ [![Gem Version](https://badge.fury.io/rb/reprise.svg)](https://badge.fury.io/rb/reprise) | [![Tests](https://github.com/jordanhiltunen/reprise/actions/workflows/test.yml/badge.svg)](https://github.com/jordanhiltunen/reprise/actions/workflows/test.yml) | [![Test CRuby Gem Build](https://github.com/jordanhiltunen/reprise/actions/workflows/cruby-build-and-install.yml/badge.svg)](https://github.com/jordanhiltunen/reprise/actions/workflows/cruby-build-and-install.yml)
4
4
 
5
5
  Reprise is an experimental performance-first Ruby gem that provides support for defining event recurrence
6
6
  rules and generating & querying their future occurrences. Depending on your use case,
@@ -21,9 +21,11 @@ gem "reprise"
21
21
 
22
22
  ## Usage
23
23
 
24
+ _For a complete reference of all of the methods and options available, please [see our documentation](https://rubydoc.info/gems/reprise)._
25
+
24
26
  ### Initialize a new schedule
25
27
 
26
- All schedules need to be initialized with a `start_time` and `end_time`:
28
+ All schedules need to be initialized with `starts_at` and `ends_at` time bookends:
27
29
 
28
30
  ```ruby
29
31
  may_26_2015_four_thirty_pm_in_rome = Time.parse("2015-05-26 10:30:45").in_time_zone("Rome")
@@ -64,8 +66,9 @@ started at as the local time for each future occurrence:
64
66
 
65
67
  ```ruby
66
68
  first_occurrence = schedule.occurrences.first
67
- # => <Reprise::Core::Occurrence start_time="2015-05-31T14:30:45+00:00" end_time="2015-05-31T14:45:45+00:00" label="nil">
68
- first_occurrence.start_time.in_time_zone("Rome")
69
+ # => <Reprise::Core::Occurrence starts_at="2015-05-31T14:30:45+00:00" ends_at="2015-05-31T14:45:45+00:00" label="nil">
70
+
71
+ first_occurrence.starts_at.in_time_zone("Rome")
69
72
  # => Sun, 31 May 2015 16:30:45.000000000 CEST +02:00 # <- 4:30 PM
70
73
  ```
71
74
 
@@ -75,8 +78,9 @@ either by passing an hour/minute/second hash to `time_of_day`:
75
78
  ```ruby
76
79
  schedule.repeat_weekly(:sunday, time_of_day: { hour: 9, minute: 30 }, duration_in_seconds: 60)
77
80
  first_occurrence = schedule.occurrences.first
78
- # => => <Reprise::Core::Occurrence start_time="2015-05-31T07:30:00+00:00" end_time="2015-05-31T07:31:00+00:00" label="nil">
79
- first_occurrence.start_time.in_time_zone("Rome")
81
+ # => <Reprise::Core::Occurrence starts_at="2015-05-31T07:30:00+00:00" ends_at="2015-05-31T07:31:00+00:00" label="nil">
82
+
83
+ first_occurrence.starts_at.in_time_zone("Rome")
80
84
  # => Sun, 31 May 2015 09:30:00.000000000 CEST +02:00
81
85
  ```
82
86
 
@@ -85,8 +89,9 @@ Or, by passing a `Time` object instead:
85
89
  ```ruby
86
90
  ten_forty_five_pm_in_rome = Time.parse("2015-05-27 04:45:00").in_time_zone("Rome")
87
91
  schedule.repeat_weekly(:tuesday, time_of_day: ten_forty_five_pm_in_rome, duration_in_seconds: 60)
88
- # => <Reprise::Core::Occurrence start_time="2015-06-02T08:45:00+00:00" end_time="2015-06-02T08:46:00+00:00" label="nil">
89
- first_occurrence.start_time.in_time_zone("Rome")
92
+ # => <Reprise::Core::Occurrence starts_at="2015-06-02T08:45:00+00:00" ends_at="2015-06-02T08:46:00+00:00" label="nil">
93
+
94
+ first_occurrence.starts_at.in_time_zone("Rome")
90
95
  # => Tue, 02 Jun 2015 10:45:00.000000000 CEST +02:00
91
96
  ```
92
97
 
@@ -102,9 +107,11 @@ schedule = Reprise::Schedule.new(
102
107
 
103
108
  schedule.repeat_weekly(:wednesday, time_of_day: { hour: 9, minute: 30 }, duration_in_seconds: 10.minutes)
104
109
  occurrences = schedule.occurrences
110
+
105
111
  puts occurrences.size
106
112
  # => 29
107
- puts (occurrences.last.start_time.to_date - occurrences.first.start_time.to_date).to_i
113
+
114
+ puts (occurrences.last.starts_at.to_date - occurrences.first.starts_at.to_date).to_i
108
115
  # => 196 # days
109
116
  ```
110
117
 
@@ -121,18 +128,20 @@ schedule.repeat_weekly(
121
128
  occurrences = schedule.occurrences
122
129
  puts occurrences.size
123
130
  # => 8
124
- puts occurrences.first.start_time.in_time_zone("Rome")
131
+
132
+ puts occurrences.first.starts_at.in_time_zone("Rome")
125
133
  # 2015-07-10 04:01:00 +0200
126
- puts occurrences.last.start_time.in_time_zone("Rome")
134
+
135
+ puts occurrences.last.starts_at.in_time_zone("Rome")
127
136
  # 2015-08-28 04:01:00 +0200
128
- puts (occurrences.last.start_time.to_date - occurrences.first.start_time.to_date).to_i
137
+
138
+ puts (occurrences.last.starts_at.to_date - occurrences.first.starts_at.to_date).to_i
129
139
  # => 49 # days
130
140
  ```
131
141
 
132
142
  There are many recurring series that you can create; `#repeat_minutely`, `#repeat_hourly`,
133
- `#repeat_daily`, `#repeat_weekly`, `#repeat_monthly_by_day`, and `#repeat_monthly_by_nth_weekday`.
134
-
135
- For more information on each method, see the docs.
143
+ `#repeat_daily`, `#repeat_weekly`, `#repeat_monthly_by_day`, `#repeat_monthly_by_nth_weekday`,
144
+ and `#repeat_annually_by_day`.
136
145
 
137
146
  #### Adding labels to the occurrences of each series
138
147
 
@@ -142,14 +151,15 @@ you can add an optional label:
142
151
  ```ruby
143
152
  schedule.repeat_daily(label: "Coffee Time", time_of_day: { hour: 8 }, duration_in_seconds: 15.minutes)
144
153
  schedule.repeat_daily(label: "Tea Time", interval: 3, time_of_day: { hour: 9 }, duration_in_seconds: 10.minutes)
154
+
145
155
  schedule.occurrences.take(7).map { |o| puts o.inspect }
146
- # => <Reprise::Core::Occurrence label="Coffee Time" start_time="2015-05-27T06:00:00+00:00" end_time="2015-05-27T06:15:00+00:00">
147
- # => <Reprise::Core::Occurrence label="Tea Time" start_time="2015-05-27T07:00:00+00:00" end_time="2015-05-27T07:10:00+00:00">
148
- # => <Reprise::Core::Occurrence label="Coffee Time" start_time="2015-05-28T06:00:00+00:00" end_time="2015-05-28T06:15:00+00:00">
149
- # => <Reprise::Core::Occurrence label="Coffee Time" start_time="2015-05-29T06:00:00+00:00" end_time="2015-05-29T06:15:00+00:00">
150
- # => <Reprise::Core::Occurrence label="Coffee Time" start_time="2015-05-30T06:00:00+00:00" end_time="2015-05-30T06:15:00+00:00">
151
- # => <Reprise::Core::Occurrence label="Tea Time" start_time="2015-05-30T07:00:00+00:00" end_time="2015-05-30T07:10:00+00:00">
152
- # => <Reprise::Core::Occurrence label="Coffee Time" start_time="2015-05-31T06:00:00+00:00" end_time="2015-05-31T06:15:00+00:00">
156
+ # => <Reprise::Core::Occurrence label="Coffee Time" starts_at="2015-05-27T06:00:00+00:00" ends_at="2015-05-27T06:15:00+00:00">
157
+ # => <Reprise::Core::Occurrence label="Tea Time" starts_at="2015-05-27T07:00:00+00:00" ends_at="2015-05-27T07:10:00+00:00">
158
+ # => <Reprise::Core::Occurrence label="Coffee Time" starts_at="2015-05-28T06:00:00+00:00" ends_at="2015-05-28T06:15:00+00:00">
159
+ # => <Reprise::Core::Occurrence label="Coffee Time" starts_at="2015-05-29T06:00:00+00:00" ends_at="2015-05-29T06:15:00+00:00">
160
+ # => <Reprise::Core::Occurrence label="Coffee Time" starts_at="2015-05-30T06:00:00+00:00" ends_at="2015-05-30T06:15:00+00:00">
161
+ # => <Reprise::Core::Occurrence label="Tea Time" starts_at="2015-05-30T07:00:00+00:00" ends_at="2015-05-30T07:10:00+00:00">
162
+ # => <Reprise::Core::Occurrence label="Coffee Time" starts_at="2015-05-31T06:00:00+00:00" ends_at="2015-05-31T06:15:00+00:00">
153
163
  ```
154
164
 
155
165
  #### Excluding time intervals from the schedule's occurrences
@@ -160,11 +170,11 @@ occurrences and need to be excluded, you can add exclusions to your schedule bef
160
170
  ```ruby
161
171
  schedule.repeat_daily(label: "Standing Meeting", ends_at: may_26_2015_four_thirty_pm_in_rome + 5.days, duration_in_seconds: 15.minutes)
162
172
  schedule.occurrences.map { |o| puts o.inspect }
163
- # => <Reprise::Core::Occurrence start_time="2015-05-26T14:30:45+00:00" end_time="2015-05-26T14:45:45+00:00" label="Standing Meeting">
164
- # => <Reprise::Core::Occurrence start_time="2015-05-27T14:30:45+00:00" end_time="2015-05-27T14:45:45+00:00" label="Standing Meeting">
165
- # => <Reprise::Core::Occurrence start_time="2015-05-28T14:30:45+00:00" end_time="2015-05-28T14:45:45+00:00" label="Standing Meeting">
166
- # => <Reprise::Core::Occurrence start_time="2015-05-29T14:30:45+00:00" end_time="2015-05-29T14:45:45+00:00" label="Standing Meeting">
167
- # => <Reprise::Core::Occurrence start_time="2015-05-30T14:30:45+00:00" end_time="2015-05-30T14:45:45+00:00" label="Standing Meeting">
173
+ # => <Reprise::Core::Occurrence starts_at="2015-05-26T14:30:45+00:00" ends_at="2015-05-26T14:45:45+00:00" label="Standing Meeting">
174
+ # => <Reprise::Core::Occurrence starts_at="2015-05-27T14:30:45+00:00" ends_at="2015-05-27T14:45:45+00:00" label="Standing Meeting">
175
+ # => <Reprise::Core::Occurrence starts_at="2015-05-28T14:30:45+00:00" ends_at="2015-05-28T14:45:45+00:00" label="Standing Meeting">
176
+ # => <Reprise::Core::Occurrence starts_at="2015-05-29T14:30:45+00:00" ends_at="2015-05-29T14:45:45+00:00" label="Standing Meeting">
177
+ # => <Reprise::Core::Occurrence starts_at="2015-05-30T14:30:45+00:00" ends_at="2015-05-30T14:45:45+00:00" label="Standing Meeting">
168
178
 
169
179
  # You don't need to specify entire days; you can pass time intervals as narrow or wide as you like.
170
180
  schedule.add_exclusion(
@@ -174,10 +184,10 @@ schedule.add_exclusion(
174
184
 
175
185
  schedule.occurrences.map { |o| puts o.inspect }
176
186
  # N.B. The occurrence on 2015-05-28 is now excluded.
177
- # => <Reprise::Core::Occurrence start_time="2015-05-26T14:30:45+00:00" end_time="2015-05-26T14:45:45+00:00" label="Standing Meeting">
178
- # => <Reprise::Core::Occurrence start_time="2015-05-27T14:30:45+00:00" end_time="2015-05-27T14:45:45+00:00" label="Standing Meeting">
179
- # => <Reprise::Core::Occurrence start_time="2015-05-29T14:30:45+00:00" end_time="2015-05-29T14:45:45+00:00" label="Standing Meeting">
180
- # => <Reprise::Core::Occurrence start_time="2015-05-30T14:30:45+00:00" end_time="2015-05-30T14:45:45+00:00" label="Standing Meeting">
187
+ # => <Reprise::Core::Occurrence starts_at="2015-05-26T14:30:45+00:00" ends_at="2015-05-26T14:45:45+00:00" label="Standing Meeting">
188
+ # => <Reprise::Core::Occurrence starts_at="2015-05-27T14:30:45+00:00" ends_at="2015-05-27T14:45:45+00:00" label="Standing Meeting">
189
+ # => <Reprise::Core::Occurrence starts_at="2015-05-29T14:30:45+00:00" ends_at="2015-05-29T14:45:45+00:00" label="Standing Meeting">
190
+ # => <Reprise::Core::Occurrence starts_at="2015-05-30T14:30:45+00:00" ends_at="2015-05-30T14:45:45+00:00" label="Standing Meeting">
181
191
  ```
182
192
 
183
193
  #### Querying for occurrences within a given time interval
@@ -198,7 +208,7 @@ schedule.occurrences_between(
198
208
  may_26_2015_four_thirty_pm_in_rome + 2.days,
199
209
  may_26_2015_four_thirty_pm_in_rome + 3.days,
200
210
  ).map { |o| puts o.inspect }
201
- # => <Reprise::Core::Occurrence start_time="2015-05-28T14:30:45+00:00" end_time="2015-05-28T14:45:45+00:00" label="Standing Meeting">
211
+ # => <Reprise::Core::Occurrence starts_at="2015-05-28T14:30:45+00:00" ends_at="2015-05-28T14:45:45+00:00" label="Standing Meeting">
202
212
  ```
203
213
 
204
214
  Both `#occurs_between?` and `#occurrences_between` also support an optional `include_overlapping`
@@ -235,6 +245,7 @@ A truism in the Ruby community is that "Ruby is slow, but that doesn't matter fo
235
245
  > speed, or throughput that Ruby chokes on. Or because the trade-offs are worth it: Often the
236
246
  > quicker development, cheaper development, faster time-to-market etc is worth the extra resources
237
247
  > (servers, hardware, SAAS) you must throw at your app to keep it performing acceptable.
248
+ >
238
249
  > https://berk.es/2022/08/09/ruby-slow-database-slow/
239
250
 
240
251
  This is often delightfully true, until on the odd occasion Ruby's speed requires that a straightforward feature
@@ -305,7 +316,7 @@ and 3:30 - 4:30 PM.
305
316
  How do you filter out recurring series occurrences that conflict with other schedule entries that exist
306
317
  in your application?
307
318
 
308
- At time of writing, alternative gems' solutions to this problem are all unfortunately lacking:
319
+ At time of writing, alternative gems' solutions to this problem are somewhat wanting:
309
320
  - **None**: It is entirely the responsibility of the client application to handle occurrence exclusions,
310
321
  despite this logic being core to the domain of recurring schedule management.
311
322
  - **Date-based exclusion**: Client applications can pass specific dates when occurrences should be excluded.
Binary file
Binary file
Binary file
@@ -8,9 +8,9 @@ module Reprise
8
8
  # of adding documentation; it is defined dynamically within
9
9
  # the Rust extension.
10
10
  class Occurrence
11
- # @!attribute [r] start_time
11
+ # @!attribute [r] starts_at
12
12
  # @return [Time] The start time of the occurrence, given in the current system time zone.
13
- # @!attribute [r] end_time
13
+ # @!attribute [r] ends_at
14
14
  # @return [Time] The end time of the occurrence, given in the current system time zone.
15
15
  # @!attribute [r] label
16
16
  # @return [String, nil] The label given to the recurring series from which the
@@ -81,7 +81,7 @@ module Reprise
81
81
 
82
82
  # @!macro [new] duration_in_seconds
83
83
  # @param duration_in_seconds [Integer]
84
- # This determines the end time of each occurrence ({Reprise::Core::Occurrence#end_time}), and also
84
+ # This determines the end time of each occurrence ({Reprise::Core::Occurrence#ends_at}), and also
85
85
  # influences occurrence queries, and whether any added exclusions conflict with any of the schedule's
86
86
  # occurrences.
87
87
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Reprise
4
- VERSION = "0.1.0"
4
+ VERSION = "0.1.2"
5
5
  end
data/lib/reprise.rb CHANGED
@@ -1,9 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ begin
4
+ require "reprise/#{RUBY_VERSION.to_f}/reprise"
5
+ rescue LoadError
6
+ require "reprise/reprise"
7
+ end
8
+
3
9
  require "active_support"
4
10
  require "active_support/core_ext/integer/time"
5
11
  require "active_support/core_ext/time"
6
- require "reprise/reprise"
7
12
  require "reprise/schedule"
8
13
  require "reprise/time_of_day"
9
14
  require "reprise/time_zone_identifier"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reprise
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.2
5
5
  platform: x86_64-linux
6
6
  authors:
7
7
  - Jordan Hiltunen