sof-cycle 0.1.17 → 0.1.18

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: 735c721cc8acf74603c4bea6a29c9e5149f68fa94455dd6ea15a48ecebb6602a
4
+ data.tar.gz: 5061cac902fee01a91d225f7ac85774a3b16269ece1a576c317a9a5f78ec4204
5
5
  SHA512:
6
- metadata.gz: 944184b46dc341d087db96a0173ad72de8a8524fd8984c34efd3e7b53853fefd68d0f0814cedf5818cb74492e3c69556bc90174227a3bf1001a867db7d60de37
7
- data.tar.gz: 49f3369f577e9369ca19f3f6f3b0f37fb9ec558a9aac48e5af6ec4429e85d1561c27591b039b3263cf3531f62185829a0a03a10fe5bb565ed4f36e29206c4f10
6
+ metadata.gz: 85940a5323238358158ec9dc9a9a45218563aab918471fcc6c1bcc0322ae67a070ef743cdf6cc5210adda942be61606c951c8ce12ffb85f51105f6d9f9c34d3a
7
+ data.tar.gz: 8e564766036e7e95321c3c86cbc57a65d3e316dfa1cb00e76007884525b3afc4defb4bb8ce0cc95e004031af4c56b892da99b7f62c01a31911c9e722d60ad001
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.18] - 2026-10-22
9
9
 
10
- ### Changed
10
+ ### Added
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(dates)` anchors a dormant End-of or Interval cycle on the latest date once the dates meet its volume, then resets it by them
13
13
 
14
- ## [0.1.16] - 2026-10-08
14
+ ## [0.1.17] - 2026-10-20
15
15
 
16
- ### Added
16
+ ### Changed
17
17
 
18
- - `Cycle#activated_by(date)` returns the cycle anchored on that date, or itself when already active
18
+ - `Cycle#reset_by` re-anchors the window on the date that meets the cycle's volume, and later dates count toward the new window
@@ -0,0 +1 @@
1
+ 79734e3566bc1e21c2e6399531ec538e9207aa5e7426103cf126f36c2f020a04b618b83ceaf1ece2b12506c6d353e2c1f7e359e0bd3216ccf33e214b916b7f1d
@@ -2,6 +2,6 @@
2
2
 
3
3
  module SOF
4
4
  class Cycle
5
- VERSION = "0.1.17"
5
+ VERSION = "0.1.18"
6
6
  end
7
7
  end
data/lib/sof/cycle.rb CHANGED
@@ -346,6 +346,25 @@ 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 latest date once they meet its volume, then
351
+ # `reset_by` moves it.
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 }
363
+ return self if from_date.nil? && days.size < volume
364
+
365
+ activated_by(days.max).reset_by(days)
366
+ end
367
+
349
368
  # From the supplied anchor date, are there enough in-window completions to
350
369
  # satisfy the cycle?
351
370
  #
@@ -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.18
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jim Gay
@@ -59,6 +59,7 @@ 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
62
63
  - checksums/sof-cycle-0.1.2.gem.sha512
63
64
  - checksums/sof-cycle-0.1.3.gem.sha512
64
65
  - checksums/sof-cycle-0.1.4.gem.sha512