kettle-dev 2.2.3 → 2.2.5

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: fa3fa8282c2b534ba8d14a5ff998db809e15c577e3e7b65bd7592c7bd8e568d7
4
- data.tar.gz: ffa804162693d265c3a250d39f37324806d00a44676c50ca35c0a12cbecce771
3
+ metadata.gz: ba33ed9512e4bc65a82886c163c0c01c3b8c59895326fb64c64b01c97fbbbf77
4
+ data.tar.gz: 9c14bb68844fd3c46315215b6e60a9f35b3ebd9c416a8fad96552e361e061f30
5
5
  SHA512:
6
- metadata.gz: cfffdbc293252d77553ba59d5e9179121c7b537ae676a1380c38a8a7af30b85266e1f07487f0368fd61671cee3a0324b2889537fbe89780225a54c8c6287c10e
7
- data.tar.gz: 9e59b4fc95c59873b928adaa4a4ff75bab63247e60e5fbb8c39b8f6ef9cb7aad0f433efaa957dab32ec8c18a64cab5be63a7cd697566ef93590859821cb81b63
6
+ metadata.gz: fd4cb6930f617bcbc033d1366a69a0f11911b6293145e37a30d149ecb7a3b54fc2c2cda287294105ca4a5d1b9598765318a9291e5999bafefe6a066be27b1ecb
7
+ data.tar.gz: 9cf023ac4edeb2d13bb063e62f5fb73b61405e3e7d12e63b5350de1dab920ff5fa8a9bb3425f76648e4fa8bc1254392d1fb0a7b7dbfb13603cf8dc77415ad2d3
checksums.yaml.gz.sig CHANGED
@@ -1,4 +1,5 @@
1
- ���q��=��Q}9��e��F���gB�_��G'��Ɇ����
2
- �}2�
3
- ��v�Q,u���l�� 7��Y;�E}��$QL+_�Υ�砱M Z
4
- WJF8��Y
1
+ �p!��pOH�����Kh�&Y+��-YH2p�����1˚ܴ�k1
2
+ ~
3
+ .!�;b�\Q��z[��o�m� �/�Q����?��a�����P�.�z��<ty�z�{� 1�#z~#��{�B��
4
+ 韗Cs ������6{H�U��L�F�����ϕ
5
+ �3����t���/c�q~� Z�ƈ�)�t�� hN;�
data/CHANGELOG.md CHANGED
@@ -30,6 +30,44 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [2.2.5] - 2026-06-13
34
+
35
+ - TAG: [v2.2.5][2.2.5t]
36
+ - COVERAGE: 92.29% -- 3818/4137 lines in 28 files
37
+ - BRANCH COVERAGE: 73.49% -- 1516/2063 branches in 28 files
38
+ - 67.00% documented
39
+
40
+ ### Changed
41
+
42
+ - `kettle-gha-sha-pins --upgrade major` now supports major-line action tags
43
+ such as `v2`, while patch and minor upgrade targeting remain limited to full
44
+ `x.y.z` SemVer tags.
45
+
46
+ ### Fixed
47
+
48
+ - `kettle-gha-sha-pins` persistent cache writes no longer crash for actions
49
+ whose releases and tags only include major-line versions such as `v2`.
50
+
51
+ ## [2.2.4] - 2026-06-12
52
+
53
+ - TAG: [v2.2.4][2.2.4t]
54
+ - COVERAGE: 92.18% -- 3806/4129 lines in 28 files
55
+ - BRANCH COVERAGE: 73.26% -- 1507/2057 branches in 28 files
56
+ - 67.00% documented
57
+
58
+ ### Changed
59
+
60
+ - Retemplated generated project files with the current `kettle-jem` template,
61
+ refreshing development dependency floors, binstubs, README metadata, and RBS
62
+ validation workflow output.
63
+
64
+ ### Fixed
65
+
66
+ - `kettle-gha-sha-pins --upgrade` no longer downgrades action pins when the
67
+ current SHA matches a newer version-like tag that is a prerelease or lacks a
68
+ GitHub Release, including transferred action repositories that require GitHub
69
+ API redirects.
70
+
33
71
  ## [2.2.3] - 2026-06-09
34
72
 
35
73
  - TAG: [v2.2.3][2.2.3t]
@@ -2022,7 +2060,11 @@ Please file a bug if you notice a violation of semantic versioning.
2022
2060
  - Selecting will run the selected workflow via `act`
2023
2061
  - This may move to its own gem in the future.
2024
2062
 
2025
- [Unreleased]: https://github.com/kettle-dev/kettle-dev/compare/v2.2.3...HEAD
2063
+ [Unreleased]: https://github.com/kettle-dev/kettle-dev/compare/v2.2.5...HEAD
2064
+ [2.2.5]: https://github.com/kettle-dev/kettle-dev/compare/v2.2.4...v2.2.5
2065
+ [2.2.5t]: https://github.com/kettle-dev/kettle-dev/releases/tag/v2.2.5
2066
+ [2.2.4]: https://github.com/kettle-dev/kettle-dev/compare/v2.2.3...v2.2.4
2067
+ [2.2.4t]: https://github.com/kettle-dev/kettle-dev/releases/tag/v2.2.4
2026
2068
  [2.2.3]: https://github.com/kettle-dev/kettle-dev/compare/v2.2.2...v2.2.3
2027
2069
  [2.2.3t]: https://github.com/kettle-dev/kettle-dev/releases/tag/v2.2.3
2028
2070
  [2.2.2]: https://github.com/kettle-dev/kettle-dev/compare/v2.2.1...v2.2.2
data/README.md CHANGED
@@ -854,7 +854,7 @@ Thanks for RTFM. ☺️
854
854
  [📌gitmoji]: https://gitmoji.dev
855
855
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
856
856
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
857
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-4.100-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
857
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-4.137-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
858
858
  [🔐security]: https://github.com/kettle-dev/kettle-dev/blob/main/SECURITY.md
859
859
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
860
860
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -882,7 +882,7 @@ Thanks for RTFM. ☺️
882
882
  | Package | kettle-dev |
883
883
  | Description | 🍲 Kettle::Dev is a meta tool from kettle-rb to streamline development and testing. Acts as a shim dependency, pulling in many other dependencies, to give you OOTB productivity with a RubyGem, or Ruby app project. Configures a complete set of Rake tasks, for all the libraries is brings in, so they arrive ready to go. Fund overlooked open source projects - bottom of stack, dev/test dependencies: floss-funding.dev |
884
884
  | Homepage | https://github.com/kettle-dev/kettle-dev |
885
- | Source | https://github.com/kettle-dev/kettle-dev/tree/v2.2.1 |
885
+ | Source | https://github.com/kettle-dev/kettle-dev/tree/v2.2.4 |
886
886
  | License | `AGPL-3.0-only` |
887
887
  | Funding | https://github.com/sponsors/pboling, https://issuehunt.io/u/pboling, https://ko-fi.com/pboling, https://liberapay.com/pboling/donate, https://opencollective.com/kettle-dev, https://opencollective.com/kettle-rb, https://patreon.com/galtzo, https://polar.sh/pboling, https://thanks.dev/u/gh/pboling, https://tidelift.com/funding/github/rubygems/kettle-dev, https://www.buymeacoffee.com/pboling |
888
888
  <!-- kettle-jem:metadata:end -->
@@ -478,7 +478,7 @@ module Kettle
478
478
 
479
479
  def parse_release_version(value)
480
480
  normalized = value.to_s.sub(/\A[vV]/, "")
481
- return nil unless normalized.match?(/\A\d+\.\d+\.\d+(?:[-.]?[0-9A-Za-z.-]+)?\z/)
481
+ return nil unless normalized.match?(/\A(?:\d+|\d+\.\d+\.\d+(?:[-.]?[0-9A-Za-z.-]+)?)\z/)
482
482
 
483
483
  Gem::Version.new(normalized)
484
484
  rescue ArgumentError
@@ -504,10 +504,13 @@ module Kettle
504
504
  def choose_upgrade_target(current_version, versions, level)
505
505
  current = parse_release_version(current_version)
506
506
  return nil if current.nil?
507
+ return nil if level != "major" && major_line_version?(current_version)
507
508
 
508
509
  candidates = versions.select do |entry|
509
510
  next false unless entry[:version_obj].is_a?(Gem::Version)
510
511
  next false unless entry[:version_obj] > current
512
+ next false if entry[:version_obj].prerelease? && !current.prerelease?
513
+ next false if level != "major" && major_line_version?(entry[:version])
511
514
 
512
515
  case level
513
516
  when "patch"
@@ -522,12 +525,20 @@ module Kettle
522
525
  candidates.max_by { |entry| entry[:version_obj] }
523
526
  end
524
527
 
528
+ def major_line_version?(value)
529
+ value.to_s.match?(/\A\d+\z/)
530
+ end
531
+
525
532
  def latest_outdated_target(current_version, versions)
526
533
  current = parse_release_version(current_version)
527
534
  return nil if current.nil?
528
535
 
529
536
  versions
530
- .select { |entry| entry[:version_obj].is_a?(Gem::Version) && entry[:version_obj] > current }
537
+ .select do |entry|
538
+ entry[:version_obj].is_a?(Gem::Version) &&
539
+ entry[:version_obj] > current &&
540
+ (!entry[:version_obj].prerelease? || current.prerelease?)
541
+ end
531
542
  .max_by { |entry| entry[:version_obj] }
532
543
  end
533
544
 
@@ -902,7 +913,7 @@ module Kettle
902
913
 
903
914
  # Persistent cache of GitHub Action release versions and target SHAs.
904
915
  class PersistentActionCache
905
- VERSION = 1
916
+ VERSION = 2
906
917
 
907
918
  def self.default_path
908
919
  state_home = ENV["XDG_STATE_HOME"]
@@ -1008,6 +1019,7 @@ module Kettle
1008
1019
  JSON.parse(File.read(@path))
1009
1020
  end
1010
1021
  return empty_data unless parsed.is_a?(Hash)
1022
+ return empty_data unless parsed["version"].to_i == VERSION
1011
1023
 
1012
1024
  parsed["version"] ||= VERSION
1013
1025
  parsed["actions"] = {} unless parsed["actions"].is_a?(Hash)
@@ -1045,11 +1057,13 @@ module Kettle
1045
1057
 
1046
1058
  deserialized.merge(cached_at: entry["cached_at"].to_s)
1047
1059
  end
1060
+ return {} if entries.empty?
1048
1061
 
1062
+ full_semver_entries = entries.reject { |entry| major_line_version?(entry[:version]) }
1049
1063
  {
1050
- "patch" => entries.group_by { |entry| entry[:version_obj].segments[0, 2].join(".") }
1064
+ "patch" => full_semver_entries.group_by { |entry| entry[:version_obj].segments[0, 2].join(".") }
1051
1065
  .transform_values { |group| serialize_target(group.max_by { |entry| entry[:version_obj] }) },
1052
- "minor" => entries.group_by { |entry| entry[:version_obj].segments[0].to_s }
1066
+ "minor" => full_semver_entries.group_by { |entry| entry[:version_obj].segments[0].to_s }
1053
1067
  .transform_values { |group| serialize_target(group.max_by { |entry| entry[:version_obj] }) },
1054
1068
  "major" => {"*" => serialize_target(entries.max_by { |entry| entry[:version_obj] })}
1055
1069
  }
@@ -1070,6 +1084,10 @@ module Kettle
1070
1084
  nil
1071
1085
  end
1072
1086
 
1087
+ def major_line_version?(value)
1088
+ value.to_s.match?(/\A\d+\z/)
1089
+ end
1090
+
1073
1091
  def fresh_entry?(entry)
1074
1092
  cached_at = Time.iso8601(entry["cached_at"].to_s)
1075
1093
  cached_at >= @clock.call - @ttl_seconds
@@ -1113,7 +1131,6 @@ module Kettle
1113
1131
  tag_shas = tag_ref_shas(repo_ref)
1114
1132
  releases = data.filter_map do |release|
1115
1133
  next unless release.is_a?(Hash)
1116
- next if release["prerelease"] == true
1117
1134
 
1118
1135
  tag = release["tag_name"].to_s
1119
1136
  parsed = parse_release_version_text(tag)
@@ -1126,6 +1143,21 @@ module Kettle
1126
1143
  sha: tag_shas[tag]
1127
1144
  }
1128
1145
  end
1146
+ released_tags = releases.each_with_object({}) { |release, memo| memo[release[:tag]] = true }
1147
+ tag_versions = tag_shas.filter_map do |tag, sha|
1148
+ next if released_tags[tag]
1149
+
1150
+ parsed = parse_release_version_text(tag)
1151
+ next unless parsed
1152
+
1153
+ {
1154
+ tag: tag,
1155
+ version_obj: parsed,
1156
+ version: parsed.to_s,
1157
+ sha: sha
1158
+ }
1159
+ end
1160
+ releases.concat(tag_versions)
1129
1161
 
1130
1162
  releases.sort_by! { |release| release[:version_obj] }
1131
1163
  releases.reverse!
@@ -1171,7 +1203,7 @@ module Kettle
1171
1203
 
1172
1204
  def parse_release_version_text(value)
1173
1205
  normalized = value.to_s.sub(/\A[vV]/, "")
1174
- return nil unless normalized.match?(/\A\d+\.\d+\.\d+(?:[-.]?[0-9A-Za-z.-]+)?\z/)
1206
+ return nil unless normalized.match?(/\A(?:\d+|\d+\.\d+\.\d+(?:[-.]?[0-9A-Za-z.-]+)?)\z/)
1175
1207
 
1176
1208
  Gem::Version.new(normalized)
1177
1209
  rescue ArgumentError
@@ -1190,20 +1222,53 @@ module Kettle
1190
1222
  object = entry["object"]
1191
1223
  next unless object.is_a?(Hash)
1192
1224
 
1193
- memo[tag] = object["sha"].to_s[0, 40] if object["type"] == "commit"
1225
+ sha = object["sha"].to_s[0, 40]
1226
+ case object["type"]
1227
+ when "commit"
1228
+ memo[tag] = sha
1229
+ when "tag"
1230
+ dereferenced_sha = annotated_tag_commit_sha(repo_ref, sha)
1231
+ memo[tag] = dereferenced_sha if dereferenced_sha
1232
+ end
1194
1233
  end
1195
1234
  end
1196
1235
 
1197
- def request_json(path)
1236
+ def annotated_tag_commit_sha(repo_ref, tag_sha)
1237
+ return nil if tag_sha.to_s.empty?
1238
+
1239
+ data = request_json("/repos/#{repo_ref}/git/tags/#{tag_sha}")
1240
+ return nil unless data.is_a?(Hash)
1241
+
1242
+ object = data["object"]
1243
+ return nil unless object.is_a?(Hash)
1244
+ return nil unless object["type"] == "commit"
1245
+
1246
+ object["sha"].to_s[0, 40]
1247
+ end
1248
+
1249
+ def request_json(path, redirects: 3)
1198
1250
  uri = URI.join(@api_base + "/", path)
1199
- request = Net::HTTP::Get.new(uri)
1200
- request["Accept"] = "application/vnd.github+json"
1201
- request["User-Agent"] = @user_agent
1202
- request["X-GitHub-Api-Version"] = "2022-11-28"
1203
- request["Authorization"] = "Bearer #{@token}" if @token && !@token.empty?
1204
-
1205
- response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") do |http|
1206
- http.request(request)
1251
+
1252
+ response = nil
1253
+ loop do
1254
+ request = Net::HTTP::Get.new(uri)
1255
+ request["Accept"] = "application/vnd.github+json"
1256
+ request["User-Agent"] = @user_agent
1257
+ request["X-GitHub-Api-Version"] = "2022-11-28"
1258
+ request["Authorization"] = "Bearer #{@token}" if @token && !@token.empty?
1259
+
1260
+ response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") do |http|
1261
+ http.request(request)
1262
+ end
1263
+
1264
+ break unless response.code.to_i.between?(300, 399)
1265
+ redirects -= 1
1266
+ return nil if redirects.negative?
1267
+
1268
+ location = response["location"].to_s
1269
+ return nil if location.empty?
1270
+
1271
+ uri = URI.join(uri.to_s, location)
1207
1272
  end
1208
1273
 
1209
1274
  return nil unless response.code.to_i == 200
@@ -3,7 +3,7 @@
3
3
  module Kettle
4
4
  module Dev
5
5
  module Version
6
- VERSION = "2.2.3"
6
+ VERSION = "2.2.5"
7
7
  end
8
8
  VERSION = Version::VERSION # Traditional Constant Location
9
9
  end
data/sig/kettle/dev.rbs CHANGED
@@ -1,7 +1,6 @@
1
1
  module Kettle
2
2
  module Dev
3
3
  module Version
4
- VERSION: String
5
4
  end
6
5
 
7
6
  class Error < ::StandardError
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kettle-dev
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.3
4
+ version: 2.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -134,7 +134,7 @@ dependencies:
134
134
  version: '3.1'
135
135
  - - ">="
136
136
  - !ruby/object:Gem::Version
137
- version: 3.1.1
137
+ version: 3.1.2
138
138
  type: :development
139
139
  prerelease: false
140
140
  version_requirements: !ruby/object:Gem::Requirement
@@ -144,7 +144,7 @@ dependencies:
144
144
  version: '3.1'
145
145
  - - ">="
146
146
  - !ruby/object:Gem::Version
147
- version: 3.1.1
147
+ version: 3.1.2
148
148
  - !ruby/object:Gem::Dependency
149
149
  name: turbo_tests2
150
150
  requirement: !ruby/object:Gem::Requirement
@@ -338,10 +338,10 @@ licenses:
338
338
  - AGPL-3.0-only
339
339
  metadata:
340
340
  homepage_uri: https://kettle-dev.galtzo.com
341
- source_code_uri: https://github.com/kettle-dev/kettle-dev/tree/v2.2.3
342
- changelog_uri: https://github.com/kettle-dev/kettle-dev/blob/v2.2.3/CHANGELOG.md
341
+ source_code_uri: https://github.com/kettle-dev/kettle-dev/tree/v2.2.5
342
+ changelog_uri: https://github.com/kettle-dev/kettle-dev/blob/v2.2.5/CHANGELOG.md
343
343
  bug_tracker_uri: https://github.com/kettle-dev/kettle-dev/issues
344
- documentation_uri: https://www.rubydoc.info/gems/kettle-dev/2.2.3
344
+ documentation_uri: https://www.rubydoc.info/gems/kettle-dev/2.2.5
345
345
  funding_uri: https://github.com/sponsors/pboling
346
346
  wiki_uri: https://github.com/kettle-dev/kettle-dev/wiki
347
347
  news_uri: https://www.railsbling.com/tags/kettle-dev
metadata.gz.sig CHANGED
Binary file