kettle-dev 3.0.11 → 3.0.12

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: 8705b505fb67483562906f08b0f5b0364b1ca70b29dd280aa43b8d8253462c9c
4
- data.tar.gz: b50dcb48986f104a45ca91ede2e689c93b4fba14488a78ab040e2697f74e3800
3
+ metadata.gz: 778a9528095541a29e4c6a15022c1fe312cf32ccb8f336972c046b02134bae32
4
+ data.tar.gz: bcc27b14726e3f17ad56b4e305e324c4ccb38df57df754f5f41b73e121f33a41
5
5
  SHA512:
6
- metadata.gz: 8cc4266eb73a959dee5394c22662632d7da905329221b3ac18d12b5b670eab11b96a6228f39a5280423b3fe8b5f1067c5aa8a0982c3306d3bfef85b39d647488
7
- data.tar.gz: bc3e6ff554d12422ccdd5c8a3381ca8756020556466afcef1b2fa34a5e54aceba1ba8310348d0dd36927fbd391197b05306a118fb128236518f6828c546c6cbb
6
+ metadata.gz: 4f4b916aeb6714071d76ab84ae57e08650e42fe0607df2e7b366855932c66019ad3f8a2ba37befa0089b9261eb38092ab3bc33cce61237b0d9880139da3399de
7
+ data.tar.gz: 238a0802ae743f219f919a9fbdd2d1500aeea06ad8a756e5e377c4bc8c275e0d80bf07911f9a78b94e0095e9809afbb8eaeb9f98d9ee2e6db72242cfc2aa5fd9
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,21 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [3.0.12] - 2026-08-25
34
+
35
+ - TAG: [v3.0.12][3.0.12t]
36
+ - COVERAGE: 91.48% -- 5754/6290 lines in 47 files
37
+ - BRANCH COVERAGE: 76.34% -- 2207/2891 branches in 47 files
38
+ - 50.74% documented
39
+
40
+ ### Changed
41
+
42
+ - Expose shared lockfile section inspection primitives for family release validation.
43
+
44
+ ### Fixed
45
+
46
+ - Skip unresolved Kettle-Jem template image URLs during pre-release validation.
47
+
33
48
  ## [3.0.11] - 2026-08-24
34
49
 
35
50
  - TAG: [v3.0.11][3.0.11t]
@@ -3542,7 +3557,9 @@ Please file a bug if you notice a violation of semantic versioning.
3542
3557
  - Selecting will run the selected workflow via `act`
3543
3558
  - This may move to its own gem in the future.
3544
3559
 
3545
- [Unreleased]: https://github.com/kettle-dev/kettle-dev/compare/v3.0.11...HEAD
3560
+ [Unreleased]: https://github.com/kettle-dev/kettle-dev/compare/v3.0.12...HEAD
3561
+ [3.0.12]: https://github.com/kettle-dev/kettle-dev/compare/v3.0.11...v3.0.12
3562
+ [3.0.12t]: https://github.com/kettle-dev/kettle-dev/releases/tag/v3.0.12
3546
3563
  [3.0.11]: https://github.com/kettle-dev/kettle-dev/compare/v3.0.10...v3.0.11
3547
3564
  [3.0.11t]: https://github.com/kettle-dev/kettle-dev/releases/tag/v3.0.11
3548
3565
  [3.0.10]: https://github.com/kettle-dev/kettle-dev/compare/v3.0.9...v3.0.10
data/README.md CHANGED
@@ -635,10 +635,12 @@ versions that are newer than the latest released version.
635
635
  - Checks:
636
636
  - 1) Validate GitHub Actions workflow action refs with `kettle-gha-sha-pins --check`; if pins are stale, it prints an outdated-actions summary, exits non-zero, and recommends `kettle-gha-sha-pins --write --upgrade patch`.
637
637
  - 2) Normalize Markdown image URLs.
638
- - 3) Validate that all image URLs referenced by Markdown files resolve (HTTP HEAD).
638
+ - 3) Validate Markdown references and local heading targets.
639
+ - 4) Validate that all image URLs referenced by Markdown files resolve (HTTP HEAD).
639
640
  - Image URL skips:
640
641
  - Star-history image API URLs are skipped by default because they are volatile.
641
- - Add project-specific shell-style URL patterns in `.kettle-family.yml` or a config path pointed to by `KETTLE_FAMILY_CONFIG`:
642
+ - Unresolved Kettle-Jem template tokens are skipped because they are not URLs until templating completes.
643
+ - Add project-specific shell-style URL patterns in `.kettle-family.yml` or a config path pointed to by `KETTLE_FAMILY_CONFIG`. `kettle-family` passes this path through when it orchestrates a member release, but `kettle-dev` owns the matching and validation:
642
644
  ```yaml
643
645
  pre_release:
644
646
  image_url_skip_patterns:
@@ -1012,7 +1014,7 @@ Thanks for RTFM. ☺️
1012
1014
  [📌gitmoji]: https://gitmoji.dev
1013
1015
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
1014
1016
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
1015
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-6.244-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
1017
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-6.290-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
1016
1018
  [🔐security]: https://github.com/kettle-dev/kettle-dev/blob/main/SECURITY.md
1017
1019
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
1018
1020
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -28,6 +28,84 @@ module Kettle
28
28
  RUBYOPT
29
29
  ]).freeze
30
30
 
31
+ class << self
32
+ def local_path_remote_lines_from_source(lockfile_source)
33
+ in_path = false
34
+ lockfile_source.each_line.with_index(1).filter_map do |line, index|
35
+ stripped = line.strip
36
+ if stripped.match?(/\A[A-Z][A-Z ]*\z/)
37
+ in_path = stripped == "PATH"
38
+ next
39
+ end
40
+ next unless in_path
41
+ next unless stripped.start_with?("remote:")
42
+ next if stripped == "remote: ."
43
+ next unless stripped.start_with?("remote: /", "remote: ./", "remote: ../")
44
+
45
+ index
46
+ end
47
+ end
48
+
49
+ def checksum_entries_from_source(lockfile_source)
50
+ in_checksums = false
51
+ entries = {}
52
+ lockfile_source.each_line do |line|
53
+ stripped = line.chomp
54
+ if stripped == "CHECKSUMS"
55
+ in_checksums = true
56
+ next
57
+ end
58
+ next unless in_checksums
59
+ break if !stripped.empty? && stripped == stripped.upcase && !stripped.start_with?(" ")
60
+ next unless stripped.start_with?(" ")
61
+
62
+ parsed = parse_lockfile_spec_line(stripped)
63
+ entries[[parsed.fetch(:name), parsed.fetch(:version)]] = parsed.fetch(:suffix) if parsed
64
+ end
65
+ in_checksums ? entries : nil
66
+ end
67
+
68
+ def gem_specs_from_source(lockfile_source)
69
+ in_gem = false
70
+ in_specs = false
71
+ specs = []
72
+ lockfile_source.each_line do |line|
73
+ stripped = line.chomp
74
+ if stripped == "GEM"
75
+ in_gem = true
76
+ in_specs = false
77
+ next
78
+ end
79
+ next unless in_gem
80
+ break if !stripped.empty? && stripped == stripped.upcase && !stripped.start_with?(" ")
81
+
82
+ if stripped == " specs:"
83
+ in_specs = true
84
+ next
85
+ end
86
+ next unless in_specs
87
+ next unless line.start_with?(" ") && !line.start_with?(" ")
88
+
89
+ parsed = parse_lockfile_spec_line(stripped)
90
+ specs << [parsed.fetch(:name), parsed.fetch(:version)] if parsed
91
+ end
92
+ specs.uniq
93
+ end
94
+
95
+ private
96
+
97
+ def parse_lockfile_spec_line(line)
98
+ stripped = line.to_s.strip
99
+ return nil if stripped.empty? || !stripped.include?(" (")
100
+
101
+ name, remainder = stripped.split(" (", 2)
102
+ version, suffix = remainder.to_s.split(")", 2)
103
+ return nil if name.to_s.empty? || version.to_s.empty?
104
+
105
+ {name: name, version: version, suffix: suffix.to_s.strip}
106
+ end
107
+ end
108
+
31
109
  def initialize(root:, command_runner:)
32
110
  @root = root
33
111
  @command_runner = command_runner
@@ -248,20 +326,7 @@ module Kettle
248
326
  end
249
327
 
250
328
  def local_path_remote_lines(path)
251
- in_path = false
252
- File.readlines(path).filter_map.with_index(1) do |line, index|
253
- stripped = line.strip
254
- if stripped.match?(/\A[A-Z][A-Z ]*\z/)
255
- in_path = stripped == "PATH"
256
- next
257
- end
258
- next unless in_path
259
- next unless stripped.start_with?("remote:")
260
- next if stripped == "remote: ."
261
- next unless stripped.start_with?("remote: /", "remote: ./", "remote: ../")
262
-
263
- index
264
- end
329
+ self.class.local_path_remote_lines_from_source(File.read(path))
265
330
  end
266
331
 
267
332
  def empty_registry_checksums(path)
@@ -511,6 +511,9 @@ module Kettle
511
511
  end
512
512
 
513
513
  def configured_image_url_skip_patterns
514
+ # Keep generic release safety in kettle-dev. Family-specific patterns
515
+ # are optional policy loaded from the family config when present, so a
516
+ # standalone kettle-release remains complete without kettle-family.
514
517
  DEFAULT_IMAGE_URL_SKIP_PATTERNS + family_configured_image_url_skip_patterns
515
518
  end
516
519
 
@@ -539,6 +542,10 @@ module Kettle
539
542
  end
540
543
 
541
544
  def image_url_skipped?(url)
545
+ # Unresolved Kettle-Jem tokens are valid in template source files and
546
+ # are not real URLs until templating. This rule must live here because
547
+ # direct kettle-dev releases do not run through kettle-family.
548
+ return true if url.to_s.include?("{KJ|")
542
549
  return true if github_actions_badge_for_local_workflow?(url)
543
550
 
544
551
  @image_url_skip_patterns.any? do |pattern|
@@ -5,7 +5,7 @@ module Kettle
5
5
  # Version namespace for this gem.
6
6
  module Version
7
7
  # Current gem version.
8
- VERSION = "3.0.11"
8
+ VERSION = "3.0.12"
9
9
  end
10
10
  # Current gem version exposed at the traditional constant location.
11
11
  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-dev
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.11
4
+ version: 3.0.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -400,10 +400,10 @@ licenses:
400
400
  - AGPL-3.0-only
401
401
  metadata:
402
402
  homepage_uri: https://kettle-dev.galtzo.com
403
- source_code_uri: https://github.com/kettle-dev/kettle-dev/tree/v3.0.11
404
- changelog_uri: https://github.com/kettle-dev/kettle-dev/blob/v3.0.11/CHANGELOG.md
403
+ source_code_uri: https://github.com/kettle-dev/kettle-dev/tree/v3.0.12
404
+ changelog_uri: https://github.com/kettle-dev/kettle-dev/blob/v3.0.12/CHANGELOG.md
405
405
  bug_tracker_uri: https://github.com/kettle-dev/kettle-dev/issues
406
- documentation_uri: https://www.rubydoc.info/gems/kettle-dev/3.0.11
406
+ documentation_uri: https://www.rubydoc.info/gems/kettle-dev/3.0.12
407
407
  funding_uri: https://github.com/sponsors/pboling
408
408
  wiki_uri: https://github.com/kettle-dev/kettle-dev/wiki
409
409
  news_uri: https://www.railsbling.com/tags/kettle-dev
metadata.gz.sig CHANGED
Binary file