kettle-family 1.2.84 → 1.2.86

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: 9d60e9fc61486c0ac3adcbbd20df98c09cab7c9758e9eb5caa3a95c4308bb168
4
- data.tar.gz: 0bb55d3a77da5d9fdf94c73d4295ae8f5a772b8f9a07e5da4108970135b690c2
3
+ metadata.gz: 21a652aea8226a4e77e30eec15208ab8337acb1c588828c2513d74b73d83186b
4
+ data.tar.gz: fe8cefdd96d256b3a0c08db1eab5ff75c03a2afe7f70d1a8ca3778d9b1609444
5
5
  SHA512:
6
- metadata.gz: f868bb0dbf6665ea261cb0011a04b33125c8bf794a51e2b4092359993a6ab5d35fa19ed2d006279f0c1d13694aedd439caf913c3918763d0c03304808a2649cc
7
- data.tar.gz: 8fe0c820e3b2b2d17c627b0a6fb7d44e28b8f885c4daa1d379fed8b45fac134b9b84e6b9037829bdfb22026d17e0e74b183f3c4067ecc90b57433189ac583fe1
6
+ metadata.gz: 491966653b36eb913a447b028de8f68dc7bf3f9e8291bea3205d95083d7d7173fe310eb8f81f456793a7f4f86650229ac2b940ef6f29bb0a7620c949c6444dbd
7
+ data.tar.gz: 98e477f02f7d1d7dbfd142108430061d11061e215702544cb304e0a126403ec2fc15aa41f89b0431436cfe6b0c53c1dcc7eb60239805d8a0d4c384bd2558985d
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,34 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [1.2.86] - 2026-09-06
34
+
35
+ - TAG: [v1.2.86][1.2.86t]
36
+ - COVERAGE: 93.09% -- 5805/6236 lines in 34 files
37
+ - BRANCH COVERAGE: 76.16% -- 2354/3091 branches in 34 files
38
+ - 31.88% documented
39
+
40
+ ### Fixed
41
+
42
+ - Recover template lockfiles in the configured local dependency graph instead of release normalization mode.
43
+
44
+ - Use the templating dependency graph during initial template lockfile preparation.
45
+
46
+ - Define execution profiles and add real Bundler compatibility scenarios for template and release lockfile isolation.
47
+
48
+ ## [1.2.85] - 2026-09-06
49
+
50
+ - TAG: [v1.2.85][1.2.85t]
51
+ - COVERAGE: 93.08% -- 5785/6215 lines in 33 files
52
+ - BRANCH COVERAGE: 76.04% -- 2345/3084 branches in 33 files
53
+ - 30.69% documented
54
+
55
+ ### Fixed
56
+
57
+ - Keep local template dependency activation enabled while bootstrapping nomono.
58
+
59
+ - Use the complete template dependency graph when bootstrapping nomono; reserve the changelog dependency opt-out for explicit constraint conflicts.
60
+
33
61
  ## [1.2.84] - 2026-09-05
34
62
 
35
63
  - TAG: [v1.2.84][1.2.84t]
@@ -2510,7 +2538,11 @@ Please file a bug if you notice a violation of semantic versioning.
2510
2538
  - Fixed CI load failures on engines without compatible `pty` support by falling back to Open3 for interactive release commands.
2511
2539
  - Fixed Ruby 3.2 version-bump support by loading Prism lazily and wiring the Prism gem only for MRI versions that need it.
2512
2540
 
2513
- [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.84...HEAD
2541
+ [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.86...HEAD
2542
+ [1.2.86]: https://github.com/kettle-dev/kettle-family/compare/v1.2.85...v1.2.86
2543
+ [1.2.86t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.86
2544
+ [1.2.85]: https://github.com/kettle-dev/kettle-family/compare/v1.2.84...v1.2.85
2545
+ [1.2.85t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.85
2514
2546
  [1.2.84]: https://github.com/kettle-dev/kettle-family/compare/v1.2.83...v1.2.84
2515
2547
  [1.2.84t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.84
2516
2548
  [1.2.83]: https://github.com/kettle-dev/kettle-family/compare/v1.2.82...v1.2.83
data/README.md CHANGED
@@ -797,6 +797,38 @@ kettle-family template --execute \
797
797
  --env STRUCTUREDMERGE_DEV=/home/me/src/structuredmerge/ruby/gems
798
798
  ```
799
799
 
800
+ ### Template Bootstrap Environment
801
+
802
+ The complete path-gem, lockfile, install, platform, and mutation policy is
803
+ defined in [Execution Profiles](EXECUTION_PROFILES.md). The rules below are
804
+ the template-local portion of that policy.
805
+
806
+ Before invoking `kettle-jem`, `kettle-family template` may refresh `nomono` so
807
+ the member Gemfile can activate its generated local dependency wiring. Both
808
+ bootstrap and lockfile preparation use the same development dependency graph:
809
+
810
+ - `K_JEM_TEMPLATING=true` is enforced. It selects the templating Gemfile graph
811
+ and activates generated local sibling closures. It is not a release-lockfile
812
+ normalization setting.
813
+ - The configured family `*_DEV` selector is preserved or inferred from the
814
+ family configuration. It tells `nomono` where that sibling closure lives.
815
+ - `BUNDLE_DISABLE_CHECKSUM_VALIDATION=true` is retained for template bootstrap
816
+ and template application, where a template can legitimately update a
817
+ lockfile before its checksums are normalized.
818
+ - `KETTLE_DEV_SKIP_CHANGELOG_DEPENDENCY` defaults to `false`. Set it explicitly
819
+ only when the optional `kettle-changelog` dependency has an incompatible
820
+ version constraint with the graph being bootstrapped. It does not select
821
+ local dependencies and must not be used as a general Bundler-resolution or
822
+ release-lockfile workaround.
823
+
824
+ Release lockfile normalization is a separate operation with its own local-path
825
+ policy; it must not be inferred from template bootstrap settings.
826
+
827
+ If template lockfile preparation needs a recovery update, that retry also uses
828
+ the template dependency graph. It must not invoke release-lockfile reset logic:
829
+ release normalization intentionally disables local paths, while template
830
+ recovery needs configured sibling paths to resolve unreleased family versions.
831
+
800
832
  ## 🔐 Security
801
833
 
802
834
  See [SECURITY.md][🔐security].
@@ -1049,7 +1081,7 @@ Thanks for RTFM. ☺️
1049
1081
  [📌gitmoji]: https://gitmoji.dev
1050
1082
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
1051
1083
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
1052
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-6.213-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
1084
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-6.236-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
1053
1085
  [🔐security]: https://github.com/kettle-dev/kettle-family/blob/main/SECURITY.md
1054
1086
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
1055
1087
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kettle
4
+ module Family
5
+ # The execution context is a compatibility boundary, not a collection of
6
+ # incidental ENV assignments. Each workflow command selects one profile so
7
+ # path-gem, lockfile, install, and mutation rules remain reviewable.
8
+ class ExecutionProfile
9
+ Definition = Struct.new(
10
+ :name,
11
+ :path_gem_policy,
12
+ :lockfile_role,
13
+ :install_location,
14
+ :host_platform_policy,
15
+ :allowed_mutations
16
+ ) do
17
+ def local_path_gems?
18
+ path_gem_policy != :registry_only
19
+ end
20
+
21
+ def canonical_lockfile?
22
+ lockfile_role == :canonical
23
+ end
24
+ end
25
+
26
+ DEFINITIONS = {
27
+ development_local: Definition.new(
28
+ name: :development_local,
29
+ path_gem_policy: :configured_siblings,
30
+ lockfile_role: :canonical,
31
+ install_location: :member,
32
+ host_platform_policy: :active_platform_must_resolve,
33
+ allowed_mutations: %i[development_lockfiles source test]
34
+ ),
35
+ template_local: Definition.new(
36
+ name: :template_local,
37
+ path_gem_policy: :configured_siblings,
38
+ lockfile_role: :canonical,
39
+ install_location: :member,
40
+ host_platform_policy: :active_platform_must_resolve,
41
+ allowed_mutations: %i[template development_lockfiles generated]
42
+ ),
43
+ release_registry: Definition.new(
44
+ name: :release_registry,
45
+ path_gem_policy: :registry_only,
46
+ lockfile_role: :canonical,
47
+ install_location: :disposable,
48
+ host_platform_policy: :active_platform_must_resolve,
49
+ allowed_mutations: %i[canonical_release_lockfiles]
50
+ ),
51
+ release_monorepo: Definition.new(
52
+ name: :release_monorepo,
53
+ path_gem_policy: :configured_release_wave,
54
+ lockfile_role: :canonical,
55
+ install_location: :disposable,
56
+ host_platform_policy: :active_platform_must_resolve,
57
+ allowed_mutations: %i[canonical_release_lockfiles configured_wave_paths]
58
+ ),
59
+ release_recovery: Definition.new(
60
+ name: :release_recovery,
61
+ path_gem_policy: :configured_release_wave,
62
+ lockfile_role: :canonical,
63
+ install_location: :disposable,
64
+ host_platform_policy: :active_platform_must_resolve,
65
+ allowed_mutations: %i[canonical_release_lockfiles configured_wave_paths]
66
+ )
67
+ }.each_value(&:freeze).freeze
68
+
69
+ def self.fetch(name)
70
+ DEFINITIONS.fetch(name.to_sym)
71
+ rescue KeyError
72
+ raise ArgumentError, "unknown execution profile: #{name.inspect}"
73
+ end
74
+ end
75
+ end
76
+ 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 = "1.2.84"
8
+ VERSION = "1.2.86"
9
9
  end
10
10
  # Current gem version exposed at the traditional constant location.
11
11
  VERSION = Version::VERSION # Traditional Constant Location
@@ -824,14 +824,25 @@ module Kettle
824
824
 
825
825
  def template_bootstrap_dependency_env(_member)
826
826
  env = template_prepare_env
827
- # This refresh only activates nomono. Changelog tooling is not needed
828
- # and can pin a previously released monorepo dependency graph.
829
- env["KETTLE_DEV_SKIP_CHANGELOG_DEPENDENCY"] = "true"
830
- env["K_JEM_TEMPLATING"] = "false"
831
- env["BUNDLE_DISABLE_CHECKSUM_VALIDATION"] = "true"
827
+ # Bootstrap must evaluate the same development graph as template
828
+ # preparation. In particular, K_JEM_TEMPLATING activates the generated
829
+ # local sibling closure; without it, stale generated Gemfiles can make
830
+ # Bundler look for an unreleased family gem in a registry.
831
+ #
832
+ # kettle-changelog is part of that normal graph. Its opt-out remains
833
+ # available only for an explicit, known optional-dependency constraint
834
+ # conflict; it is not a general solution for local-path resolution.
835
+ env["KETTLE_DEV_SKIP_CHANGELOG_DEPENDENCY"] = template_bootstrap_changelog_dependency_setting
832
836
  env
833
837
  end
834
838
 
839
+ def template_bootstrap_changelog_dependency_setting
840
+ env_overrides.fetch(
841
+ "KETTLE_DEV_SKIP_CHANGELOG_DEPENDENCY",
842
+ ENV.fetch("KETTLE_DEV_SKIP_CHANGELOG_DEPENDENCY", "false")
843
+ )
844
+ end
845
+
835
846
  def template_results_for_member(member, progress: nil)
836
847
  progress&.start_member(member, total: template_phase_total(member), status: template_initial_status(member))
837
848
  runner = CommandRunner.new(execute: execute, accept: accept)
@@ -4373,13 +4384,13 @@ module Kettle
4373
4384
  end
4374
4385
 
4375
4386
  def recover_template_lockfiles(member:, runner:, memo:, phase:)
4376
- reset_gemfile_lock(
4387
+ result = runner.call(
4377
4388
  member: member,
4378
- runner: runner,
4379
- memo: memo,
4380
4389
  phase: phase,
4381
- env: template_lockfile_recovery_env(member)
4390
+ command: normalize_lockfiles_command(member: member, phase: "prepare_lockfiles"),
4391
+ env: template_lockfile_recovery_env
4382
4392
  )
4393
+ memo << result
4383
4394
  return unless memo.last&.ok?
4384
4395
 
4385
4396
  commit_normalized_lockfiles(
@@ -4404,15 +4415,11 @@ module Kettle
4404
4415
  [result.stdout, result.stderr].join("\n").match?(/Unknown switches? .*--add-checksums/)
4405
4416
  end
4406
4417
 
4407
- def template_lockfile_recovery_env(member)
4408
- env = release_lockfile_env(member).merge(workflow_env)
4409
- ENV.each do |key, value|
4410
- env[key] = value if key.end_with?("_DEV", "_LOCAL") && local_path_env_requested?(key)
4411
- end
4412
- env.merge!(env_overrides)
4413
- env["K_JEM_TEMPLATING"] = "false"
4414
- env["BUNDLE_DISABLE_CHECKSUM_VALIDATION"] = "true"
4415
- env
4418
+ def template_lockfile_recovery_env(_member = nil)
4419
+ # A failed template preparation can be caused by an unreleased sibling
4420
+ # version. Recover in the template graph, not the release graph, so
4421
+ # Bundler uses the configured monorepo paths.
4422
+ execution_profile(template_execution_profile, workflow_env)
4416
4423
  end
4417
4424
 
4418
4425
  def normalize_lockfiles_command(member:, phase:, skip_checksum_option: false)
@@ -4618,7 +4625,37 @@ module Kettle
4618
4625
  # Templating is development work. It must resolve the configured
4619
4626
  # family graph exactly as template application does; release-only
4620
4627
  # lockfile cleanup owns disabling local path sources.
4621
- workflow_env
4628
+ execution_profile(template_execution_profile, workflow_env)
4629
+ end
4630
+
4631
+ def template_execution_profile
4632
+ ExecutionProfile.fetch(:template_local)
4633
+ end
4634
+
4635
+ def release_lockfile_execution_profile
4636
+ return ExecutionProfile.fetch(:release_recovery) if release_recovery?
4637
+ return ExecutionProfile.fetch(:release_monorepo) if preserve_monorepo_template_context?
4638
+
4639
+ ExecutionProfile.fetch(:release_registry)
4640
+ end
4641
+
4642
+ def release_recovery?
4643
+ !start_step.nil? || !skip_steps.to_s.empty? || fast_recovery || skip_ci
4644
+ end
4645
+
4646
+ def execution_profile(profile, env)
4647
+ profile = ExecutionProfile.fetch(profile) unless profile.is_a?(ExecutionProfile::Definition)
4648
+ env = env.dup
4649
+ case profile.name
4650
+ when :template_local
4651
+ env["K_JEM_TEMPLATING"] = "true"
4652
+ env["BUNDLE_DISABLE_CHECKSUM_VALIDATION"] = "true"
4653
+ when :release_registry, :release_monorepo, :release_recovery
4654
+ # Release profiles deliberately leave Bundler mutation decisions to
4655
+ # kettle-dev. The profile selection controls which local-path
4656
+ # overrides this workflow contributes below.
4657
+ end
4658
+ env
4622
4659
  end
4623
4660
 
4624
4661
  def local_path_env_requested?(name)
@@ -4672,10 +4709,13 @@ module Kettle
4672
4709
  end
4673
4710
 
4674
4711
  def release_lockfile_env(member = nil)
4675
- base_release_env
4712
+ execution_profile(
4713
+ release_lockfile_execution_profile,
4714
+ base_release_env
4676
4715
  .merge(release_lockfile_bundler_env_resets)
4677
4716
  .merge(env_overrides)
4678
4717
  .merge(release_lockfile_local_path_env_overrides(member))
4718
+ )
4679
4719
  end
4680
4720
 
4681
4721
  def release_lockfile_bundler_env_resets
data/lib/kettle/family.rb CHANGED
@@ -21,6 +21,7 @@ require_relative "family/nomono_bootstrap"
21
21
  require_relative "family/debugger_bootstrap"
22
22
  require_relative "family/appraisal_bootstrap"
23
23
  require_relative "family/release_waves"
24
+ require_relative "family/execution_profile"
24
25
  require_relative "family/workflow"
25
26
  require_relative "family/discovery"
26
27
  require_relative "family/orderer"
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kettle-family
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.84
4
+ version: 1.2.86
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -91,7 +91,7 @@ dependencies:
91
91
  requirements:
92
92
  - - ">="
93
93
  - !ruby/object:Gem::Version
94
- version: 3.0.30
94
+ version: 3.0.31
95
95
  - - "<"
96
96
  - !ruby/object:Gem::Version
97
97
  version: 4.0.0
@@ -101,7 +101,7 @@ dependencies:
101
101
  requirements:
102
102
  - - ">="
103
103
  - !ruby/object:Gem::Version
104
- version: 3.0.30
104
+ version: 3.0.31
105
105
  - - "<"
106
106
  - !ruby/object:Gem::Version
107
107
  version: 4.0.0
@@ -414,6 +414,7 @@ files:
414
414
  - lib/kettle/family/debugger_bootstrap.rb
415
415
  - lib/kettle/family/dependency_floor.rb
416
416
  - lib/kettle/family/discovery.rb
417
+ - lib/kettle/family/execution_profile.rb
417
418
  - lib/kettle/family/git_status.rb
418
419
  - lib/kettle/family/local_install.rb
419
420
  - lib/kettle/family/member.rb
@@ -441,10 +442,10 @@ licenses:
441
442
  - AGPL-3.0-only
442
443
  metadata:
443
444
  homepage_uri: https://kettle-family.galtzo.com
444
- source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.2.84
445
- changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.84/CHANGELOG.md
445
+ source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.2.86
446
+ changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.86/CHANGELOG.md
446
447
  bug_tracker_uri: https://github.com/kettle-dev/kettle-family/issues
447
- documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.2.84
448
+ documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.2.86
448
449
  funding_uri: https://github.com/sponsors/pboling
449
450
  wiki_uri: https://github.com/kettle-dev/kettle-family/wiki
450
451
  news_uri: https://www.railsbling.com/tags/kettle-family
metadata.gz.sig CHANGED
Binary file