kettle-gha-pins 0.3.11 → 0.3.13

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: e6eef00386a5fa9f57acdf295331f68f11293cf9d90ef09adbb666aac6a97d0c
4
- data.tar.gz: 6b433ddcef3d0599c12e8496aa5a80df31f6bcaee358634fb04c167a5c36ac24
3
+ metadata.gz: dd7079aed4ef058846c17830bf396357d912f70228c310c91ab9c4cdec617f1d
4
+ data.tar.gz: 911ae0a3199007441d6e41f06ededaa3c8150babae9f88e0ed5ca5a616b21336
5
5
  SHA512:
6
- metadata.gz: 7c6fa524d51f68f4ffb392195d77cb44f782b9ec65e05940915b4ac595e036768a7ed647eca7d7aefbd9da30adebb462fc3e5860f138e783559054257d215982
7
- data.tar.gz: d7097d6af75ffc23901d1e9fa6208f7704c9f5d12e54aab125438b61088418056ccab1730ad06643945f1fd82052f62d2c315e555769e33535eb7cdd07fbcb50
6
+ metadata.gz: 16ea373fc56f23764e4cda2ab6e56695d92fc5296665c95dd5e166879be4136a3a491cb96ec6d96433e1ef90975227ebe11674ecb7479c9ba36fec56adf9c52d
7
+ data.tar.gz: 302ab92e5d76c6046ecfbaba990eb495408f4843ca4dd029033a9dd49455eb1291b93eb8a474ad6a81a4714ed886724a1ae81e1271f14adbae2f4e12bf53d5f1
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,30 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [0.3.13] - 2026-08-15
34
+
35
+ - TAG: [v0.3.13][0.3.13t]
36
+ - COVERAGE: 97.09% -- 1067/1099 lines in 8 files
37
+ - BRANCH COVERAGE: 85.66% -- 430/502 branches in 8 files
38
+ - 26.13% documented
39
+
40
+ ### Fixed
41
+
42
+ - Retry transient GitHub Action metadata failures and report API response details during strict pin reviews.
43
+
44
+ ## [0.3.12] - 2026-08-12
45
+
46
+ - TAG: [v0.3.12][0.3.12t]
47
+ - COVERAGE: 97.00% -- 1033/1065 lines in 8 files
48
+ - BRANCH COVERAGE: 85.60% -- 416/486 branches in 8 files
49
+ - 25.93% documented
50
+
51
+ ### Changed
52
+
53
+ - Prepare project for kettle-jem templates: updated 7 project files across dependencies (7).
54
+
55
+ - Apply kettle-jem templates: updated 7 project files across configuration (1), dependencies (1), documentation (1), other (4).
56
+
33
57
  ## [0.3.11] - 2026-08-10
34
58
 
35
59
  - TAG: [v0.3.11][0.3.11t]
@@ -310,7 +334,11 @@ Please file a bug if you notice a violation of semantic versioning.
310
334
  - kettle-jem-template-20260720-005 - Generated README Support & Community rows
311
335
  now include a RubyForum help badge.
312
336
 
313
- [Unreleased]: https://github.com/kettle-dev/kettle-gha-pins/compare/v0.3.11...HEAD
337
+ [Unreleased]: https://github.com/kettle-dev/kettle-gha-pins/compare/v0.3.13...HEAD
338
+ [0.3.13]: https://github.com/kettle-dev/kettle-gha-pins/compare/v0.3.12...v0.3.13
339
+ [0.3.13t]: https://github.com/kettle-dev/kettle-gha-pins/releases/tag/v0.3.13
340
+ [0.3.12]: https://github.com/kettle-dev/kettle-gha-pins/compare/v0.3.11...v0.3.12
341
+ [0.3.12t]: https://github.com/kettle-dev/kettle-gha-pins/releases/tag/v0.3.12
314
342
  [0.3.11]: https://github.com/kettle-dev/kettle-gha-pins/compare/v0.3.10...v0.3.11
315
343
  [0.3.11t]: https://github.com/kettle-dev/kettle-gha-pins/releases/tag/v0.3.11
316
344
  [0.3.10]: https://github.com/kettle-dev/kettle-gha-pins/compare/v0.3.9...v0.3.10
data/README.md CHANGED
@@ -57,7 +57,7 @@ kettle-gha-pins --write --upgrade major
57
57
 
58
58
  ### Compatibility
59
59
 
60
- Compatible with MRI Ruby 2.4.0+, and concordant releases of JRuby, and TruffleRuby.
60
+ Compatible with MRI Ruby 2.4.0+, JRuby, and TruffleRuby.
61
61
  CI workflows and Appraisals are generated for MRI Ruby 2.4.0+.
62
62
  This test floor is configured by `ruby.test_minimum` in `.kettle-jem.yml` and
63
63
  may be higher than the gem's runtime compatibility floor when legacy Rubies are
@@ -277,8 +277,7 @@ See [SECURITY.md][🔐security].
277
277
  ## 🤝 Contributing
278
278
 
279
279
  If you need some ideas of where to help, you could work on adding more code coverage,
280
- or if it is already 💯 (see [below](#code-coverage)) check [issues][🤝gh-issues] or [PRs][🤝gh-pulls],
281
- or use the gem and think about how it could be better.
280
+ check [issues][🤝gh-issues] or [PRs][🤝gh-pulls], or use the gem and think about how it could be better.
282
281
 
283
282
  We [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you make changes, remember to update it.
284
283
 
@@ -314,19 +313,6 @@ Made with [contributors-img][🖐contrib-rocks].
314
313
 
315
314
  Also see GitLab Contributors: [https://gitlab.com/kettle-dev/kettle-gha-pins/-/graphs/main][🚎contributors-gl]
316
315
 
317
- <details markdown="1">
318
- <summary>⭐️ Star History</summary>
319
-
320
- <a href="https://star-history.com/kettle-dev/kettle-gha-pins&Date">
321
- <picture>
322
- <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=kettle-dev/kettle-gha-pins&type=Date&theme=dark" />
323
- <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=kettle-dev/kettle-gha-pins&type=Date" />
324
- <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=kettle-dev/kettle-gha-pins&type=Date" />
325
- </picture>
326
- </a>
327
-
328
- </details>
329
-
330
316
  ## 📌 Versioning
331
317
 
332
318
  This library follows [![Semantic Versioning 2.0.0][📌semver-img]][📌semver] for its public API where practical.
@@ -582,7 +568,7 @@ Thanks for RTFM. ☺️
582
568
  [📌gitmoji]: https://gitmoji.dev
583
569
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
584
570
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
585
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-1.065-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
571
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-1.099-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
586
572
  [🔐security]: https://github.com/kettle-dev/kettle-gha-pins/blob/main/SECURITY.md
587
573
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
588
574
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -12,6 +12,8 @@ module Kettle
12
12
  # Lightweight GitHub API client for commit and release SHA resolution.
13
13
  class GitHubClient
14
14
  ANNOTATED_TAG_GIT_FALLBACK_THRESHOLD = 4
15
+ HTTP_RETRY_LIMIT = 2
16
+ RETRYABLE_HTTP_STATUS_CODES = [408, 425, 429, 500, 502, 503, 504].freeze
15
17
  class CacheMissError < Error; end
16
18
  class RefreshError < Error; end
17
19
 
@@ -29,9 +31,10 @@ module Kettle
29
31
  @commit_cache = {}
30
32
  @release_cache = {}
31
33
  @last_versions_cache_hit = false
34
+ @last_request_error = nil
32
35
  end
33
36
 
34
- attr_reader :last_versions_cache_hit
37
+ attr_reader :last_request_error, :last_versions_cache_hit
35
38
 
36
39
  def versions_for_repo(repo_ref)
37
40
  @last_versions_cache_hit = false
@@ -64,7 +67,10 @@ module Kettle
64
67
  releases = nil
65
68
  Timeout.timeout(@refresh_timeout) do
66
69
  data = request_json("/repos/#{repo_ref}/releases?per_page=100")
67
- return refresh_failed!(repo_ref, stale, "invalid releases response") unless data.is_a?(Array)
70
+ unless data.is_a?(Array)
71
+ detail = data.nil? ? nil : "expected an array, got #{data.class}"
72
+ return refresh_failed!(repo_ref, stale, "invalid releases response", detail: detail)
73
+ end
68
74
 
69
75
  tag_shas = tag_ref_shas(repo_ref)
70
76
  return refresh_failed!(repo_ref, stale, "invalid tag response") unless tag_shas
@@ -122,10 +128,12 @@ module Kettle
122
128
  versions
123
129
  end
124
130
 
125
- def refresh_failed!(repo_ref, stale, message)
131
+ def refresh_failed!(repo_ref, stale, message, detail: nil)
126
132
  return cached_versions(repo_ref, stale) unless @fail_on_refresh_error
127
133
 
128
- raise RefreshError, "#{message} for #{repo_ref}"
134
+ detail ||= @last_request_error
135
+ suffix = detail.to_s.empty? ? "" : ": #{detail}"
136
+ raise RefreshError, "#{message} for #{repo_ref}#{suffix}"
129
137
  end
130
138
 
131
139
  def build_release_versions(data, tag_shas)
@@ -222,8 +230,10 @@ module Kettle
222
230
 
223
231
  def request_json(path, redirects: 3)
224
232
  uri = URI.join(@api_base + "/", path)
233
+ @last_request_error = nil
225
234
 
226
235
  response = nil
236
+ retries = 0
227
237
  loop do
228
238
  request = Net::HTTP::Get.new(uri)
229
239
  request["Accept"] = "application/vnd.github+json"
@@ -231,27 +241,68 @@ module Kettle
231
241
  request["X-GitHub-Api-Version"] = "2022-11-28"
232
242
  request["Authorization"] = "Bearer #{@token}" if @token && !@token.empty?
233
243
 
234
- response = http_request(uri, request)
244
+ begin
245
+ response = http_request(uri, request)
246
+ rescue IOError, SystemCallError, Net::OpenTimeout, Net::ReadTimeout => error
247
+ if retries < HTTP_RETRY_LIMIT
248
+ retries += 1
249
+ sleep(retry_delay(nil, retries))
250
+ next
251
+ end
252
+
253
+ @last_request_error = "GitHub request failed for #{path}: #{error.class}: #{error.message}"
254
+ return nil
255
+ end
256
+
257
+ if response.code.to_i.between?(300, 399)
258
+ redirects -= 1
259
+ return nil if redirects.negative?
260
+
261
+ location = response["location"].to_s
262
+ return nil if location.empty?
263
+
264
+ uri = URI.join(uri.to_s, location)
265
+ next
266
+ end
235
267
 
236
- break unless response.code.to_i.between?(300, 399)
237
- redirects -= 1
238
- return nil if redirects.negative?
268
+ status = response.code.to_i
269
+ unless status == 200
270
+ if RETRYABLE_HTTP_STATUS_CODES.include?(status) && retries < HTTP_RETRY_LIMIT
271
+ retries += 1
272
+ sleep(retry_delay(response, retries))
273
+ next
274
+ end
239
275
 
240
- location = response["location"].to_s
241
- return nil if location.empty?
276
+ @last_request_error = response_error(response, path)
277
+ return nil
278
+ end
242
279
 
243
- uri = URI.join(uri.to_s, location)
280
+ begin
281
+ return JSON.parse(response.body)
282
+ rescue JSON::ParserError
283
+ @last_request_error = "GitHub returned invalid JSON for #{path}"
284
+ return nil
285
+ end
244
286
  end
287
+ end
245
288
 
246
- return nil unless response.code.to_i == 200
289
+ def retry_delay(response, attempt)
290
+ retry_after = response ? response["retry-after"].to_f : 0.0
291
+ return retry_after.clamp(0.0, 2.0) if retry_after.positive?
247
292
 
248
- begin
249
- JSON.parse(response.body)
293
+ 0.25 * (2**(attempt - 1))
294
+ end
295
+
296
+ def response_error(response, path)
297
+ status = response.code.to_i
298
+ body = begin
299
+ JSON.parse(response.body.to_s)
250
300
  rescue JSON::ParserError
251
301
  nil
252
302
  end
253
- rescue IOError, SystemCallError, Net::OpenTimeout, Net::ReadTimeout
254
- nil
303
+ message = body.is_a?(Hash) ? body["message"].to_s : ""
304
+ detail = message.empty? ? "response body was not a GitHub API error object" : message
305
+ "GitHub API returned HTTP #{status} for #{path}: #{detail}"
255
306
  end
256
307
 
257
308
  def http_request(uri, request)
@@ -6,7 +6,7 @@ module Kettle
6
6
  # Version namespace for this gem.
7
7
  module Version
8
8
  # Current gem version.
9
- VERSION = "0.3.11"
9
+ VERSION = "0.3.13"
10
10
  end
11
11
  # Current gem version exposed at the traditional constant location.
12
12
  VERSION = Version::VERSION # Traditional Constant Location
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kettle-gha-pins
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.11
4
+ version: 0.3.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -91,20 +91,20 @@ dependencies:
91
91
  requirements:
92
92
  - - "~>"
93
93
  - !ruby/object:Gem::Version
94
- version: '2.5'
94
+ version: '3.0'
95
95
  - - ">="
96
96
  - !ruby/object:Gem::Version
97
- version: 2.5.18
97
+ version: 3.0.6
98
98
  type: :development
99
99
  prerelease: false
100
100
  version_requirements: !ruby/object:Gem::Requirement
101
101
  requirements:
102
102
  - - "~>"
103
103
  - !ruby/object:Gem::Version
104
- version: '2.5'
104
+ version: '3.0'
105
105
  - - ">="
106
106
  - !ruby/object:Gem::Version
107
- version: 2.5.18
107
+ version: 3.0.6
108
108
  - !ruby/object:Gem::Dependency
109
109
  name: bundler-audit
110
110
  requirement: !ruby/object:Gem::Requirement
@@ -182,7 +182,7 @@ dependencies:
182
182
  version: '3.2'
183
183
  - - ">="
184
184
  - !ruby/object:Gem::Version
185
- version: 3.2.0
185
+ version: 3.2.2
186
186
  type: :development
187
187
  prerelease: false
188
188
  version_requirements: !ruby/object:Gem::Requirement
@@ -192,7 +192,7 @@ dependencies:
192
192
  version: '3.2'
193
193
  - - ">="
194
194
  - !ruby/object:Gem::Version
195
- version: 3.2.0
195
+ version: 3.2.2
196
196
  - !ruby/object:Gem::Dependency
197
197
  name: kettle-test
198
198
  requirement: !ruby/object:Gem::Requirement
@@ -202,7 +202,7 @@ dependencies:
202
202
  version: '2.0'
203
203
  - - ">="
204
204
  - !ruby/object:Gem::Version
205
- version: 2.0.19
205
+ version: 2.0.20
206
206
  type: :development
207
207
  prerelease: false
208
208
  version_requirements: !ruby/object:Gem::Requirement
@@ -212,7 +212,7 @@ dependencies:
212
212
  version: '2.0'
213
213
  - - ">="
214
214
  - !ruby/object:Gem::Version
215
- version: 2.0.19
215
+ version: 2.0.20
216
216
  - !ruby/object:Gem::Dependency
217
217
  name: turbo_tests2
218
218
  requirement: !ruby/object:Gem::Requirement
@@ -222,7 +222,7 @@ dependencies:
222
222
  version: '3.2'
223
223
  - - ">="
224
224
  - !ruby/object:Gem::Version
225
- version: 3.2.4
225
+ version: 3.2.5
226
226
  type: :development
227
227
  prerelease: false
228
228
  version_requirements: !ruby/object:Gem::Requirement
@@ -232,7 +232,7 @@ dependencies:
232
232
  version: '3.2'
233
233
  - - ">="
234
234
  - !ruby/object:Gem::Version
235
- version: 3.2.4
235
+ version: 3.2.5
236
236
  - !ruby/object:Gem::Dependency
237
237
  name: stone_checksums
238
238
  requirement: !ruby/object:Gem::Requirement
@@ -301,10 +301,10 @@ licenses:
301
301
  - MIT
302
302
  metadata:
303
303
  homepage_uri: https://github.com/kettle-dev/kettle-gha-pins
304
- source_code_uri: https://github.com/kettle-dev/kettle-gha-pins/tree/v0.3.11
305
- changelog_uri: https://github.com/kettle-dev/kettle-gha-pins/blob/v0.3.11/CHANGELOG.md
304
+ source_code_uri: https://github.com/kettle-dev/kettle-gha-pins/tree/v0.3.13
305
+ changelog_uri: https://github.com/kettle-dev/kettle-gha-pins/blob/v0.3.13/CHANGELOG.md
306
306
  bug_tracker_uri: https://github.com/kettle-dev/kettle-gha-pins/issues
307
- documentation_uri: https://www.rubydoc.info/gems/kettle-gha-pins/0.3.11
307
+ documentation_uri: https://www.rubydoc.info/gems/kettle-gha-pins/0.3.13
308
308
  funding_uri: https://github.com/sponsors/pboling
309
309
  wiki_uri: https://github.com/kettle-dev/kettle-gha-pins/wiki
310
310
  news_uri: https://www.railsbling.com/tags/kettle-gha-pins
metadata.gz.sig CHANGED
Binary file