kettle-jem 7.1.11 → 7.1.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: 4557a45c40575cf35c6a6630ca4f15694407df55cae707f4187c282111a5fe6e
4
- data.tar.gz: df10a122743e47d9236115a4e7d44fbc0342a70de1da7643b863da983f9d800e
3
+ metadata.gz: a5727e30e966bc0b35df82298bf1ed8c7b9724641604e814d0ca3d655a3cd119
4
+ data.tar.gz: a1bfadf03c584d245ad03f06466cc133a228f473092865593fe02d7bff5f5d9b
5
5
  SHA512:
6
- metadata.gz: 77dfdae1740bbe776afb7d9f181a34244c6bd594cc0b9d6d274e9183c8d1be60894c7c112243c9f5d064f9cf4a57b2ec043e0bb84d55eb4dfe86b48008f535c7
7
- data.tar.gz: 17fac3e17f62555dc40598d641007ce21c05c7968cb9745409b3eeaf153c86648b47dde2abaee0b2ed1a82cab268e267eeeac1ce31fbf2d69d493119de03d9bc
6
+ metadata.gz: 1abd520d313d7888500f58aa5f6bbf494e56c3e7c10629ba4f5206927bb111ce0b03096b43651caef812006d01134f7e20c8ffe40bb97fc7da0064ee2c897e05
7
+ data.tar.gz: cdafb8779bc44d03077368e7db0554e0eb998d15d0960542cb77658c947abec959396f3a60ff16245bf2b6aeabb26b7fd448b1f53cf10616fa83afaddb87a03c
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,48 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [7.1.13] - 2026-08-31
34
+
35
+ - TAG: [v7.1.13][7.1.13t]
36
+ - COVERAGE: 93.62% -- 11103/11860 lines in 16 files
37
+ - BRANCH COVERAGE: 76.97% -- 4728/6143 branches in 16 files
38
+ - 17.96% documented
39
+
40
+ ### Changed
41
+
42
+ - [kc] kettle-jem/template: updated 796 project files:
43
+ - code and tests (40)
44
+ - configuration (24)
45
+ - dependencies (294)
46
+ - documentation (18)
47
+ - other (246)
48
+ - workflows (174)
49
+
50
+ - [kc] kettle-jem-deps-floor: Update kettle-jem template dependency floors:
51
+ - kettle-family (>= 1.2.65 -> >= 1.2.74)
52
+
53
+ ### Fixed
54
+
55
+ - Preserve existing lockfile platforms and add the local host platform during template lockfile normalization.
56
+
57
+ - Preserve locked dependencies while adding the local host platform to template-normalized lockfiles.
58
+
59
+ - Preserved configured per-engine CI commands across workflow template updates.
60
+
61
+ - Invalidate workflow template checksums when a configured per-engine command changes.
62
+
63
+ ## [7.1.12] - 2026-08-30
64
+
65
+ - TAG: [v7.1.12][7.1.12t]
66
+ - COVERAGE: 93.64% -- 11027/11776 lines in 16 files
67
+ - BRANCH COVERAGE: 76.95% -- 4698/6105 branches in 16 files
68
+ - 17.95% documented
69
+
70
+ ### Changed
71
+
72
+ - [kc] kettle-jem-deps-floor: Update kettle-jem template dependency floors:
73
+ - kettle-family (>= 1.2.64 -> >= 1.2.65)
74
+
33
75
  ## [7.1.11] - 2026-08-29
34
76
 
35
77
  - TAG: [v7.1.11][7.1.11t]
@@ -1704,7 +1746,11 @@ Please file a bug if you notice a violation of semantic versioning.
1704
1746
  - Released kettle-jem as part of the initial StructuredMerge Ruby 7.0.0 gem set.
1705
1747
  - Included packaged templates and parser-backed merge support for Ruby gem templating.
1706
1748
 
1707
- [Unreleased]: https://github.com/structuredmerge/structuredmerge-ruby/compare/v7.1.11...HEAD
1749
+ [Unreleased]: https://github.com/structuredmerge/structuredmerge-ruby/compare/v7.1.13...HEAD
1750
+ [7.1.13]: https://github.com/structuredmerge/structuredmerge-ruby/compare/v7.1.12...v7.1.13
1751
+ [7.1.13t]: https://github.com/structuredmerge/structuredmerge-ruby/releases/tag/v7.1.13
1752
+ [7.1.12]: https://github.com/structuredmerge/structuredmerge-ruby/compare/v7.1.11...v7.1.12
1753
+ [7.1.12t]: https://github.com/structuredmerge/structuredmerge-ruby/releases/tag/v7.1.12
1708
1754
  [7.1.11]: https://github.com/structuredmerge/structuredmerge-ruby/compare/v7.1.10...v7.1.11
1709
1755
  [7.1.11t]: https://github.com/structuredmerge/structuredmerge-ruby/releases/tag/v7.1.11
1710
1756
  [7.1.10]: https://github.com/structuredmerge/structuredmerge-ruby/compare/v7.1.8...v7.1.10
data/README.md CHANGED
@@ -278,6 +278,21 @@ Neither `appraisal_matrix` nor `framework_matrix` implicitly changes the root
278
278
  local development bundle. Pair either policy with `test_bundle` when the
279
279
  default local test command needs a specific framework or harness.
280
280
 
281
+ ### Per-Engine Workflow Commands
282
+
283
+ Generated workflows use `workflows.exec_cmd` by default. When a legacy engine
284
+ needs a narrower test command but should still receive the normal generated
285
+ workflow maintenance, configure `workflows.engine_exec_cmds` with the exact
286
+ matrix `ruby` value. The override changes only that matrix entry's `exec_cmd`;
287
+ setup, retry, cache, and pin behavior remains template-managed.
288
+
289
+ ```yaml
290
+ workflows:
291
+ exec_cmd: kettle-test --example-status-log .rspec_status
292
+ engine_exec_cmds:
293
+ truffleruby-22.3: kettle-test --tag ~type:acceptance --example-status-log .rspec_status
294
+ ```
295
+
281
296
  ### Default Local Test Bundle
282
297
 
283
298
  The root `Gemfile` is the default bundle for local commands such as
@@ -864,7 +879,7 @@ Thanks for RTFM. ☺️
864
879
  [📌gitmoji]: https://gitmoji.dev
865
880
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
866
881
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
867
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-11.776-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
882
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-11.860-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
868
883
  [🔐security]: https://github.com/structuredmerge/structuredmerge-ruby/blob/main/SECURITY.md
869
884
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
870
885
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -47,6 +47,7 @@ module Kettle
47
47
  install_steps.concat(run_bundle_setup_commands(project_root, env: setup_env, run_options: effective_run_options, command_runner: command_runner))
48
48
  install_steps << appraisal_generate_step(project_root, env: setup_env, run_options: effective_run_options)
49
49
  install_steps << rubocop_gradual_autocorrect_step(project_root, env: setup_env, run_options: effective_run_options)
50
+ install_steps << normalize_lockfile_platforms_step(project_root, env: setup_env, run_options: effective_run_options)
50
51
  install_steps << normalize_lockfile_step(project_root, env: setup_env, run_options: effective_run_options)
51
52
  install_steps << bundled_handoff_step(project_root: project_root, env: env, run_options: effective_run_options)
52
53
  install_steps = execute_orchestration_steps(install_steps, project_root: project_root, env: setup_env, run_options: effective_run_options, command_runner: command_runner)
@@ -738,15 +739,64 @@ module Kettle
738
739
 
739
740
  {
740
741
  name: "bundle_lock_normalization",
741
- command: lockfile_normalization_command,
742
+ command: lockfile_normalization_command(project_root),
742
743
  status: "ready",
743
744
  env: normal_lockfile_env(project_root, env),
744
- reason: "bundle_update_without_templating_overrides"
745
+ reason: "bundle_lock_update_preserving_platforms_without_templating_overrides"
745
746
  }
746
747
  end
747
748
 
748
- def lockfile_normalization_command
749
- %w[bundle update]
749
+ def normalize_lockfile_platforms_step(project_root, env:, run_options: {})
750
+ return skipped_lockfile_normalization_step("lockfile_platform_normalization", "skip_lock_normalization") if Kettle::Jem::DecisionPolicy.value_to_boolean((run_options || {})[:skip_lock_normalization])
751
+ return skipped_lockfile_normalization_step("lockfile_platform_normalization", "local_path_development_env") if local_path_development_env?(env)
752
+ return skipped_lockfile_normalization_step("lockfile_platform_normalization", "missing_Gemfile.lock") unless File.file?(File.join(project_root.to_s, "Gemfile.lock"))
753
+
754
+ {
755
+ name: "lockfile_platform_normalization",
756
+ status: "ready",
757
+ reason: "preserve_locked_dependencies_and_add_local_platform"
758
+ }
759
+ end
760
+
761
+ def normalize_lockfile_platforms(project_root)
762
+ lock_path = File.join(project_root.to_s, "Gemfile.lock")
763
+ contents = Bundler.read_file(lock_path)
764
+ platforms = (Bundler::LockfileParser.new(contents).platforms.map(&:to_s) + [Gem::Platform.local.to_s]).reject(&:empty?).uniq.sort
765
+ lines = contents.lines
766
+ platforms_index = lines.index { |line| line == "PLATFORMS\n" }
767
+ raise Bundler::LockfileError, "Gemfile.lock does not contain a PLATFORMS section" unless platforms_index
768
+
769
+ next_section_index = lines.each_index.find do |index|
770
+ index > platforms_index && !lines[index].start_with?(" ") && lines[index] != "\n"
771
+ end
772
+ raise Bundler::LockfileError, "Gemfile.lock PLATFORMS section has no following section" unless next_section_index
773
+
774
+ normalized_section = ["PLATFORMS\n", *platforms.map { |platform| " #{platform}\n" }, "\n"]
775
+ return {changed: false, platforms: platforms} if lines[platforms_index...next_section_index] == normalized_section
776
+
777
+ # Bundler exposes a parser but no public platform-only writer. Keep the
778
+ # locked dependency graph byte-for-byte intact while rewriting this
779
+ # validated, line-oriented section.
780
+ lines[platforms_index...next_section_index] = normalized_section
781
+ File.write(lock_path, lines.join)
782
+ {changed: true, platforms: platforms}
783
+ end
784
+
785
+ def skipped_lockfile_normalization_step(name, reason)
786
+ {name: name, status: "skipped", reason: reason}
787
+ end
788
+
789
+ def lockfile_normalization_command(project_root)
790
+ platforms = lockfile_normalization_platforms(project_root)
791
+ ["bundle", "lock", *platforms.map { |platform| "--add-platform=#{platform}" }, "--update"]
792
+ end
793
+
794
+ def lockfile_normalization_platforms(project_root)
795
+ lock_path = File.join(project_root.to_s, "Gemfile.lock")
796
+ existing = Bundler::LockfileParser.new(Bundler.read_file(lock_path)).platforms.map(&:to_s)
797
+ (existing + [Gem::Platform.local.to_s]).reject(&:empty?).uniq.sort
798
+ rescue Bundler::LockfileError, Errno::ENOENT
799
+ [Gem::Platform.local.to_s]
750
800
  end
751
801
 
752
802
  def distinct_bundle_install_step(project_root, env:, setup_env:)
@@ -1152,6 +1202,8 @@ module Kettle
1152
1202
  execute_ready_command_step(step, project_root: project_root, env: env, quiet: quiet, command_runner: command_runner)
1153
1203
  when "bundle_lock_normalization"
1154
1204
  execute_ready_command_step(step, project_root: project_root, env: env, quiet: quiet, command_runner: command_runner)
1205
+ when "lockfile_platform_normalization"
1206
+ execute_lockfile_platform_normalization_step(step, project_root: project_root)
1155
1207
  when "rubocop_lts_local_branch"
1156
1208
  execute_ready_command_step(step, project_root: project_root, env: env, quiet: quiet, command_runner: command_runner)
1157
1209
  when "bundle_install_requested_env"
@@ -1174,6 +1226,19 @@ module Kettle
1174
1226
  end
1175
1227
  end
1176
1228
 
1229
+ def execute_lockfile_platform_normalization_step(step, project_root:)
1230
+ return step unless step.fetch(:status) == "ready"
1231
+
1232
+ result = normalize_lockfile_platforms(project_root)
1233
+ step.merge(
1234
+ status: "succeeded",
1235
+ reason: result.fetch(:changed) ? "local_platform_added" : "local_platform_already_present",
1236
+ platforms: result.fetch(:platforms)
1237
+ )
1238
+ rescue Bundler::LockfileError, Errno::ENOENT => error
1239
+ step.merge(status: "failed", reason: "lockfile_platform_normalization_failed", stderr: error.message)
1240
+ end
1241
+
1177
1242
  def setup_command_env(project_root, env)
1178
1243
  command_env = (env || {}).to_h.dup
1179
1244
  templating_requested = command_env.fetch("K_JEM_TEMPLATING", "false").casecmp("true").zero?
@@ -23,9 +23,10 @@ module Kettle
23
23
  setup_env = Kettle::Jem::Tasks::InstallTask.setup_command_env(project_root, env)
24
24
  hook_step = Kettle::Jem::Tasks::InstallTask.hook_templates_step(project_root, effective_run_options)
25
25
  git_drivers_step = Kettle::Jem::Tasks::InstallTask.git_drivers_step(project_root, effective_run_options)
26
+ platform_step = Kettle::Jem::Tasks::InstallTask.normalize_lockfile_platforms_step(project_root, env: setup_env, run_options: effective_run_options)
26
27
  lock_step = Kettle::Jem::Tasks::InstallTask.normalize_lockfile_step(project_root, env: setup_env, run_options: effective_run_options)
27
28
  template_steps = Kettle::Jem::Tasks::InstallTask.execute_orchestration_steps(
28
- [hook_step, git_drivers_step, lock_step],
29
+ [hook_step, git_drivers_step, platform_step, lock_step],
29
30
  project_root: project_root,
30
31
  env: setup_env,
31
32
  run_options: effective_run_options,
@@ -118,7 +118,7 @@ Gem::Specification.new do |spec|
118
118
  # and preferably a modular one (see gemfiles/modular/*.gemfile).
119
119
 
120
120
  # Dev, Test, & Release Tasks
121
- spec.add_development_dependency("kettle-dev", "~> 3.0", ">= 3.0.17") # ruby >= {KJ|MIN_TEST_RUBY}
121
+ spec.add_development_dependency("kettle-dev", "~> 3.0", ">= 3.0.24") # ruby >= {KJ|MIN_TEST_RUBY}
122
122
 
123
123
  # Security
124
124
  spec.add_development_dependency("bundler-audit", "~> 0.9.3") # ruby >= 2.0.0
@@ -132,7 +132,7 @@ Gem::Specification.new do |spec|
132
132
  # Testing
133
133
  # Loads version files in anonymous namespaces for coverage without constant redefinition warnings.
134
134
  spec.add_development_dependency("anonymous_loader", "~> 0.1", ">= 0.1.3") # ruby >= 2.2.0
135
- spec.add_development_dependency("appraisal2", "~> 3.2", ">= 3.2.2") # ruby >= 1.8.7, for testing against multiple versions of dependencies
135
+ spec.add_development_dependency("appraisal2", "~> 3.2", ">= 3.2.3") # ruby >= 1.8.7, for testing against multiple versions of dependencies
136
136
  spec.add_development_dependency("kettle-test", "~> 2.0", ">= 2.0.21") # ruby >= {KJ|MIN_TEST_RUBY}
137
137
  spec.add_development_dependency("turbo_tests2", "~> 3.2", ">= 3.2.7") # ruby >= 2.4.0, default kettle-test runner
138
138
 
@@ -12,7 +12,7 @@
12
12
  gem "reek", "~> 6.5", ">= 6.5.0"
13
13
 
14
14
  platform :mri do
15
- gem "appraisal2-rubocop", "~> 1.0", ">= 1.0.1", require: false
15
+ gem "appraisal2-rubocop", "~> 1.0", ">= 1.0.2", require: false
16
16
  gem "rubocop-gradual", "~> 0.4", ">= 0.4.0"
17
17
  gem "rubocop-minitest", "~> 0.40", ">= 0.40.0"
18
18
  gem "rubocop-on-rbs", "~> 2.0", ">= 2.0.0" # ruby >= 3.2.0
@@ -30,7 +30,7 @@ Gem::Specification.new do |spec|
30
30
  spec.add_dependency "{KJ|SHIMMED_GEM_NAME}"
31
31
 
32
32
  # Dev, Test, & Release Tasks
33
- spec.add_development_dependency("kettle-dev", "~> 3.0", ">= 3.0.17") # ruby >= {KJ|MIN_TEST_RUBY}
33
+ spec.add_development_dependency("kettle-dev", "~> 3.0", ">= 3.0.24") # ruby >= {KJ|MIN_TEST_RUBY}
34
34
 
35
35
  # Tasks
36
36
  spec.add_development_dependency "rake", "~> 13.0"
@@ -5,7 +5,7 @@ module Kettle
5
5
  # Version namespace for this gem.
6
6
  module Version
7
7
  # Current gem version.
8
- VERSION = "7.1.11"
8
+ VERSION = "7.1.13"
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/jem.rb CHANGED
@@ -102,6 +102,24 @@ module Kettle
102
102
  ].freeze
103
103
  PACKAGED_TEMPLATE_ROOT = File.expand_path("jem/templates", __dir__)
104
104
  TRANSFER_CHANGELOG_TEMPLATE_PATH = "CHANGELOG.transfer.md"
105
+ TRANSFER_CHANGELOG_FILTER_FIELD_TYPES = {
106
+ "profile" => :enum,
107
+ "topology" => :enum,
108
+ "ruby.min" => :version,
109
+ "engine.jruby" => :boolean,
110
+ "engine.truffleruby" => :boolean,
111
+ "engine.alternates" => :boolean,
112
+ "feature.appraisals" => :boolean,
113
+ "feature.rubyforum" => :boolean,
114
+ "feature.rubyforum_project_tag" => :boolean,
115
+ "feature.corporate_sponsors" => :boolean,
116
+ "feature.organization_logo" => :boolean,
117
+ "feature.structuredmerge_driver" => :boolean,
118
+ "feature.dedicated_version_gem" => :boolean,
119
+ "workflow.dep_heads" => :boolean,
120
+ "workflow.jruby_94" => :boolean,
121
+ "version_gem.mode" => :enum
122
+ }.freeze
105
123
  COPY_ONLY_WHEN_MISSING_TEMPLATE_PATHS = %w[REEK bin/setup].freeze
106
124
  MONOREPO_ROOT_TEMPLATE_PROFILE = "monorepo-root"
107
125
  MONOREPO_SUBGEM_PACKAGE_TEMPLATE_PROFILE = "monorepo-subgem-package"
@@ -3525,6 +3543,7 @@ module Kettle
3525
3543
  provider: "github_actions",
3526
3544
  default_branch: "main",
3527
3545
  exec_cmd: github_actions_exec_cmd(kettle_config, env),
3546
+ engine_exec_cmds: github_actions_engine_exec_cmds(kettle_config),
3528
3547
  recording: project_recording_enabled?(project_root, kettle_config),
3529
3548
  ruby_versions: github_actions_ruby_versions(project_runtime.fetch(:test_min_ruby)),
3530
3549
  test_min_ruby: project_runtime.fetch(:test_min_ruby).to_s,
@@ -4168,9 +4187,32 @@ module Kettle
4168
4187
  if report.fetch(:relative_path).to_s == "spec/spec_helper.rb"
4169
4188
  payload[:spec_helper_template_policy_fingerprint_version] = SPEC_HELPER_TEMPLATE_POLICY_FINGERPRINT_VERSION
4170
4189
  end
4190
+ if report.fetch(:relative_path).to_s.start_with?(".github/workflows/")
4191
+ engine_exec_cmds = github_workflow_engine_exec_cmds_for_template(
4192
+ source_path,
4193
+ report.dig(:request_envelope, :request, :runtime_context, :ci, :engine_exec_cmds) ||
4194
+ report.dig(:request_envelope, :request, :runtime_context, "ci", "engine_exec_cmds") ||
4195
+ {}
4196
+ )
4197
+ payload[:github_workflow_engine_exec_cmds] = engine_exec_cmds unless engine_exec_cmds.empty?
4198
+ end
4171
4199
  payload
4172
4200
  end
4173
4201
 
4202
+ def github_workflow_engine_exec_cmds_for_template(source_path, overrides)
4203
+ return {} unless source_path && File.file?(source_path)
4204
+
4205
+ configured = stringify_keys_for_json(overrides)
4206
+ return {} if configured.empty?
4207
+
4208
+ yaml_mapping_nodes(File.read(source_path)).each_with_object({}) do |mapping, matching|
4209
+ engine = yaml_mapping_scalar_value(mapping, "ruby")
4210
+ matching[engine] = configured[engine] if configured.key?(engine)
4211
+ end
4212
+ rescue Psych::Exception
4213
+ {}
4214
+ end
4215
+
4174
4216
  def version_namespace_template_file?(relative_path)
4175
4217
  basename = File.basename(relative_path.to_s)
4176
4218
  basename == "version.rb" || basename == "version_gem.rb" || basename.end_with?(".gemspec")
@@ -4476,6 +4518,7 @@ module Kettle
4476
4518
  chunks.fetch(offset % chunks.length) << job
4477
4519
  end
4478
4520
  chunks.reject(&:empty?).flat_map do |chunk|
4521
+ # rubocop:disable ThreadSafety/NewThread -- Bounded workers only read shared inputs and are joined below.
4479
4522
  Thread.new do
4480
4523
  thread_id = Thread.current.object_id
4481
4524
  chunk.map do |recipe, index|
@@ -4495,6 +4538,7 @@ module Kettle
4495
4538
  [index, report]
4496
4539
  end
4497
4540
  end
4541
+ # rubocop:enable ThreadSafety/NewThread
4498
4542
  end.flat_map(&:value).to_h
4499
4543
  end
4500
4544
 
@@ -5396,12 +5440,12 @@ module Kettle
5396
5440
 
5397
5441
  def monorepo_root_gemfile_dependency_lines
5398
5442
  [
5399
- {name: "appraisal2", source: %(gem "appraisal2", "~> 3.2", ">= 3.2.2"\n)},
5443
+ {name: "appraisal2", source: %(gem "appraisal2", "~> 3.2", ">= 3.2.3"\n)},
5400
5444
  {name: "bundler-audit", source: %(gem "bundler-audit", "~> 0.9.3"\n)},
5401
- {name: "kettle-dev", source: %(gem "kettle-dev", "~> 3.0", ">= 3.0.17"\n)},
5445
+ {name: "kettle-dev", source: %(gem "kettle-dev", "~> 3.0", ">= 3.0.24"\n)},
5402
5446
  {name: "kettle-drift", source: %(gem "kettle-drift", "~> 1.0", ">= 1.0.13"\n)},
5403
- {name: "kettle-family", source: %(gem "kettle-family", "~> 1.2", ">= 1.2.64"\n)},
5404
- {name: "kettle-jem", source: %(gem "kettle-jem", "~> 7.1", ">= 7.1.10"\n)},
5447
+ {name: "kettle-family", source: %(gem "kettle-family", "~> 1.2", ">= 1.2.74"\n)},
5448
+ {name: "kettle-jem", source: %(gem "kettle-jem", "~> 7.1", ">= 7.1.12"\n)},
5405
5449
  {name: "kettle-test", source: %(gem "kettle-test", "~> 2.0", ">= 2.0.21"\n)},
5406
5450
  {name: "rake", source: %(gem "rake", "~> 13.0"\n)},
5407
5451
  {name: "rspec", source: %(gem "rspec", "~> 3.0"\n)},
@@ -6322,24 +6366,7 @@ module Kettle
6322
6366
  end
6323
6367
 
6324
6368
  def transfer_changelog_filter_field_types
6325
- @transfer_changelog_filter_field_types ||= {
6326
- "profile" => :enum,
6327
- "topology" => :enum,
6328
- "ruby.min" => :version,
6329
- "engine.jruby" => :boolean,
6330
- "engine.truffleruby" => :boolean,
6331
- "engine.alternates" => :boolean,
6332
- "feature.appraisals" => :boolean,
6333
- "feature.rubyforum" => :boolean,
6334
- "feature.rubyforum_project_tag" => :boolean,
6335
- "feature.corporate_sponsors" => :boolean,
6336
- "feature.organization_logo" => :boolean,
6337
- "feature.structuredmerge_driver" => :boolean,
6338
- "feature.dedicated_version_gem" => :boolean,
6339
- "workflow.dep_heads" => :boolean,
6340
- "workflow.jruby_94" => :boolean,
6341
- "version_gem.mode" => :enum
6342
- }.freeze
6369
+ TRANSFER_CHANGELOG_FILTER_FIELD_TYPES
6343
6370
  end
6344
6371
 
6345
6372
  def transfer_changelog_filter_predicate_applies?(type, actual, operator, expected)
@@ -6425,11 +6452,13 @@ module Kettle
6425
6452
  end
6426
6453
 
6427
6454
  def changelog_transfer_line_parser
6428
- @changelog_transfer_line_parser ||= TransferChangelogLineParser.new
6455
+ Thread.current.thread_variable_get(:kettle_jem_transfer_changelog_line_parser) ||
6456
+ Thread.current.thread_variable_set(:kettle_jem_transfer_changelog_line_parser, TransferChangelogLineParser.new)
6429
6457
  end
6430
6458
 
6431
6459
  def changelog_transfer_filter_parser
6432
- @changelog_transfer_filter_parser ||= TransferChangelogFilterParser.new
6460
+ Thread.current.thread_variable_get(:kettle_jem_transfer_changelog_filter_parser) ||
6461
+ Thread.current.thread_variable_set(:kettle_jem_transfer_changelog_filter_parser, TransferChangelogFilterParser.new)
6433
6462
  end
6434
6463
 
6435
6464
  def changelog_transfer_list_item_payload(source)
@@ -9056,7 +9085,30 @@ module Kettle
9056
9085
  end
9057
9086
 
9058
9087
  def finalize_github_workflow_template(content, facts = nil)
9059
- inject_framework_matrix_workflow_env(update_github_actions_pins(content), facts)
9088
+ output = apply_github_actions_engine_exec_cmd_overrides(content, facts)
9089
+ inject_framework_matrix_workflow_env(update_github_actions_pins(output), facts)
9090
+ end
9091
+
9092
+ def apply_github_actions_engine_exec_cmd_overrides(content, facts)
9093
+ overrides = facts.to_h.dig(:ci, :engine_exec_cmds).to_h
9094
+ return content if overrides.empty?
9095
+
9096
+ lines = content.to_s.lines
9097
+ yaml_mapping_nodes(content).sort_by { |mapping| -mapping.start_line }.each do |mapping|
9098
+ engine = yaml_mapping_scalar_value(mapping, "ruby")
9099
+ command = overrides[engine]
9100
+ next if command.to_s.empty?
9101
+
9102
+ exec_cmd_node = yaml_mapping_scalar_node(mapping, "exec_cmd")
9103
+ next unless exec_cmd_node
9104
+
9105
+ line_index = exec_cmd_node.start_line
9106
+ indent = lines.fetch(line_index).to_s.match(/\A(\s*)/)[1]
9107
+ lines[line_index] = "#{indent}exec_cmd: #{yaml_double_quoted_scalar(command)}\n"
9108
+ end
9109
+ lines.join
9110
+ rescue Psych::Exception
9111
+ content
9060
9112
  end
9061
9113
 
9062
9114
  def inject_framework_matrix_workflow_env(content, facts)
@@ -9075,7 +9127,7 @@ module Kettle
9075
9127
  next unless insert_index
9076
9128
 
9077
9129
  indent = workflow_matrix_env_indent(lines, mapping)
9078
- additions = matrix_env.reject { |key, _value| yaml_mapping_scalar_value(mapping, key) }
9130
+ additions = matrix_env.reject { |key, _value| yaml_mapping_scalar_node(mapping, key) }
9079
9131
  additions.reject! { |key, _value| inserted_locations.include?([insert_index, key.to_s]) }
9080
9132
  next if additions.empty?
9081
9133
 
@@ -9164,21 +9216,25 @@ module Kettle
9164
9216
  end
9165
9217
 
9166
9218
  def prune_workflow_matrix_item?(mapping, minimum)
9167
- ruby = yaml_mapping_scalar_value(mapping, "ruby")
9168
- return true if ruby && Gem::Version.new(ruby) < minimum
9219
+ ruby = yaml_mapping_scalar_value(mapping, "ruby").to_s.strip
9220
+ return true if !ruby.empty? && Gem::Version.new(ruby) < minimum
9169
9221
 
9170
- appraisal_ruby_version = appraisal_ruby_version(yaml_mapping_scalar_value(mapping, "appraisal"))
9171
- appraisal_ruby_version && Gem::Version.new(appraisal_ruby_version) < minimum
9222
+ appraisal_ruby = appraisal_ruby_version(yaml_mapping_scalar_value(mapping, "appraisal")).to_s.strip
9223
+ !appraisal_ruby.empty? && Gem::Version.new(appraisal_ruby) < minimum
9172
9224
  rescue ArgumentError
9173
9225
  false
9174
9226
  end
9175
9227
 
9176
9228
  def yaml_mapping_scalar_value(mapping, key)
9229
+ yaml_mapping_scalar_node(mapping, key)&.value.to_s
9230
+ end
9231
+
9232
+ def yaml_mapping_scalar_node(mapping, key)
9177
9233
  mapping.children.each_slice(2) do |key_node, value_node|
9178
9234
  next unless key_node.is_a?(Psych::Nodes::Scalar) && key_node.value.to_s == key.to_s
9179
9235
  next unless value_node.is_a?(Psych::Nodes::Scalar)
9180
9236
 
9181
- return value_node.value.to_s
9237
+ return value_node
9182
9238
  end
9183
9239
  nil
9184
9240
  end
@@ -13796,7 +13852,9 @@ module Kettle
13796
13852
 
13797
13853
  def commit_file_work_units_thread(file_work_units, workers:)
13798
13854
  distribute_file_work_units(file_work_units, workers).map do |chunk|
13855
+ # rubocop:disable ThreadSafety/NewThread -- Independent file units are joined before this method returns.
13799
13856
  Thread.new { chunk.each { |file_work_unit| commit_file_work_unit(file_work_unit) } }
13857
+ # rubocop:enable ThreadSafety/NewThread
13800
13858
  end.each(&:join)
13801
13859
  end
13802
13860
 
@@ -14239,7 +14297,7 @@ module Kettle
14239
14297
  root: ["src", "my", "kettle-dev"]
14240
14298
  )
14241
14299
  elsif Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("4.0.0")
14242
- gem "kettle-changelog", "~> 1.0", ">= 1.0.6"
14300
+ gem "kettle-changelog", "~> 1.0", ">= 1.0.7"
14243
14301
  end
14244
14302
  end
14245
14303
  RUBY
@@ -14951,18 +15009,30 @@ module Kettle
14951
15009
  return [] unless project_root && gemspec_metadata.is_a?(Hash)
14952
15010
 
14953
15011
  sibling_root = File.expand_path("..", project_root.to_s)
14954
- dependencies = Array(
14955
- gemspec_metadata[:runtime_dependencies] || gemspec_metadata["runtime_dependencies"]
14956
- )
14957
- dependencies.each_with_object([]) do |dependency, names|
14958
- name = dependency.respond_to?(:name) ? dependency.name.to_s : dependency.to_s
14959
- next if name.empty? || name == package_name.to_s
14960
- next unless direct_sibling_directory_defines_gem?(File.join(sibling_root, name), name)
14961
- next if Array(local_modular_eval_paths[name]).any?
14962
- next if names.include?(name)
15012
+ excluded = [package_name.to_s, *local_modular_eval_paths.keys.map(&:to_s)]
15013
+ pending = gemspec_runtime_dependency_names(gemspec_metadata)
15014
+ discovered = []
14963
15015
 
14964
- names << name
15016
+ until pending.empty?
15017
+ name = pending.shift.to_s
15018
+ next if name.empty? || discovered.include?(name)
15019
+
15020
+ sibling_path = File.join(sibling_root, name)
15021
+ next unless direct_sibling_directory_defines_gem?(sibling_path, name)
15022
+
15023
+ discovered << name
15024
+ sibling_metadata = sibling_gemspec_metadata(sibling_path, name)
15025
+ pending.concat(gemspec_runtime_dependency_names(sibling_metadata))
15026
+ end
15027
+
15028
+ discovered.reject { |name| excluded.include?(name) }
15029
+ end
15030
+
15031
+ def sibling_gemspec_metadata(sibling_path, gem_name)
15032
+ gemspec_path = Dir.glob(File.join(sibling_path, "*.gemspec")).find do |path|
15033
+ metadata_value(static_project_gemspec_metadata(path), :gem_name).to_s == gem_name.to_s
14965
15034
  end
15035
+ gemspec_path ? static_project_gemspec_metadata(gemspec_path) : {}
14966
15036
  end
14967
15037
 
14968
15038
  def local_modular_runtime_eval_paths(project_root, gemspec_metadata, package_name:)
@@ -15263,7 +15333,7 @@ module Kettle
15263
15333
  def main_gemfile_kettle_family_gem(package_name)
15264
15334
  return "" if package_name.to_s == "kettle-family"
15265
15335
 
15266
- %(gem "kettle-family", "~> 1.2", ">= 1.2.64"\n)
15336
+ %(gem "kettle-family", "~> 1.2", ">= 1.2.74"\n)
15267
15337
  end
15268
15338
 
15269
15339
  def main_gemfile_nomono_bootstrap(package_name)
@@ -18987,6 +19057,23 @@ module Kettle
18987
19057
  )
18988
19058
  end
18989
19059
 
19060
+ # A generated workflow normally uses one command for every matrix entry.
19061
+ # Legacy engines occasionally need a narrower command while retaining the
19062
+ # rest of the generated workflow (setup, retries, cache keys, and pins).
19063
+ def github_actions_engine_exec_cmds(config)
19064
+ workflows = config["workflows"]
19065
+ return {} unless workflows.is_a?(Hash)
19066
+
19067
+ raw = workflows["engine_exec_cmds"]
19068
+ return {} unless raw.is_a?(Hash)
19069
+
19070
+ raw.each_with_object({}) do |(engine, command), overrides|
19071
+ engine_name = engine.to_s.strip
19072
+ command_text = command.to_s.strip
19073
+ overrides[engine_name] = command_text unless engine_name.empty? || command_text.empty?
19074
+ end
19075
+ end
19076
+
18990
19077
  def normalize_github_actions_exec_cmd(command)
18991
19078
  normalized = command.to_s.strip
18992
19079
  return "kettle-test" if OBSOLETE_APPRAISAL_SPEC_EXEC_CMDS.include?(normalized)
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kettle-jem
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.1.11
4
+ version: 7.1.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -66,7 +66,7 @@ dependencies:
66
66
  version: '7.1'
67
67
  - - ">="
68
68
  - !ruby/object:Gem::Version
69
- version: 7.1.4
69
+ version: 7.1.6
70
70
  type: :runtime
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
@@ -76,7 +76,7 @@ dependencies:
76
76
  version: '7.1'
77
77
  - - ">="
78
78
  - !ruby/object:Gem::Version
79
- version: 7.1.4
79
+ version: 7.1.6
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: ast-crispr-ruby-prism
82
82
  requirement: !ruby/object:Gem::Requirement
@@ -86,7 +86,7 @@ dependencies:
86
86
  version: '7.1'
87
87
  - - ">="
88
88
  - !ruby/object:Gem::Version
89
- version: 7.1.4
89
+ version: 7.1.6
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
@@ -96,7 +96,7 @@ dependencies:
96
96
  version: '7.1'
97
97
  - - ">="
98
98
  - !ruby/object:Gem::Version
99
- version: 7.1.4
99
+ version: 7.1.6
100
100
  - !ruby/object:Gem::Dependency
101
101
  name: ast-merge
102
102
  requirement: !ruby/object:Gem::Requirement
@@ -106,7 +106,7 @@ dependencies:
106
106
  version: '7.1'
107
107
  - - ">="
108
108
  - !ruby/object:Gem::Version
109
- version: 7.1.4
109
+ version: 7.1.6
110
110
  type: :runtime
111
111
  prerelease: false
112
112
  version_requirements: !ruby/object:Gem::Requirement
@@ -116,7 +116,7 @@ dependencies:
116
116
  version: '7.1'
117
117
  - - ">="
118
118
  - !ruby/object:Gem::Version
119
- version: 7.1.4
119
+ version: 7.1.6
120
120
  - !ruby/object:Gem::Dependency
121
121
  name: bash-merge
122
122
  requirement: !ruby/object:Gem::Requirement
@@ -126,7 +126,7 @@ dependencies:
126
126
  version: '7.1'
127
127
  - - ">="
128
128
  - !ruby/object:Gem::Version
129
- version: 7.1.4
129
+ version: 7.1.6
130
130
  type: :runtime
131
131
  prerelease: false
132
132
  version_requirements: !ruby/object:Gem::Requirement
@@ -136,7 +136,7 @@ dependencies:
136
136
  version: '7.1'
137
137
  - - ">="
138
138
  - !ruby/object:Gem::Version
139
- version: 7.1.4
139
+ version: 7.1.6
140
140
  - !ruby/object:Gem::Dependency
141
141
  name: citrus-toml-merge
142
142
  requirement: !ruby/object:Gem::Requirement
@@ -146,7 +146,7 @@ dependencies:
146
146
  version: '7.1'
147
147
  - - ">="
148
148
  - !ruby/object:Gem::Version
149
- version: 7.1.4
149
+ version: 7.1.6
150
150
  type: :runtime
151
151
  prerelease: false
152
152
  version_requirements: !ruby/object:Gem::Requirement
@@ -156,7 +156,7 @@ dependencies:
156
156
  version: '7.1'
157
157
  - - ">="
158
158
  - !ruby/object:Gem::Version
159
- version: 7.1.4
159
+ version: 7.1.6
160
160
  - !ruby/object:Gem::Dependency
161
161
  name: commonmarker-merge
162
162
  requirement: !ruby/object:Gem::Requirement
@@ -166,7 +166,7 @@ dependencies:
166
166
  version: '7.1'
167
167
  - - ">="
168
168
  - !ruby/object:Gem::Version
169
- version: 7.1.4
169
+ version: 7.1.6
170
170
  type: :runtime
171
171
  prerelease: false
172
172
  version_requirements: !ruby/object:Gem::Requirement
@@ -176,7 +176,7 @@ dependencies:
176
176
  version: '7.1'
177
177
  - - ">="
178
178
  - !ruby/object:Gem::Version
179
- version: 7.1.4
179
+ version: 7.1.6
180
180
  - !ruby/object:Gem::Dependency
181
181
  name: dotenv-merge
182
182
  requirement: !ruby/object:Gem::Requirement
@@ -186,7 +186,7 @@ dependencies:
186
186
  version: '7.1'
187
187
  - - ">="
188
188
  - !ruby/object:Gem::Version
189
- version: 7.1.4
189
+ version: 7.1.6
190
190
  type: :runtime
191
191
  prerelease: false
192
192
  version_requirements: !ruby/object:Gem::Requirement
@@ -196,7 +196,7 @@ dependencies:
196
196
  version: '7.1'
197
197
  - - ">="
198
198
  - !ruby/object:Gem::Version
199
- version: 7.1.4
199
+ version: 7.1.6
200
200
  - !ruby/object:Gem::Dependency
201
201
  name: json-merge
202
202
  requirement: !ruby/object:Gem::Requirement
@@ -206,7 +206,7 @@ dependencies:
206
206
  version: '7.1'
207
207
  - - ">="
208
208
  - !ruby/object:Gem::Version
209
- version: 7.1.4
209
+ version: 7.1.6
210
210
  type: :runtime
211
211
  prerelease: false
212
212
  version_requirements: !ruby/object:Gem::Requirement
@@ -216,7 +216,7 @@ dependencies:
216
216
  version: '7.1'
217
217
  - - ">="
218
218
  - !ruby/object:Gem::Version
219
- version: 7.1.4
219
+ version: 7.1.6
220
220
  - !ruby/object:Gem::Dependency
221
221
  name: kettle-changelog
222
222
  requirement: !ruby/object:Gem::Requirement
@@ -326,7 +326,7 @@ dependencies:
326
326
  version: '7.1'
327
327
  - - ">="
328
328
  - !ruby/object:Gem::Version
329
- version: 7.1.4
329
+ version: 7.1.6
330
330
  type: :runtime
331
331
  prerelease: false
332
332
  version_requirements: !ruby/object:Gem::Requirement
@@ -336,7 +336,7 @@ dependencies:
336
336
  version: '7.1'
337
337
  - - ">="
338
338
  - !ruby/object:Gem::Version
339
- version: 7.1.4
339
+ version: 7.1.6
340
340
  - !ruby/object:Gem::Dependency
341
341
  name: markdown-merge
342
342
  requirement: !ruby/object:Gem::Requirement
@@ -346,7 +346,7 @@ dependencies:
346
346
  version: '7.1'
347
347
  - - ">="
348
348
  - !ruby/object:Gem::Version
349
- version: 7.1.4
349
+ version: 7.1.6
350
350
  type: :runtime
351
351
  prerelease: false
352
352
  version_requirements: !ruby/object:Gem::Requirement
@@ -356,7 +356,7 @@ dependencies:
356
356
  version: '7.1'
357
357
  - - ">="
358
358
  - !ruby/object:Gem::Version
359
- version: 7.1.4
359
+ version: 7.1.6
360
360
  - !ruby/object:Gem::Dependency
361
361
  name: markly-merge
362
362
  requirement: !ruby/object:Gem::Requirement
@@ -366,7 +366,7 @@ dependencies:
366
366
  version: '7.1'
367
367
  - - ">="
368
368
  - !ruby/object:Gem::Version
369
- version: 7.1.4
369
+ version: 7.1.6
370
370
  type: :runtime
371
371
  prerelease: false
372
372
  version_requirements: !ruby/object:Gem::Requirement
@@ -376,7 +376,7 @@ dependencies:
376
376
  version: '7.1'
377
377
  - - ">="
378
378
  - !ruby/object:Gem::Version
379
- version: 7.1.4
379
+ version: 7.1.6
380
380
  - !ruby/object:Gem::Dependency
381
381
  name: parslet
382
382
  requirement: !ruby/object:Gem::Requirement
@@ -400,7 +400,7 @@ dependencies:
400
400
  version: '7.1'
401
401
  - - ">="
402
402
  - !ruby/object:Gem::Version
403
- version: 7.1.4
403
+ version: 7.1.6
404
404
  type: :runtime
405
405
  prerelease: false
406
406
  version_requirements: !ruby/object:Gem::Requirement
@@ -410,7 +410,7 @@ dependencies:
410
410
  version: '7.1'
411
411
  - - ">="
412
412
  - !ruby/object:Gem::Version
413
- version: 7.1.4
413
+ version: 7.1.6
414
414
  - !ruby/object:Gem::Dependency
415
415
  name: psych-merge
416
416
  requirement: !ruby/object:Gem::Requirement
@@ -420,7 +420,7 @@ dependencies:
420
420
  version: '7.1'
421
421
  - - ">="
422
422
  - !ruby/object:Gem::Version
423
- version: 7.1.4
423
+ version: 7.1.6
424
424
  type: :runtime
425
425
  prerelease: false
426
426
  version_requirements: !ruby/object:Gem::Requirement
@@ -430,7 +430,7 @@ dependencies:
430
430
  version: '7.1'
431
431
  - - ">="
432
432
  - !ruby/object:Gem::Version
433
- version: 7.1.4
433
+ version: 7.1.6
434
434
  - !ruby/object:Gem::Dependency
435
435
  name: rbs
436
436
  requirement: !ruby/object:Gem::Requirement
@@ -454,7 +454,7 @@ dependencies:
454
454
  version: '7.1'
455
455
  - - ">="
456
456
  - !ruby/object:Gem::Version
457
- version: 7.1.4
457
+ version: 7.1.6
458
458
  type: :runtime
459
459
  prerelease: false
460
460
  version_requirements: !ruby/object:Gem::Requirement
@@ -464,7 +464,7 @@ dependencies:
464
464
  version: '7.1'
465
465
  - - ">="
466
466
  - !ruby/object:Gem::Version
467
- version: 7.1.4
467
+ version: 7.1.6
468
468
  - !ruby/object:Gem::Dependency
469
469
  name: ruby-merge
470
470
  requirement: !ruby/object:Gem::Requirement
@@ -474,7 +474,7 @@ dependencies:
474
474
  version: '7.1'
475
475
  - - ">="
476
476
  - !ruby/object:Gem::Version
477
- version: 7.1.4
477
+ version: 7.1.6
478
478
  type: :runtime
479
479
  prerelease: false
480
480
  version_requirements: !ruby/object:Gem::Requirement
@@ -484,7 +484,7 @@ dependencies:
484
484
  version: '7.1'
485
485
  - - ">="
486
486
  - !ruby/object:Gem::Version
487
- version: 7.1.4
487
+ version: 7.1.6
488
488
  - !ruby/object:Gem::Dependency
489
489
  name: token-resolver
490
490
  requirement: !ruby/object:Gem::Requirement
@@ -514,7 +514,7 @@ dependencies:
514
514
  version: '7.1'
515
515
  - - ">="
516
516
  - !ruby/object:Gem::Version
517
- version: 7.1.4
517
+ version: 7.1.6
518
518
  type: :runtime
519
519
  prerelease: false
520
520
  version_requirements: !ruby/object:Gem::Requirement
@@ -524,7 +524,7 @@ dependencies:
524
524
  version: '7.1'
525
525
  - - ">="
526
526
  - !ruby/object:Gem::Version
527
- version: 7.1.4
527
+ version: 7.1.6
528
528
  - !ruby/object:Gem::Dependency
529
529
  name: toml-rb
530
530
  requirement: !ruby/object:Gem::Requirement
@@ -548,7 +548,7 @@ dependencies:
548
548
  version: '7.1'
549
549
  - - ">="
550
550
  - !ruby/object:Gem::Version
551
- version: 7.1.4
551
+ version: 7.1.6
552
552
  type: :runtime
553
553
  prerelease: false
554
554
  version_requirements: !ruby/object:Gem::Requirement
@@ -558,7 +558,7 @@ dependencies:
558
558
  version: '7.1'
559
559
  - - ">="
560
560
  - !ruby/object:Gem::Version
561
- version: 7.1.4
561
+ version: 7.1.6
562
562
  - !ruby/object:Gem::Dependency
563
563
  name: yaml-merge
564
564
  requirement: !ruby/object:Gem::Requirement
@@ -568,7 +568,7 @@ dependencies:
568
568
  version: '7.1'
569
569
  - - ">="
570
570
  - !ruby/object:Gem::Version
571
- version: 7.1.4
571
+ version: 7.1.6
572
572
  type: :runtime
573
573
  prerelease: false
574
574
  version_requirements: !ruby/object:Gem::Requirement
@@ -578,7 +578,7 @@ dependencies:
578
578
  version: '7.1'
579
579
  - - ">="
580
580
  - !ruby/object:Gem::Version
581
- version: 7.1.4
581
+ version: 7.1.6
582
582
  - !ruby/object:Gem::Dependency
583
583
  name: bundler-audit
584
584
  requirement: !ruby/object:Gem::Requirement
@@ -976,10 +976,10 @@ licenses:
976
976
  - PolyForm-Small-Business-1.0.0
977
977
  metadata:
978
978
  homepage_uri: https://structuredmerge.org
979
- source_code_uri: https://github.com/structuredmerge/structuredmerge-ruby/tree/v7.1.11
980
- changelog_uri: https://github.com/structuredmerge/structuredmerge-ruby/blob/v7.1.11/CHANGELOG.md
979
+ source_code_uri: https://github.com/structuredmerge/structuredmerge-ruby/tree/v7.1.13
980
+ changelog_uri: https://github.com/structuredmerge/structuredmerge-ruby/blob/v7.1.13/CHANGELOG.md
981
981
  bug_tracker_uri: https://github.com/structuredmerge/structuredmerge-ruby/issues
982
- documentation_uri: https://www.rubydoc.info/gems/kettle-jem/7.1.11
982
+ documentation_uri: https://www.rubydoc.info/gems/kettle-jem/7.1.13
983
983
  funding_uri: https://github.com/sponsors/pboling
984
984
  wiki_uri: https://github.com/structuredmerge/structuredmerge-ruby/wiki
985
985
  news_uri: https://www.railsbling.com/tags/kettle-jem
metadata.gz.sig CHANGED
Binary file