sof-cycle 0.1.17 → 0.1.19

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: 578b47e1063361f57d1d3eee18543b7dc16665ccbc0e5c6f7684405699a406ff
4
- data.tar.gz: 365a22eff32c6908fcfbdbe14f6d0494c77c70c8471b9af13e0e76ce32945bf5
3
+ metadata.gz: 0c55fcf5568b377afa4873ddd3adf5d2631bd0f05f87a80d003efacafa6ecc6c
4
+ data.tar.gz: e8cf4dd826a396d47b40107decb70a957435f3d4754b15379ba89c14c0864004
5
5
  SHA512:
6
- metadata.gz: 944184b46dc341d087db96a0173ad72de8a8524fd8984c34efd3e7b53853fefd68d0f0814cedf5818cb74492e3c69556bc90174227a3bf1001a867db7d60de37
7
- data.tar.gz: 49f3369f577e9369ca19f3f6f3b0f37fb9ec558a9aac48e5af6ec4429e85d1561c27591b039b3263cf3531f62185829a0a03a10fe5bb565ed4f36e29206c4f10
6
+ metadata.gz: 4600b3a56d63b1c9177072e96f45292ab8f536827dabac963b29dc896e41c2b2cdee52ce8edc5578a8a3675a3d8c09d8d1bc52cbb0e5f9e39540d76f47adb56a
7
+ data.tar.gz: a4089a2360039fb791b06d463abda71fe82fb01d381acf7b6caa83c83381a78359c8841fed7e11d9b3321e20e847834a94bf3e0621f4ee46146467db3cfe541d
data/CHANGELOG.md CHANGED
@@ -5,14 +5,14 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
- ## [0.1.17] - 2026-10-20
8
+ ## [0.1.19] - 2026-10-26
9
9
 
10
10
  ### Changed
11
11
 
12
- - `Cycle#reset_by` re-anchors the window on the date that meets the cycle's volume, and later dates count toward the new window
12
+ - `Cycle#in_force_by` anchors a dormant cycle on the date that meets its volume rather than the latest, so later dates count toward the next window
13
13
 
14
- ## [0.1.16] - 2026-10-08
14
+ ## [0.1.18] - 2026-10-22
15
15
 
16
16
  ### Added
17
17
 
18
- - `Cycle#activated_by(date)` returns the cycle anchored on that date, or itself when already active
18
+ - `Cycle#in_force_by(dates)` anchors a dormant End-of or Interval cycle on the latest date once the dates meet its volume, then resets it by them
@@ -0,0 +1 @@
1
+ 79734e3566bc1e21c2e6399531ec538e9207aa5e7426103cf126f36c2f020a04b618b83ceaf1ece2b12506c6d353e2c1f7e359e0bd3216ccf33e214b916b7f1d
@@ -0,0 +1 @@
1
+ f523d1ba6aebd4f1255f259f102f28c2a733ac16086fd2d30a49353bb34b6dc314010872a17487fcee1478facbcff25910bd2a0bf356ffb4ebfc7b7f952694a2
@@ -2,6 +2,6 @@
2
2
 
3
3
  module SOF
4
4
  class Cycle
5
- VERSION = "0.1.17"
5
+ VERSION = "0.1.19"
6
6
  end
7
7
  end
data/lib/sof/cycle.rb CHANGED
@@ -346,6 +346,26 @@ module SOF
346
346
  Cycle.for(activated_notation(date))
347
347
  end
348
348
 
349
+ # The cycle in force given the dates that satisfy it: a dormant E or I
350
+ # cycle anchors on the date that meets its volume, then `reset_by` moves
351
+ # it by the dates past that anchor.
352
+ #
353
+ # @param dates [Array<Date, Time, nil>] the acts that satisfy this cycle
354
+ # @return [Cycle] the cycle in force, or self when nothing brings it in
355
+ #
356
+ # @example
357
+ # Cycle.for("V2E12M").in_force_by([Date.new(2026, 3, 20), Date.new(2026, 5, 2)])
358
+ # # => Cycle.for("V2E12MF2026-05-02")
359
+ def in_force_by(dates)
360
+ return self unless recurring? && dormant_capable?
361
+
362
+ days = Array(dates).filter_map { it&.to_date }.sort
363
+ return reset_by(days) unless from_date.nil?
364
+ return self if days.size < volume
365
+
366
+ activated_by(days[volume - 1]).reset_by(days)
367
+ end
368
+
349
369
  # From the supplied anchor date, are there enough in-window completions to
350
370
  # satisfy the cycle?
351
371
  #
@@ -26,6 +26,12 @@ module SOF
26
26
  # activated, not by the acts that satisfy it.
27
27
  def reset_by(...) = self
28
28
 
29
+ # Short of the volume it stays the wrapper, not the bare cycle.
30
+ def in_force_by(dates)
31
+ in_force = cycle.in_force_by(dates)
32
+ in_force.active? ? in_force : self
33
+ end
34
+
29
35
  def expiration_of(...) = nil
30
36
 
31
37
  def satisfied_by?(...) = false
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sof-cycle
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.17
4
+ version: 0.1.19
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jim Gay
@@ -59,6 +59,8 @@ files:
59
59
  - checksums/sof-cycle-0.1.14.gem.sha512
60
60
  - checksums/sof-cycle-0.1.15.gem.sha512
61
61
  - checksums/sof-cycle-0.1.16.gem.sha512
62
+ - checksums/sof-cycle-0.1.17.gem.sha512
63
+ - checksums/sof-cycle-0.1.18.gem.sha512
62
64
  - checksums/sof-cycle-0.1.2.gem.sha512
63
65
  - checksums/sof-cycle-0.1.3.gem.sha512
64
66
  - checksums/sof-cycle-0.1.4.gem.sha512