coach_zed 0.5.1 → 0.5.2

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: b449cb8b006ea91556af3a2fce2505db17f8827179c6fd185fd686f19ca4a3c4
4
- data.tar.gz: bb46ed11b4ef7170119bea7497229816577971fd88890e5b4d3d4bc9ff3354cc
3
+ metadata.gz: 49b31d374b8070d1b4a9d184b6f33ea18aa97deb8e74de9910c527417992aad6
4
+ data.tar.gz: 13131068767a3a47e124b05c07d267b1f4d4722efd5619abf63ef548c1166033
5
5
  SHA512:
6
- metadata.gz: fbe54bc46704d9c1fd4bd3584b9596dbb66cd322a0d2fe4589a0b120e2381d2cc51e036ae0dff4805a2861ea00331f15d0884d2f2fe71bee23550dddfc5dccaa
7
- data.tar.gz: 0abbbb09b564c3e8540dc316c2e1e04c923c29223d3f70d53ac40ab3b16e4ae55ed7f303351edce0d7a1d9cd647fa3e0fbc4f911b1d419703ee009bbd09d68ec
6
+ metadata.gz: f794bdf46501e773f97fdc7808556e537933e5aa2b5fc9ae9a84645d858d8802dd4e8793217aaabff9931c5feef83aa1e9736acb503b65f1de7b0281d532f2d9
7
+ data.tar.gz: 23f97a157e3cb5410e01c09a1d9e975149e688a5a07495483e82e8d30fe2d049dc93d92a013cfae41c0b04b9762b9b762bb756844f0b05f725b2f72d186a21e1
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## [](https://github.com/rossta/coach_zed/compare/v0.5.1...v) (2026-06-17)
2
+
3
+ ### Bug Fixes
4
+
5
+ * split refresh and append schedule modes ([51455f1](https://github.com/rossta/coach_zed/commit/51455f13171495365f92a748fa994d6540a77123))
1
6
  ## [](https://github.com/rossta/coach_zed/compare/v0.5.0...v) (2026-06-16)
2
7
 
3
8
  ### Bug Fixes
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class CoachZed
4
- VERSION = "0.5.1"
4
+ VERSION = "0.5.2"
5
5
  end
data/lib/coach_zed.rb CHANGED
@@ -112,12 +112,13 @@ class CoachZed
112
112
  @existing_feed_path = resolved_existing_feed_path && Pathname(resolved_existing_feed_path)
113
113
  end
114
114
 
115
- def generate_schedule(start_date:, consultation_prompt: nil, consultation_prompt_path: nil)
115
+ def generate_schedule(start_date:, consultation_prompt: nil, consultation_prompt_path: nil, generation_mode: nil)
116
116
  prompt_text = resolve_prompt_text(consultation_prompt, consultation_prompt_path)
117
117
  catalog = Catalog::Loader.new(@workout_catalog_dir).load
118
- existing_feed = load_existing_feed
119
- start_date = generation_start_date(start_date, existing_feed:)
120
- generation_days = existing_feed ? 7 : 28
118
+ generation_mode = normalize_generation_mode(generation_mode)
119
+ existing_feed = load_existing_feed if generation_mode != :refresh
120
+ start_date = generation_start_date(start_date, existing_feed:, generation_mode:)
121
+ generation_days = generation_days_for(start_date, generation_mode:, existing_feed:)
121
122
  existing_feed_context = existing_feed&.to_context(limit_days: 28)
122
123
  schedule_key = schedule_key_for(prompt_text, start_date, catalog, generation_days, existing_feed_context)
123
124
  prompt = PromptBuilder.new(
@@ -190,13 +191,36 @@ class CoachZed
190
191
  FeedReader.load_existing(existing_feed_path)
191
192
  end
192
193
 
193
- def generation_start_date(start_date, existing_feed:)
194
+ def normalize_generation_mode(value)
195
+ return nil if value.nil?
196
+
197
+ case value.to_sym
198
+ when :refresh, :append
199
+ value.to_sym
200
+ else
201
+ raise ArgumentError, "unsupported generation mode: #{value}"
202
+ end
203
+ end
204
+
205
+ def generation_start_date(start_date, existing_feed:, generation_mode:)
206
+ return normalize_date(start_date) if generation_mode == :refresh
207
+
194
208
  last_date = existing_feed&.last_date
195
209
  return normalize_date(start_date) if last_date.nil?
196
210
 
197
211
  last_date + 1
198
212
  end
199
213
 
214
+ def generation_days_for(start_date, generation_mode:, existing_feed:)
215
+ return 7 if generation_mode == :append && existing_feed
216
+ return 28 if generation_mode == :append
217
+ return 7 if existing_feed
218
+ return 28 if generation_mode.nil?
219
+
220
+ upcoming_sunday = start_date + ((7 - start_date.wday) % 7)
221
+ (upcoming_sunday - start_date).to_i + 29
222
+ end
223
+
200
224
  def schedule_key_for(prompt_text, start_date, catalog, generation_days, existing_feed_context)
201
225
  Digest::SHA256.hexdigest(
202
226
  [
data/sig/coach_zed.rbs CHANGED
@@ -65,7 +65,8 @@ class CoachZed
65
65
  def generate_schedule: (
66
66
  start_date: untyped,
67
67
  ?consultation_prompt: String?,
68
- ?consultation_prompt_path: String?
68
+ ?consultation_prompt_path: String?,
69
+ ?generation_mode: Symbol?
69
70
  ) -> Result
70
71
 
71
72
  private
@@ -74,7 +75,9 @@ class CoachZed
74
75
  def resolve_prompt_text: (String? consultation_prompt, String? consultation_prompt_path) -> String
75
76
  def normalize_date: (untyped value) -> Date
76
77
  def load_existing_feed: -> CoachZed::FeedReader?
77
- def generation_start_date: (untyped start_date, existing_feed: CoachZed::FeedReader?) -> Date
78
+ def normalize_generation_mode: (untyped value) -> Symbol?
79
+ def generation_start_date: (untyped start_date, existing_feed: CoachZed::FeedReader?, generation_mode: Symbol?) -> Date
80
+ def generation_days_for: (Date start_date, generation_mode: Symbol?, existing_feed: CoachZed::FeedReader?) -> Integer
78
81
  def schedule_key_for: (String prompt_text, Date start_date, Array[CoachZed::Catalog::Entry] catalog, Integer generation_days, String? existing_feed_context) -> String
79
82
  def catalog_digest: (Array[CoachZed::Catalog::Entry] catalog) -> String
80
83
  def normalize_schedule: (Hash[String, untyped] schedule, start_date: Date, prompt_text: String, schedule_key: String, catalog: Array[CoachZed::Catalog::Entry], generation_days: Integer) -> Hash[String, untyped]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: coach_zed
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ross Kaffenberger