kettle-dev 3.1.3 → 3.1.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: 0af4e7c94cc4d2320e2ac4f19162509c98cc3bc322281fbe09968fe211af1d2f
4
- data.tar.gz: 1d4734bb8a3a6768340d2ddb35294d704d7c203f4052246554ff17460e65e5b3
3
+ metadata.gz: 0e99b028eb7b7f955a4d4c6bc4d62b812d9e8a6a6399d0aadf448e525d9680a4
4
+ data.tar.gz: f5432081e590c22460c4876eb1e2e35406bcb1617881eb9814eccd3449e4fb45
5
5
  SHA512:
6
- metadata.gz: c3fd59b7f8de46b09620502a2c104599d31614f6f011cabe1adca6ee9e75c92bc70e32ebeaa46c897802ac1a629e4cfccbec093a2a572caed2720e2d52fa65aa
7
- data.tar.gz: 844135ea482141c8feaf2b48aeb837775492a70cf335fe6e4c97f9745bc6de92616787b6a6e5fb486b7b8b401a1147caa006af747cb06b8b75d8ed4987832454
6
+ metadata.gz: bffb2a5e07b7cb6ea1c225808e4a011c670a6768905052447112e4de5a9e15122fb9f0d3a1f65ed1a3cc80d290271e1844133cd4b64cb2c050b01d7d2f200552
7
+ data.tar.gz: 666f1974ea5d780e5b845039dc7923c769869faa50075074986cf165d9773e72848cfd2c200ced47a376ce08f15c01e317294e31a0811895880a25567d033059
checksums.yaml.gz.sig CHANGED
@@ -1,5 +1,3 @@
1
- zx�Nt_��CH�S�����U�-�.Tg$��'�~p��b�fM:-Ԕ��uޤ�z+�I!�����+�$�r&;�w�O�j pa$�He�sbE�Mt�A�4>А� �<#��۰�K_�
2
- ���F��Pc=�2��KJ�v���������M U��M�~9�/��8{����K�l�lA���<�
3
- ��$p�HjH*��H��5I_?sz!��8�U�~hp�+���y��M��~�A~��y��8eP�J���C��
4
- pb�����4#Ӿ�hzS�e�t$ 1��J(�t��oЗl�h��Bñ�o�]d�
5
- �P�Y,&���D���=�֑p���&qkQ:��>�7���'�P�6��$}��T$��(㋖�{0q����lO�
1
+ zi� �s� I?G3�i�J��u���T����>�r�¥4
2
+ �/h�JU(�Fk��Zڧ9��h]�q
3
+ ;�7q<��؄��9����i�(��w�})�`t�h/O���ao�|;J��[��=#�T|]�("_#�:���(pj���g#��3S��M��Wpr�-�|�d����ED��cW� C��b8{}���J��ZBc7t��.a(�j��2�嬱�l䶼����������Y�K/�V½��yx����f)� ��������ͮ4����z�3l��9�$k7�f�;}�W6|p�k?�r�W��^�z�U�
data/CHANGELOG.md CHANGED
@@ -30,6 +30,28 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [3.1.5] - 2026-09-28
34
+
35
+ - TAG: [v3.1.5][3.1.5t]
36
+ - COVERAGE: 91.43% -- 6170/6748 lines in 49 files
37
+ - BRANCH COVERAGE: 75.89% -- 2348/3094 branches in 49 files
38
+ - 51.34% documented
39
+
40
+ ### Fixed
41
+
42
+ - Recheck registry gem availability after release lockfile resolution instead of reusing stale negative probes.
43
+
44
+ ## [3.1.4] - 2026-09-28
45
+
46
+ - TAG: [v3.1.4][3.1.4t]
47
+ - COVERAGE: 91.89% -- 6197/6744 lines in 49 files
48
+ - BRANCH COVERAGE: 76.24% -- 2359/3094 branches in 49 files
49
+ - 51.34% documented
50
+
51
+ ### Fixed
52
+
53
+ - Centralize canonical path and component-aware containment checks for Kettle tools.
54
+
33
55
  ## [3.1.3] - 2026-09-27
34
56
 
35
57
  - TAG: [v3.1.3][3.1.3t]
@@ -3916,7 +3938,11 @@ Please file a bug if you notice a violation of semantic versioning.
3916
3938
  - Selecting will run the selected workflow via `act`
3917
3939
  - This may move to its own gem in the future.
3918
3940
 
3919
- [Unreleased]: https://github.com/kettle-dev/kettle-dev/compare/v3.1.3...HEAD
3941
+ [Unreleased]: https://github.com/kettle-dev/kettle-dev/compare/v3.1.5...HEAD
3942
+ [3.1.5]: https://github.com/kettle-dev/kettle-dev/compare/v3.1.4...v3.1.5
3943
+ [3.1.5t]: https://github.com/kettle-dev/kettle-dev/releases/tag/v3.1.5
3944
+ [3.1.4]: https://github.com/kettle-dev/kettle-dev/compare/v3.1.3...v3.1.4
3945
+ [3.1.4t]: https://github.com/kettle-dev/kettle-dev/releases/tag/v3.1.4
3920
3946
  [3.1.3]: https://github.com/kettle-dev/kettle-dev/compare/v3.1.2...v3.1.3
3921
3947
  [3.1.3t]: https://github.com/kettle-dev/kettle-dev/releases/tag/v3.1.3
3922
3948
  [3.1.2]: https://github.com/kettle-dev/kettle-dev/compare/v3.1.1...v3.1.2
data/README.md CHANGED
@@ -1066,7 +1066,7 @@ Thanks for RTFM. ☺️
1066
1066
  [📌gitmoji]: https://gitmoji.dev
1067
1067
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
1068
1068
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
1069
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-6.717-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
1069
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-6.748-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
1070
1070
  [🔐security]: https://github.com/kettle-dev/kettle-dev/blob/main/SECURITY.md
1071
1071
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
1072
1072
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -124,6 +124,7 @@ module Kettle
124
124
 
125
125
  def reset(target, skip_changelog_dependency: false)
126
126
  BundlerEnvGuard.warn_unexpected_env!
127
+ clear_gem_source_version_availability_cache!
127
128
  paths = lockfile_paths_for(target)
128
129
  release_lockfiles = release_lockfiles_target?(target)
129
130
  # The selected graph governs both tracked release locks and disposable
@@ -188,6 +189,7 @@ module Kettle
188
189
  else
189
190
  command_runner.call(command)
190
191
  end
192
+ clear_gem_source_version_availability_cache!
191
193
  end
192
194
  end
193
195
 
@@ -790,6 +792,10 @@ module Kettle
790
792
  @gem_source_version_available[cache_key] = GemSourceProbe.new(source_url: source_url).available?(name, version)
791
793
  end
792
794
 
795
+ def clear_gem_source_version_availability_cache!
796
+ @gem_source_version_available = {}
797
+ end
798
+
793
799
  def source_urls_for_lockfiles(paths)
794
800
  paths.flat_map { |path| registry_source_urls(path) }.uniq
795
801
  end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kettle
4
+ module Dev
5
+ # Filesystem path operations shared by Kettle tools.
6
+ module Paths
7
+ module_function
8
+
9
+ # Expands a path and resolves its longest existing ancestor. This keeps
10
+ # comparisons useful for generated paths that do not exist yet.
11
+ def canonical(path, base: nil)
12
+ expanded = File.expand_path(path, base)
13
+ existing = expanded
14
+ suffix = []
15
+ until File.exist?(existing) || File.symlink?(existing)
16
+ parent = File.dirname(existing)
17
+ return expanded if parent == existing
18
+
19
+ suffix.unshift(File.basename(existing))
20
+ existing = parent
21
+ end
22
+
23
+ suffix.reduce(File.realpath(existing)) { |resolved, component| File.join(resolved, component) }
24
+ rescue Errno::EACCES, Errno::ENOENT
25
+ expanded
26
+ end
27
+
28
+ # Uses filesystem identity for existing paths, so symlink aliases and
29
+ # platform-specific aliases are compared by the operating system.
30
+ def same?(left, right, base: nil)
31
+ left_path = canonical(left, base: base)
32
+ right_path = canonical(right, base: base)
33
+ return true if left_path == right_path
34
+
35
+ return File.identical?(left_path, right_path) if File.exist?(left_path) && File.exist?(right_path)
36
+
37
+ comparable_parts(left_path) == comparable_parts(right_path)
38
+ rescue Errno::EACCES, Errno::ENOENT, Errno::ENOTDIR, NotImplementedError
39
+ comparable_parts(left_path || left) == comparable_parts(right_path || right)
40
+ end
41
+
42
+ # Tests containment by path components, not by a string prefix.
43
+ def within?(path, root, base: nil)
44
+ candidate = canonical(path, base: base)
45
+ boundary = canonical(root, base: base)
46
+ return true if same?(candidate, boundary)
47
+
48
+ candidate_parts = comparable_parts(candidate)
49
+ boundary_parts = comparable_parts(boundary)
50
+ candidate_parts[0, boundary_parts.length] == boundary_parts
51
+ rescue Errno::EACCES, Errno::ENOENT, Errno::ENOTDIR
52
+ false
53
+ end
54
+
55
+ def path_parts(path)
56
+ path.tr("\\", "/").split("/").reject(&:empty?)
57
+ end
58
+
59
+ def comparable_parts(path)
60
+ parts = path_parts(path)
61
+ Gem.win_platform? ? parts.map(&:downcase) : parts
62
+ end
63
+ end
64
+ end
65
+ end
@@ -30,7 +30,7 @@ module Kettle
30
30
 
31
31
  def initialize(name:, root:, ci_root:, local_path_roots: [], selector_env: {})
32
32
  @name = String(name)
33
- @root = File.realpath(root)
33
+ @root = Paths.canonical(root)
34
34
  @ci_root = canonical_path(ci_root)
35
35
  @local_path_roots = Array(local_path_roots).map { |path| canonical_path(path) }.uniq.freeze
36
36
  @selector_env = selector_env.to_h.map { |key, value| [String(key), String(value)] }.to_h.freeze
@@ -86,25 +86,11 @@ module Kettle
86
86
  end
87
87
 
88
88
  def canonical_path(path)
89
- expanded = File.expand_path(path, @root)
90
- candidate = expanded
91
- suffix = []
92
-
93
- until File.exist?(candidate) || File.symlink?(candidate)
94
- parent = File.dirname(candidate)
95
- return expanded if parent == candidate
96
-
97
- suffix.unshift(File.basename(candidate))
98
- candidate = parent
99
- end
100
-
101
- suffix.reduce(File.realpath(candidate)) { |base, component| File.join(base, component) }
102
- rescue Errno::ENOENT
103
- expanded
89
+ Paths.canonical(path, base: @root)
104
90
  end
105
91
 
106
92
  def path_within_root?(path, root)
107
- path == root || (path[0, root.length] == root && path[root.length] == "/")
93
+ Paths.within?(path, root)
108
94
  end
109
95
  end
110
96
  end
@@ -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.1.3"
8
+ VERSION = "3.1.5"
9
9
  end
10
10
  # Current gem version exposed at the traditional constant location.
11
11
  VERSION = Version::VERSION # Traditional Constant Location
data/lib/kettle/dev.rb CHANGED
@@ -47,6 +47,7 @@ module Kettle
47
47
  autoload :MarkdownReferenceValidator, "kettle/dev/markdown_reference_validator"
48
48
  autoload :ReadmeBackers, "kettle/dev/readme_backers"
49
49
  autoload :OpenCollectiveConfig, "kettle/dev/open_collective_config"
50
+ autoload :Paths, "kettle/dev/paths"
50
51
  autoload :ReleaseNotifier, "kettle/dev/release_notifier"
51
52
  autoload :ReleaseCLI, "kettle/dev/release_cli"
52
53
  autoload :ReleaseGraphContract, "kettle/dev/release_graph_contract"
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.1.3
4
+ version: 3.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -390,6 +390,7 @@ files:
390
390
  - lib/kettle/dev/lockfile_reset.rb
391
391
  - lib/kettle/dev/markdown_reference_validator.rb
392
392
  - lib/kettle/dev/open_collective_config.rb
393
+ - lib/kettle/dev/paths.rb
393
394
  - lib/kettle/dev/pre_release_cli.rb
394
395
  - lib/kettle/dev/rakelib/appraisal.rake
395
396
  - lib/kettle/dev/rakelib/bench.rake
@@ -421,10 +422,10 @@ licenses:
421
422
  - AGPL-3.0-only
422
423
  metadata:
423
424
  homepage_uri: https://kettle-dev.galtzo.com
424
- source_code_uri: https://github.com/kettle-dev/kettle-dev/tree/v3.1.3
425
- changelog_uri: https://github.com/kettle-dev/kettle-dev/blob/v3.1.3/CHANGELOG.md
425
+ source_code_uri: https://github.com/kettle-dev/kettle-dev/tree/v3.1.5
426
+ changelog_uri: https://github.com/kettle-dev/kettle-dev/blob/v3.1.5/CHANGELOG.md
426
427
  bug_tracker_uri: https://github.com/kettle-dev/kettle-dev/issues
427
- documentation_uri: https://www.rubydoc.info/gems/kettle-dev/3.1.3
428
+ documentation_uri: https://www.rubydoc.info/gems/kettle-dev/3.1.5
428
429
  funding_uri: https://github.com/sponsors/pboling
429
430
  wiki_uri: https://github.com/kettle-dev/kettle-dev/wiki
430
431
  news_uri: https://www.railsbling.com/tags/kettle-dev
metadata.gz.sig CHANGED
Binary file