diff --git a/.github/workflows/current.yml b/.github/workflows/current.yml
index 1d2ae8bda..8ffe7131e 100644
--- a/.github/workflows/current.yml
+++ b/.github/workflows/current.yml
@@ -112,7 +112,6 @@ jobs:
working-directory: ${{ matrix.gem }}
env:
K_JEM_TEMPLATING: true
- SMORG_RB_DEV: ${{ github.workspace }}/gems
STRUCTUREDMERGE_DEV: ${{ github.workspace }}/gems
run: |
gem install nomono -v 1.0.8 --source https://gem.coop --source https://rubygems.org
@@ -124,7 +123,6 @@ jobs:
env:
K_JEM_TEMPLATING: true
K_SOUP_COV_DO: false
- SMORG_RB_DEV: ${{ github.workspace }}/gems
STRUCTUREDMERGE_DEV: ${{ github.workspace }}/gems
run: timeout 12m bundle exec kettle-test
@@ -163,12 +161,46 @@ jobs:
abort "RBS validation failed for #{failures.length} gem(s)" unless failures.empty?
'
+ tslp-cold-cache:
+ name: TSLP cold cache
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+ - name: Setup Ruby
+ uses: ruby/setup-ruby@9eb537ca036ebaed86729dcb9309076e4c5c3b74 # v1.314.0
+ with:
+ ruby-version: ruby
+ bundler-cache: false
+ - name: Install dependencies
+ working-directory: gems/tree_haver
+ env:
+ K_JEM_TEMPLATING: true
+ STRUCTUREDMERGE_DEV: ${{ github.workspace }}/gems
+ run: |
+ gem install nomono -v 1.0.8 --source https://gem.coop --source https://rubygems.org
+ bundle config set path vendor/bundle
+ bundle config set frozen false
+ bundle install --jobs 4
+ - name: Run cold-cache TSLP checks
+ working-directory: gems/tree_haver
+ env:
+ K_JEM_TEMPLATING: true
+ K_SOUP_COV_DO: false
+ STRUCTUREDMERGE_DEV: ${{ github.workspace }}/gems
+ run: |
+ set -euo pipefail
+ export TREE_SITTER_LANGUAGE_PACK_CACHE_DIR
+ TREE_SITTER_LANGUAGE_PACK_CACHE_DIR="$(mktemp -d "${RUNNER_TEMP}/tslp-cold-cache.XXXXXX")"
+ bundle exec rspec spec/grammar_finder_spec.rb spec/backends/tslp_spec.rb --format progress
+
check:
name: Check
needs:
- detect
- gem-suite
- rbs
+ - tslp-cold-cache
if: ${{ always() }}
runs-on: ubuntu-latest
steps:
@@ -179,12 +211,14 @@ jobs:
DETECT_RESULT: ${{ needs.detect.result }}
GEM_SUITE_RESULT: ${{ needs.gem-suite.result }}
RBS_RESULT: ${{ needs.rbs.result }}
+ TSLP_COLD_CACHE_RESULT: ${{ needs.tslp-cold-cache.result }}
run: |
set -euo pipefail
echo "Selected gem suites: ${SELECTED_GEMS}"
echo "Detect result: ${DETECT_RESULT}"
echo "Gem suite result: ${GEM_SUITE_RESULT}"
echo "RBS result: ${RBS_RESULT}"
+ echo "TSLP cold cache result: ${TSLP_COLD_CACHE_RESULT}"
if [[ "${DETECT_RESULT}" != "success" ]]; then
exit 1
@@ -192,6 +226,9 @@ jobs:
if [[ "${RBS_RESULT}" != "success" ]]; then
exit 1
fi
+ if [[ "${TSLP_COLD_CACHE_RESULT}" != "success" ]]; then
+ exit 1
+ fi
case "${GEM_SUITE_RESULT}" in
success|skipped)
diff --git a/.gitignore b/.gitignore
index 86fa757a6..47dfeb723 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,9 +4,10 @@
/.yardoc/
**/.yardoc/
**/_yardoc/
-/coverage/
+**/coverage/
/log/
/pkg/
+**/results/
/tmp/
/vendor/bundle/
.env.local
@@ -15,3 +16,4 @@
*.rbc
*.rspec_status
/.DS_Store
+TREE_HAVER_PLAN.md
diff --git a/.kettle-family.yml b/.kettle-family.yml
index caac1f1d3..398693343 100644
--- a/.kettle-family.yml
+++ b/.kettle-family.yml
@@ -115,7 +115,7 @@ release:
env:
GALTZO_FLOSS_DEV: false
KETTLE_RB_DEV: false
- SMORG_RB_DEV: false
+ STRUCTUREDMERGE_DEV: false
TSLP_DEV: ""
family_changelog:
enabled: true
diff --git a/CHANGELOG.md b/CHANGELOG.md
index eacea86c6..9e99e1f9d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -42,6 +42,9 @@ Please file a bug if you notice a violation of semantic versioning.
- Gems that use `tree_sitter_language_pack` now resolve it through the
StructuredMerge Ruby 4-compatible fork branch in their development Gemfiles
until an upstream Ruby 4-compatible release is available.
+- Structured merge gems now fail closed when no registered TreeHaver backend is
+ available instead of falling back to direct parser-library paths outside the
+ TreeHaver and ast-merge stack.
### Deprecated
diff --git a/Gemfile b/Gemfile
index aef99dcef..26178427d 100644
--- a/Gemfile
+++ b/Gemfile
@@ -2,6 +2,18 @@ kettle_rb_dev = ENV.fetch("KETTLE_RB_DEV", "false")
source "https://rubygems.org"
+tslp_dev = ENV.fetch("TSLP_DEV", nil)
+if tslp_dev.to_s.empty?
+ gem(
+ "tree_sitter_language_pack",
+ git: "https://github.com/structuredmerge/tree-sitter-language-pack.git",
+ branch: "fix/ruby-parser-api-methods",
+ glob: "packages/ruby/*.gemspec",
+ )
+else
+ gem "tree_sitter_language_pack", path: tslp_dev
+end
+
unless kettle_rb_dev.casecmp("false").zero?
require "nomono/bundler"
diff --git a/Gemfile.lock b/Gemfile.lock
index 15a0a7ce1..39c4925de 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,3 +1,13 @@
+GIT
+ remote: https://github.com/structuredmerge/tree-sitter-language-pack.git
+ revision: 85cac7836bb2f8cfcd3041a191b7bd11bf10924a
+ branch: fix/ruby-parser-api-methods
+ glob: packages/ruby/*.gemspec
+ specs:
+ tree_sitter_language_pack (1.12.5)
+ rb_sys (>= 0.9, < 0.9.128)
+ sorbet-runtime (~> 0.5)
+
PATH
remote: gems/ast-crispr-markdown-markly
specs:
@@ -11,7 +21,7 @@ PATH
specs:
ast-crispr-ruby-prism (7.1.0)
ast-crispr (= 7.1.0)
- prism (>= 1.0)
+ prism-merge (= 7.1.0)
version_gem (~> 1.1, >= 1.1.9)
PATH
@@ -27,6 +37,7 @@ PATH
specs:
ast-merge-git (7.1.0)
ast-merge (= 7.1.0)
+ json-merge (= 7.1.0)
version_gem (~> 1.1, >= 1.1.9)
PATH
@@ -269,7 +280,7 @@ GEM
specs:
addressable (2.9.0)
public_suffix (>= 2.0.2, < 8.0)
- appraisal2 (3.1.4)
+ appraisal2 (3.2.0)
bundler (>= 1.17.3)
rake (>= 10)
thor (>= 0.14)
@@ -298,7 +309,7 @@ GEM
gitmoji-regex (2.0.4)
version_gem (~> 1.1, >= 1.1.13)
io-console (0.8.2)
- kettle-dev (2.3.6)
+ kettle-dev (2.3.7)
emoji_regex (>= 15.0)
kettle-rb (~> 0.1, >= 0.1.2)
kettle-test (~> 2.0, >= 2.0.4)
@@ -339,6 +350,9 @@ GEM
public_suffix (7.0.5)
racc (1.8.1)
rake (13.4.2)
+ rake-compiler-dock (1.12.0)
+ rb_sys (0.9.127)
+ rake-compiler-dock (= 1.12.0)
rbs (4.0.3)
logger
prism (>= 1.6.0)
@@ -394,10 +408,8 @@ GEM
toml-rb (4.2.0)
citrus (~> 3.0, > 3.0)
racc (~> 1.7)
- tree_sitter_language_pack (1.9.0.pre.rc.40-x86_64-linux)
- sorbet-runtime (~> 0.5)
tsort (0.2.0)
- turbo_tests2 (3.1.14)
+ turbo_tests2 (3.2.0)
parallel_tests (>= 3.3.0, < 6)
rspec (>= 3.10)
version_gem (~> 1.1, >= 1.1.14)
@@ -451,14 +463,15 @@ DEPENDENCIES
toml-merge!
toml-rb (~> 4.1)
tree_haver!
- turbo_tests2 (~> 3.1, >= 3.1.14)
+ tree_sitter_language_pack!
+ turbo_tests2 (~> 3.2, ~> 3.1, >= 3.2.0, >= 3.1.14)
typescript-merge!
yaml-merge!
zip-merge!
CHECKSUMS
addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af
- appraisal2 (3.1.4) sha256=f88c27e600adf4bd5bf06c0ab0afd1de6ce4361497760ce35e86e782036286f4
+ appraisal2 (3.2.0) sha256=ccd0b767ac4060cd7af6d16747459b6990f49c39c7b4fb1f7d1146b1e97c492f
ast-crispr (7.1.0)
ast-crispr-markdown-markly (7.1.0)
ast-crispr-ruby-prism (7.1.0)
@@ -489,7 +502,7 @@ CHECKSUMS
go-merge (7.1.0)
io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc
json-merge (7.1.0)
- kettle-dev (2.3.6) sha256=955b01e8aca46438365332d1b4413f22cb58dabfeab5cba04d71237c53cc70ae
+ kettle-dev (2.3.7) sha256=eb370113cd030d03cbe2d33b31c99858951017e5ad21a17e9ed89dc3770028ee
kettle-drift (1.0.5) sha256=07094e80140a049164142820bdd327c30fcd855bb00697a0a430600a2b5144a2
kettle-family (1.0.0) sha256=4c1c158fede8c4e369b6e5576cb540ad38891011cfc7721aea0ade813b13e3c1
kettle-jem (7.1.0)
@@ -513,6 +526,8 @@ CHECKSUMS
public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623
racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701
+ rake-compiler-dock (1.12.0) sha256=f13205c2738f3d2053afcd03491a9e4541b22a59a0bfc53fc8bc883bd8188023
+ rb_sys (0.9.127) sha256=e9f90df3bb0577472d26d96127d5b5774b98f44de881e7d36aeefd28d6337847
rbs (4.0.3) sha256=5a7bf70e2628549d9a1f44eae447b2cfe55968a9c60cfff52693a4bdcc020e14
rbs-merge (7.1.0)
reline (0.6.3) sha256=1198b04973565b36ec0f11542ab3f5cfeeec34823f4e54cebde90968092b1835
@@ -545,9 +560,9 @@ CHECKSUMS
toml-merge (7.1.0)
toml-rb (4.2.0) sha256=10a48c91613e20cf63483a7a776767dfb3cd7d70e9327c0237443da601e13776
tree_haver (7.1.0)
- tree_sitter_language_pack (1.9.0.pre.rc.40-x86_64-linux) sha256=ad6743a373eeac954c1b659b17af3aff1c82918b3ce9c9dc572a7c70ff843cdd
+ tree_sitter_language_pack (1.12.5)
tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f
- turbo_tests2 (3.1.14) sha256=cc29d5b36bdbba67a83eee09a9546880d0926edfbbe50d99633fc0b5763ee94c
+ turbo_tests2 (3.2.0) sha256=8b35421548399d1923567b177970f42671c65695b93cdd134d78fbcbab85dff0
typescript-merge (7.1.0)
version_gem (1.1.14) sha256=6b7306c7e9416d06067561981ab3444e2cecb844f26cc325ae3c27b44cf85613
yaml-merge (7.1.0)
diff --git a/README.md b/README.md
index 7ef94c9fa..4908e519d 100644
--- a/README.md
+++ b/README.md
@@ -93,8 +93,8 @@ merge gems.
| Gem | Provides | Runtime notes |
| --- | --- | --- |
| [`psych-merge`][ruby-psych-merge] | YAML provider | Uses Ruby's [Psych][psych] parser and emitter. |
-| [`citrus-toml-merge`][ruby-citrus-toml-merge] | TOML provider | Uses a [Citrus][citrus] grammar and pure-Ruby parser path, commonly paired with [`toml-rb`][toml-rb] style TOML data handling. |
-| [`parslet-toml-merge`][ruby-parslet-toml-merge] | TOML provider | Uses [Parslet][parslet] and pure-Ruby parser path, commonly paired with [`toml`][toml] style TOML data handling. |
+| [`citrus-toml-merge`][ruby-citrus-toml-merge] | TOML provider | Registers a TreeHaver TOML backend backed by a [Citrus][citrus] grammar, commonly paired with [`toml-rb`][toml-rb] style TOML data handling. |
+| [`parslet-toml-merge`][ruby-parslet-toml-merge] | TOML provider | Registers a TreeHaver TOML backend backed by [Parslet][parslet], commonly paired with [`toml`][toml] style TOML data handling. |
| [`commonmarker-merge`][ruby-commonmarker-merge] | Markdown provider | Uses [CommonMarker][commonmarker] for CommonMark-oriented Markdown parsing. |
| [`kramdown-merge`][ruby-kramdown-merge] | Markdown provider | Uses [Kramdown][kramdown] for Ruby-native Markdown parsing. |
| [`markly-merge`][ruby-markly-merge] | Markdown provider | Uses [Markly][markly] for cmark-gfm-backed Markdown parsing and README templating support. |
@@ -118,7 +118,7 @@ tags are capability names, not package preferences.
| [Psych][psych] | `yaml-merge`, `psych-merge` | Ruby standard YAML parser/emitter path. |
| [RBS][rbs] | `rbs-merge` | Ruby signature parser path. |
| [CommonMarker][commonmarker], [Markly][markly], [Kramdown][kramdown] | `markdown-merge` providers | Markdown parser families with different CommonMark/GFM/Ruby-native tradeoffs. |
-| [Citrus][citrus], [Parslet][parslet] | `toml-merge` providers | Pure-Ruby TOML parser families used as provider-specific backend paths. |
+| [Citrus][citrus], [Parslet][parslet] | `toml-merge` providers | Pure-Ruby TOML parser families exposed as provider-specific TreeHaver backend paths. |
| [Kaitai Struct][kaitai] | `binary-merge` | Schema-oriented binary parsing support for structured binary work. |
#### Backend Platform Compatibility
diff --git a/gems/ast-crispr-markdown-markly/.gitattributes b/gems/ast-crispr-markdown-markly/.gitattributes
index 0ac65aaa7..35a3c7359 100644
--- a/gems/ast-crispr-markdown-markly/.gitattributes
+++ b/gems/ast-crispr-markdown-markly/.gitattributes
@@ -1,5 +1,5 @@
# <> do not edit below this line
-*.rb diff=smorg-ruby
+*.rb diff=smorg-rb
*.go diff=smorg-go
*.rs diff=smorg-rs
# <>
diff --git a/gems/ast-crispr-markdown-markly/.kettle-drift.lock b/gems/ast-crispr-markdown-markly/.kettle-drift.lock
index 9295a3562..09df60df7 100644
--- a/gems/ast-crispr-markdown-markly/.kettle-drift.lock
+++ b/gems/ast-crispr-markdown-markly/.kettle-drift.lock
@@ -4,7 +4,13 @@
"file": "Gemfile",
"lines": [
80,
- 120
+ 120,
+ 160,
+ 200,
+ 240,
+ 280,
+ 320,
+ 360
]
}
],
@@ -13,7 +19,13 @@
"file": "Gemfile",
"lines": [
91,
- 131
+ 131,
+ 171,
+ 211,
+ 251,
+ 291,
+ 331,
+ 371
]
}
],
@@ -22,7 +34,13 @@
"file": "Gemfile",
"lines": [
81,
- 121
+ 121,
+ 161,
+ 201,
+ 241,
+ 281,
+ 321,
+ 361
]
}
],
@@ -31,7 +49,13 @@
"file": "Gemfile",
"lines": [
93,
- 133
+ 133,
+ 173,
+ 213,
+ 253,
+ 293,
+ 333,
+ 373
]
}
],
@@ -40,7 +64,13 @@
"file": "Gemfile",
"lines": [
96,
- 136
+ 136,
+ 176,
+ 216,
+ 256,
+ 296,
+ 336,
+ 376
]
}
],
@@ -49,7 +79,13 @@
"file": "Gemfile",
"lines": [
82,
- 122
+ 122,
+ 162,
+ 202,
+ 242,
+ 282,
+ 322,
+ 362
]
}
],
@@ -59,7 +95,13 @@
"lines": [
60,
100,
- 140
+ 140,
+ 180,
+ 220,
+ 260,
+ 300,
+ 340,
+ 380
]
}
],
@@ -68,7 +110,13 @@
"file": "Gemfile",
"lines": [
101,
- 141
+ 141,
+ 181,
+ 221,
+ 261,
+ 301,
+ 341,
+ 381
]
}
],
@@ -78,7 +126,13 @@
"lines": [
43,
87,
- 127
+ 127,
+ 167,
+ 207,
+ 247,
+ 287,
+ 327,
+ 367
]
}
],
@@ -87,7 +141,13 @@
"file": "Gemfile",
"lines": [
110,
- 150
+ 150,
+ 190,
+ 230,
+ 270,
+ 310,
+ 350,
+ 390
]
}
],
@@ -97,7 +157,13 @@
"lines": [
35,
79,
- 119
+ 119,
+ 159,
+ 199,
+ 239,
+ 279,
+ 319,
+ 359
]
}
],
@@ -107,7 +173,13 @@
"lines": [
69,
109,
- 149
+ 149,
+ 189,
+ 229,
+ 269,
+ 309,
+ 349,
+ 389
]
}
],
@@ -116,7 +188,13 @@
"file": "Gemfile",
"lines": [
85,
- 125
+ 125,
+ 165,
+ 205,
+ 245,
+ 285,
+ 325,
+ 365
]
}
],
@@ -126,7 +204,13 @@
"lines": [
48,
92,
- 132
+ 132,
+ 172,
+ 212,
+ 252,
+ 292,
+ 332,
+ 372
]
}
],
@@ -136,7 +220,13 @@
"lines": [
44,
88,
- 128
+ 128,
+ 168,
+ 208,
+ 248,
+ 288,
+ 328,
+ 368
]
}
],
@@ -145,7 +235,13 @@
"file": "Gemfile",
"lines": [
86,
- 126
+ 126,
+ 166,
+ 206,
+ 246,
+ 286,
+ 326,
+ 366
]
}
],
@@ -154,7 +250,13 @@
"file": "Gemfile",
"lines": [
103,
- 143
+ 143,
+ 183,
+ 223,
+ 263,
+ 303,
+ 343,
+ 383
]
}
],
@@ -163,7 +265,13 @@
"file": "Gemfile",
"lines": [
102,
- 142
+ 142,
+ 182,
+ 222,
+ 262,
+ 302,
+ 342,
+ 382
]
}
],
@@ -172,7 +280,13 @@
"file": "Gemfile",
"lines": [
97,
- 137
+ 137,
+ 177,
+ 217,
+ 257,
+ 297,
+ 337,
+ 377
]
}
],
@@ -181,7 +295,13 @@
"file": "Gemfile",
"lines": [
106,
- 146
+ 146,
+ 186,
+ 226,
+ 266,
+ 306,
+ 346,
+ 386
]
}
],
diff --git a/gems/ast-crispr-markdown-markly/Gemfile b/gems/ast-crispr-markdown-markly/Gemfile
index 7fbfaad74..86b7488a2 100644
--- a/gems/ast-crispr-markdown-markly/Gemfile
+++ b/gems/ast-crispr-markdown-markly/Gemfile
@@ -152,7 +152,247 @@ if direct_sibling_gems.any? &&
end
end
-# Use the StructuredMerge TLSP branch until upstream ships Ruby 4-compatible gem metadata.
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+# Use the StructuredMerge TSLP branch until upstream ships Ruby 4-compatible gem metadata.
tslp_dev = ENV.fetch('TSLP_DEV', nil)
tslp_declared_by_templating =
ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? && !tslp_dev.to_s.empty?
@@ -161,7 +401,7 @@ unless tslp_declared_by_templating
gem(
'tree_sitter_language_pack',
git: 'https://github.com/structuredmerge/tree-sitter-language-pack.git',
- branch: 'fix/ruby-4-installs',
+ branch: 'fix/ruby-parser-api-methods',
glob: 'packages/ruby/*.gemspec'
)
else
@@ -169,7 +409,7 @@ unless tslp_declared_by_templating
end
end
-# Templating (env-switched: SMORG_RB_DEV=/path/to/structuredmerge/ruby/gems for local paths)
+# Templating (env-switched: STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local paths)
eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?
# Debugging
diff --git a/gems/ast-crispr-markdown-markly/Gemfile.lock b/gems/ast-crispr-markdown-markly/Gemfile.lock
index c9f436940..9e99f39dd 100644
--- a/gems/ast-crispr-markdown-markly/Gemfile.lock
+++ b/gems/ast-crispr-markdown-markly/Gemfile.lock
@@ -1,13 +1,3 @@
-GIT
- remote: https://github.com/structuredmerge/tree-sitter-language-pack.git
- revision: dcc959b12d02d6e379abf1c8ac536a852d1b8416
- branch: fix/ruby-4-installs
- glob: packages/ruby/*.gemspec
- specs:
- tree_sitter_language_pack (1.12.5)
- rb_sys (>= 0.9, < 0.9.128)
- sorbet-runtime (~> 0.5)
-
PATH
remote: .
specs:
@@ -16,26 +6,283 @@ PATH
markly-merge (= 7.1.0)
version_gem (~> 1.1, >= 1.1.9)
-GEM
- remote: https://gem.coop/
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-ruby-prism
+ specs:
+ ast-crispr-ruby-prism (7.1.0)
+ ast-crispr (= 7.1.0)
+ prism-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr
specs:
- addressable (2.9.0)
- public_suffix (>= 2.0.2, < 8.0)
- ansi (1.6.0)
- appraisal2 (3.1.4)
- bundler (>= 1.17.3)
- rake (>= 10)
- thor (>= 0.14)
- ast (2.4.3)
ast-crispr (7.1.0)
ast-merge (= 7.1.0)
service_actor (~> 3.9)
version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge-git
+ specs:
+ ast-merge-git (7.1.0)
+ ast-merge (= 7.1.0)
+ json-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge
+ specs:
ast-merge (7.1.0)
benchmark
token-resolver (~> 2.0, >= 2.0.4)
tree_haver (= 7.1.0)
version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-template
+ specs:
+ ast-template (7.1.0)
+ ast-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/bash-merge
+ specs:
+ bash-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.14)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/binary-merge
+ specs:
+ binary-merge (7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/citrus-toml-merge
+ specs:
+ citrus-toml-merge (7.1.0)
+ toml-merge (= 7.1.0)
+ toml-rb (~> 4.1)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/commonmarker-merge
+ specs:
+ commonmarker-merge (7.1.0)
+ commonmarker (~> 2.2)
+ markdown-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/dotenv-merge
+ specs:
+ dotenv-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.14)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/go-merge
+ specs:
+ go-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/json-merge
+ specs:
+ json-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/kettle-jem
+ specs:
+ kettle-jem (7.1.0)
+ addressable (>= 2.8, < 3)
+ ast-crispr-markdown-markly (= 7.1.0)
+ ast-crispr-ruby-prism (= 7.1.0)
+ ast-merge (= 7.1.0)
+ bash-merge (= 7.1.0)
+ citrus-toml-merge (= 7.1.0)
+ commonmarker-merge (= 7.1.0)
+ dotenv-merge (= 7.1.0)
+ json-merge (= 7.1.0)
+ kettle-dev (~> 2.3, >= 2.3.5)
+ kettle-rb (~> 0.1, >= 0.1.4)
+ kramdown-merge (= 7.1.0)
+ markdown-merge (= 7.1.0)
+ markly-merge (= 7.1.0)
+ prism-merge (= 7.1.0)
+ psych-merge (= 7.1.0)
+ rbs (>= 3.10)
+ rbs-merge (= 7.1.0)
+ ruby-merge (= 7.1.0)
+ token-resolver (~> 2.0, >= 2.0.4)
+ toml-merge (= 7.1.0)
+ toml-rb (~> 4.2)
+ tree_haver (= 7.1.0)
+ yaml-merge (= 7.1.0)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/kramdown-merge
+ specs:
+ kramdown-merge (7.1.0)
+ kramdown (~> 2.5)
+ markdown-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/markdown-merge
+ specs:
+ markdown-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/markly-merge
+ specs:
+ markly-merge (7.1.0)
+ markdown-merge (= 7.1.0)
+ markly (~> 0.9)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/parslet-toml-merge
+ specs:
+ parslet-toml-merge (7.1.0)
+ toml (~> 0.3)
+ toml-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/plain-merge
+ specs:
+ plain-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/prism-merge
+ specs:
+ prism-merge (7.1.0)
+ prism (~> 1.6)
+ ruby-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/psych-merge
+ specs:
+ psych-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+ yaml-merge (= 7.1.0)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/rbs-merge
+ specs:
+ rbs-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ rbs (>= 3.10)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.14)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ruby-merge
+ specs:
+ ruby-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/rust-merge
+ specs:
+ rust-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/smorg-rb
+ specs:
+ smorg-rb (7.1.0)
+ ast-merge (= 7.1.0)
+ ast-merge-git (= 7.1.0)
+ go-merge (= 7.1.0)
+ json-merge (= 7.1.0)
+ kettle-jem (= 7.1.0)
+ markly-merge (= 7.1.0)
+ plain-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/toml-merge
+ specs:
+ toml-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/tree_haver
+ specs:
+ tree_haver (7.1.0)
+ citrus (~> 3.0)
+ parslet (~> 2.0)
+ tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/typescript-merge
+ specs:
+ typescript-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/yaml-merge
+ specs:
+ yaml-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/zip-merge
+ specs:
+ zip-merge (7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /var/home/pboling/src/my/structuredmerge/vendor/tree-sitter-language-pack/packages/ruby
+ specs:
+ tree_sitter_language_pack (1.12.5)
+ rb_sys (>= 0.9, < 0.9.128)
+ sorbet-runtime (~> 0.5)
+
+GEM
+ remote: https://gem.coop/
+ specs:
+ addressable (2.9.0)
+ public_suffix (>= 2.0.2, < 8.0)
+ ansi (1.6.0)
+ appraisal2 (3.2.0)
+ bundler (>= 1.17.3)
+ rake (>= 10)
+ thor (>= 0.14)
+ ast (2.4.3)
backports (3.25.3)
benchmark (0.5.0)
bigdecimal (4.1.2)
@@ -44,6 +291,12 @@ GEM
thor (~> 1.0)
citrus (3.0.2)
cmdparse (3.0.7)
+ commonmarker (2.9.0-aarch64-linux)
+ commonmarker (2.9.0-aarch64-linux-musl)
+ commonmarker (2.9.0-arm64-darwin)
+ commonmarker (2.9.0-x86_64-darwin)
+ commonmarker (2.9.0-x86_64-linux)
+ commonmarker (2.9.0-x86_64-linux-musl)
concurrent-ruby (1.3.7)
date (3.5.1)
debug (1.11.1)
@@ -102,11 +355,13 @@ GEM
rdoc (>= 4.0.0)
reline (>= 0.4.2)
json (2.21.1)
- kettle-dev (2.3.6)
+ kettle-dev (2.3.7)
emoji_regex (>= 15.0)
kettle-rb (~> 0.1, >= 0.1.2)
kettle-test (~> 2.0, >= 2.0.4)
ruby-progressbar (~> 1.13)
+ kettle-drift (1.0.5)
+ version_gem (~> 1.1, >= 1.1.13)
kettle-rb (0.1.4)
kettle-soup-cover (1.1.3)
simplecov (~> 0.22)
@@ -135,15 +390,7 @@ GEM
language_server-protocol (3.17.0.6)
lint_roller (1.1.0)
logger (1.7.0)
- markdown-merge (7.1.0)
- ast-merge (= 7.1.0)
- tree_haver (= 7.1.0)
- version_gem (~> 1.1, >= 1.1.9)
markly (0.16.0)
- markly-merge (7.1.0)
- markdown-merge (= 7.1.0)
- markly (~> 0.9)
- version_gem (~> 1.1, >= 1.1.9)
mutex_m (0.3.0)
nokogiri (1.19.4-aarch64-linux-gnu)
racc (~> 1.4)
@@ -337,13 +584,13 @@ GEM
token-resolver (2.0.4)
parslet (~> 2.0)
version_gem (~> 1.1, >= 1.1.13)
- tree_haver (7.1.0)
- citrus (~> 3.0)
- parslet (~> 2.0)
- tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0)
- version_gem (~> 1.1, >= 1.1.9)
+ toml (0.3.0)
+ parslet (>= 1.8.0, < 3.0.0)
+ toml-rb (4.2.0)
+ citrus (~> 3.0, > 3.0)
+ racc (~> 1.7)
tsort (0.2.0)
- turbo_tests2 (3.1.14)
+ turbo_tests2 (3.2.0)
parallel_tests (>= 3.3.0, < 6)
rspec (>= 3.10)
version_gem (~> 1.1, >= 1.1.14)
@@ -368,7 +615,7 @@ GEM
yard
yard-relative_markdown_links (0.6.0)
nokogiri (>= 1.14.3, < 2)
- yard-timekeeper (0.2.3)
+ yard-timekeeper (0.2.4)
version_gem (~> 1.1, >= 1.1.13)
yard-yaml (0.2.3)
version_gem (~> 1.1, >= 1.1.13)
@@ -388,23 +635,45 @@ PLATFORMS
DEPENDENCIES
addressable (>= 2.8, < 3)
appraisal2 (~> 3.0, >= 3.0.6)
+ ast-crispr!
ast-crispr-markdown-markly!
+ ast-crispr-ruby-prism!
+ ast-merge!
+ ast-merge-git!
+ ast-template!
+ bash-merge!
benchmark (~> 0.5, >= 0.5.0)
+ binary-merge!
bundler-audit (~> 0.9.3)
+ citrus-toml-merge!
+ commonmarker-merge!
debug (>= 1.1)
+ dotenv-merge!
erb (~> 6.0, >= 6.0.4)
gem_bench (~> 2.0, >= 2.0.5)
gitmoji-regex (~> 2.0, >= 2.0.0)
+ go-merge!
irb (~> 1.17)
+ json-merge!
kettle-dev (~> 2.0, >= 2.2.25)
+ kettle-drift (~> 1.0, >= 1.0.5)
+ kettle-jem!
kettle-soup-cover (~> 1.0, >= 1.1.3)
kettle-test (~> 2.0, >= 2.0.9)
kramdown (~> 2.5, >= 2.5.1)
+ kramdown-merge!
kramdown-parser-gfm (~> 1.1)
+ markdown-merge!
+ markly-merge!
mutex_m (~> 0.2)
nomono (~> 1.0, >= 1.0.8)
+ parslet-toml-merge!
+ plain-merge!
+ prism-merge!
+ psych-merge!
rake (~> 13.0)
rbs (>= 3.0)
+ rbs-merge!
rdoc (~> 6.11)
reek (~> 6.5)
require_bench (~> 1.0, >= 1.0.4)
@@ -413,33 +682,54 @@ DEPENDENCIES
rubocop-packaging (~> 0.6, >= 0.6.0)
rubocop-rspec (~> 3.6)
rubocop-ruby3_2 (~> 3.0.0)
+ ruby-merge!
ruby-progressbar (~> 1.13)
+ rust-merge!
+ smorg-rb!
standard (>= 1.50)
stone_checksums (~> 1.0, >= 1.0.3)
stringio (>= 3.0)
+ toml-merge!
+ tree_haver!
tree_sitter_language_pack!
+ typescript-merge!
yaml-converter (~> 0.1)
+ yaml-merge!
yard (~> 0.9, >= 0.9.44)
yard-fence (~> 0.9, >= 0.9.1)
yard-junk (~> 0.1, >= 0.1.0)
yard-relative_markdown_links (~> 0.6)
yard-timekeeper (~> 0.1)
yard-yaml (~> 0.1, >= 0.1.2)
+ zip-merge!
CHECKSUMS
addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af
ansi (1.6.0) sha256=ac9ea0c0ea8d32fb4e271348e609963ac78882f34b73836c2a02b3622e666658
- appraisal2 (3.1.4) sha256=f88c27e600adf4bd5bf06c0ab0afd1de6ce4361497760ce35e86e782036286f4
+ appraisal2 (3.2.0) sha256=ccd0b767ac4060cd7af6d16747459b6990f49c39c7b4fb1f7d1146b1e97c492f
ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
ast-crispr (7.1.0)
ast-crispr-markdown-markly (7.1.0)
+ ast-crispr-ruby-prism (7.1.0)
ast-merge (7.1.0)
+ ast-merge-git (7.1.0)
+ ast-template (7.1.0)
backports (3.25.3) sha256=94298d32dc3c40ca15633b54e282780b49e2db0c045f602ea1907e4f63a17235
+ bash-merge (7.1.0)
benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c
bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd
+ binary-merge (7.1.0)
bundler-audit (0.9.3) sha256=81c8766c71e47d0d28a0f98c7eed028539f21a6ea3cd8f685eb6f42333c9b4e9
citrus (3.0.2) sha256=4ec2412fc389ad186735f4baee1460f7900a8e130ffe3f216b30d4f9c684f650
+ citrus-toml-merge (7.1.0)
cmdparse (3.0.7) sha256=f7c5cace10bec6abf853370ae095e4b97a84ed9d847b3fb38f41cc4fbc950739
+ commonmarker (2.9.0-aarch64-linux) sha256=e2b4aadb9a2cfa4e206582641ce3a49465549ac1ed4c289fdd63b78d8f24579c
+ commonmarker (2.9.0-aarch64-linux-musl) sha256=1cf4d2821f2a7e64945f1ed7c4eeced586fdb27ea7fe7337788802cf8f57cfca
+ commonmarker (2.9.0-arm64-darwin) sha256=1748dbfa4f5813b0d2a14bb4bbfa65a4ec293aa1c825016d60029ee0e132b046
+ commonmarker (2.9.0-x86_64-darwin) sha256=0a9914ccfd2f5d2a59c7bd0dda4fe90eb084cf513b477e499008e09ec9d6edd6
+ commonmarker (2.9.0-x86_64-linux) sha256=8cfe92970eef585a19ddf6613224b91cab64d6029834661bda801f877c9c7f43
+ commonmarker (2.9.0-x86_64-linux-musl) sha256=293921398b839f79ceaf55010e061357e34f053822c3b003cd0be6686176335e
+ commonmarker-merge (7.1.0)
concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0
date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0
debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6
@@ -447,6 +737,7 @@ CHECKSUMS
diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962
diffy (3.4.4) sha256=79384ab5ca82d0e115b2771f0961e27c164c456074bd2ec46b637ebf7b6e47e3
docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e
+ dotenv-merge (7.1.0)
dry-configurable (1.4.0) sha256=e35d1b5f3c081753ef361f564919db79000f32cfa6f20ee3a3ba5921b41b73ce
dry-core (1.2.0) sha256=0cc5a7da88df397f153947eeeae42e876e999c1e30900f3c536fb173854e96a1
dry-inflector (1.3.1) sha256=7fb0c2bb04f67638f25c52e7ba39ab435d922a3a5c3cd196120f63accb682dcc
@@ -459,15 +750,20 @@ CHECKSUMS
gem_bench (2.0.5) sha256=0dc0fb44a5a5eb7b2f5c1c68a5b0164d72007132822c012bac3abe976b199ead
geom2d (0.4.1) sha256=ea0998ea90c4f2752e24fe13d85a4f89bee689d151316140ebcc6369bf634ed9
gitmoji-regex (2.0.4) sha256=01410d3217940bd0e7b2299ec805245afe8d0f06a5d6d38f623d63a63c0ac34f
+ go-merge (7.1.0)
hexapdf (1.9.1) sha256=2d1f6a3622e6bc2a70a707d4c3f3fa44f5552ecd9d899f6283abb07398a84884
io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc
irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3
json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583
- kettle-dev (2.3.6) sha256=955b01e8aca46438365332d1b4413f22cb58dabfeab5cba04d71237c53cc70ae
+ json-merge (7.1.0)
+ kettle-dev (2.3.7) sha256=eb370113cd030d03cbe2d33b31c99858951017e5ad21a17e9ed89dc3770028ee
+ kettle-drift (1.0.5) sha256=07094e80140a049164142820bdd327c30fcd855bb00697a0a430600a2b5144a2
+ kettle-jem (7.1.0)
kettle-rb (0.1.4) sha256=9cef7ce4f7021666b7222292f29051e51eaf042e8a5db11f3f4dd72f74243fc1
kettle-soup-cover (1.1.3) sha256=a373827da22a7131d093afd32945e5b7d7a10a01ebfdded8fd2cb8230d69c8ad
kettle-test (2.0.11) sha256=c710c90f7ab79d51f9452f0c09f5f90657e7a893f63583855c164d0b1b107ab2
kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa
+ kramdown-merge (7.1.0)
kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729
language_server-protocol (3.17.0.6) sha256=5ef2c0c138f8267e1bc631d3328347d354f96724b0af22f2c79516120443b7f0
lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87
@@ -489,10 +785,14 @@ CHECKSUMS
parallel_tests (5.7.0) sha256=3f1762c46ca2c223b8af8ef877217f9d76974e191bfa934f2580b58bcf1d005c
parser (3.3.12.0) sha256=21a6d7f755d5a24dfbdc6e6b772e4e879a52e7631a88bc5a3a134606052c9828
parslet (2.0.0) sha256=d45130695d39b43d7e6a91f4d2ec66b388a8d822bae38de9b4de9a5fbde1f606
+ parslet-toml-merge (7.1.0)
+ plain-merge (7.1.0)
pp (0.6.4) sha256=dfcb0fce700c41456265922884f9fe195d7fbb0674a3578e6c0f69588e82b570
prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193
prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85
+ prism-merge (7.1.0)
psych (5.4.0) sha256=14f72d69a611af663d7d70e4a7b67d9eb1f3ae9f8d916b478961d5a0075ba5b7
+ psych-merge (7.1.0)
public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623
racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
@@ -500,6 +800,7 @@ CHECKSUMS
rake-compiler-dock (1.12.0) sha256=f13205c2738f3d2053afcd03491a9e4541b22a59a0bfc53fc8bc883bd8188023
rb_sys (0.9.127) sha256=e9f90df3bb0577472d26d96127d5b5774b98f44de881e7d36aeefd28d6337847
rbs (4.0.3) sha256=5a7bf70e2628549d9a1f44eae447b2cfe55968a9c60cfff52693a4bdcc020e14
+ rbs-merge (7.1.0)
rdoc (6.17.0) sha256=0f50d4e568fc98195f9bb155a9e8dff6c7feabfb515fb22ef6df1d12ad5a02b7
reek (6.5.0) sha256=d26d3a492773b2bbc228888067a21afe33ac07954a17dbd64cdeae42c4c69be1
regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb
@@ -527,9 +828,11 @@ CHECKSUMS
rubocop-rspec (3.10.2) sha256=0b3e2ecc592cd10ecbf0095bb58d1e357905276e069643523cc19eb7495f65e2
rubocop-ruby3_2 (3.0.7) sha256=f53dd6d286fb05186214fc6ec116783e7f837030918e8931c05de773e98f8466
rubocop-thread_safety (0.7.3) sha256=067cdd52fbf5deffc18995437e45b5194236eaff4f71de3375a1f6052e48f431
+ ruby-merge (7.1.0)
ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
ruby_engine (2.0.3) sha256=ca2ae7def8cfcdc2bfb6a186d36d5d59c8b403245dc0256c3802b767fa278aaa
ruby_version (1.0.3) sha256=5930f9950746b7e6c973184398ee364ee7440b170fef7922b9f5cdf317f1ccb5
+ rust-merge (7.1.0)
service_actor (3.9.4) sha256=e63b523630b9a7e62959b2a90113b08d2565b5de9c148557b281ef847c9539ce
silent_stream (1.0.12) sha256=377c43aa10033fe90c33b39ea8cd97d79f2d1c4856df598efc56f3091f3ae782
simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5
@@ -539,6 +842,7 @@ CHECKSUMS
simplecov-lcov (0.9.0) sha256=7a77a31e200a595ed4b0249493056efd0c920601f53d2ef135ca34ee796346cd
simplecov-rcov (0.3.7) sha256=372f50bf6df6b6350b7d0c840f2f8bdabe021861a43c26877b747c9ac96139fc
simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428
+ smorg-rb (7.1.0)
sorbet-runtime (0.6.13342) sha256=dbeb9892597f593ed2b29e38018912787f6c4e0c4b736d8af0d6bd3c63bde3c3
standard (1.56.0) sha256=ae2af4d9669589162ac69ed5ef59dcf9f346d4afc81f7e62b84339310dfcb787
standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b
@@ -552,21 +856,27 @@ CHECKSUMS
timecop (0.9.11) sha256=41284dc6e5041f2184f781ace766f942108c842f8d8c1386a26e6343decc7542
timecop-rspec (1.0.3) sha256=005f14841bb606dcaefb060e321b5388e2e59537742bee8b3a9a9a40e598fab9
token-resolver (2.0.4) sha256=33b926958f504525bba3ed511ab66fbcbf8ef30390815e931436b30f27ffcad0
+ toml (0.3.0) sha256=0a91d0f76a9036e84e44f95693b12f58d358c1df3ac8e3b5271f2056ecc6e4b9
+ toml-merge (7.1.0)
+ toml-rb (4.2.0) sha256=10a48c91613e20cf63483a7a776767dfb3cd7d70e9327c0237443da601e13776
tree_haver (7.1.0)
tree_sitter_language_pack (1.12.5)
tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f
- turbo_tests2 (3.1.14) sha256=cc29d5b36bdbba67a83eee09a9546880d0926edfbbe50d99633fc0b5763ee94c
+ turbo_tests2 (3.2.0) sha256=8b35421548399d1923567b177970f42671c65695b93cdd134d78fbcbab85dff0
+ typescript-merge (7.1.0)
unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42
unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f
version_gem (1.1.14) sha256=6b7306c7e9416d06067561981ab3444e2cecb844f26cc325ae3c27b44cf85613
yaml-converter (0.2.3) sha256=d35e69e547610d9e347672cc277fcb7d71dff3c53a942e66f82b1c64022ada72
+ yaml-merge (7.1.0)
yard (0.9.45) sha256=52e211493f7cb8a3ebf7e104a25a1e73937a3103092545d34cb88fafebb3dc51
yard-fence (0.9.6) sha256=3d1dbf4e3df462ac78b8bd2e01cf740a2de20168387c929aca31a0bcee490659
yard-junk (0.1.0) sha256=e85fe2ec1afa47313decd333447b53458cb1ed49b510b70015fdc3041a94bcdd
yard-relative_markdown_links (0.6.0) sha256=3e5ffa85cbad9bac70bee5421774b190fb25d3bdf489323a5b3534f647d1a70e
- yard-timekeeper (0.2.3) sha256=849a3e74a0484b1e0b5209cf86823e418b3091e21f4f143c141d38e1cc262034
+ yard-timekeeper (0.2.4) sha256=62f8d001d737c6e2ac688e7b37386f958dceb0f6aff9c909575e1bec8d20775a
yard-yaml (0.2.3) sha256=fe5fef18819e1cbd05bb8f1b9e1baad6bf70c28125eb75b57bbf6397b0831812
zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12
+ zip-merge (7.1.0)
zlib (3.2.3) sha256=5bd316698b32f31a64ab910a8b6c282442ca1626a81bbd6a1674e8522e319c20
BUNDLED WITH
diff --git a/gems/ast-crispr-markdown-markly/gemfiles/modular/templating.gemfile b/gems/ast-crispr-markdown-markly/gemfiles/modular/templating.gemfile
index 0d1c9bcf4..e3c24e6b7 100644
--- a/gems/ast-crispr-markdown-markly/gemfiles/modular/templating.gemfile
+++ b/gems/ast-crispr-markdown-markly/gemfiles/modular/templating.gemfile
@@ -1,9 +1,9 @@
# frozen_string_literal: true
-smorg_remote = ENV.fetch('SMORG_RB_DEV', 'false').casecmp('false').zero?
+structuredmerge_remote = ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false').zero?
kettle_remote = ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero?
-if smorg_remote
+if structuredmerge_remote
# Merge recipes and parser dependencies for released installs.
gem 'kettle-jem', '>= 7.0'
end
@@ -13,10 +13,10 @@ if kettle_remote
gem 'kettle-drift', '~> 1.0', '>= 1.0.5', require: false
end
-# Set SMORG_RB_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies.
+# Set STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies.
# When false (default / CI), released kettle-jem brings merge gems and parser dependencies.
# Local path overrides bring the same dependencies from sibling gemspecs.
#
# Set KETTLE_RB_DEV=/path/to/kettle-rb for local development with Kettle plugin gems.
# When false (default / CI), released Kettle plugin gems are used.
-eval_gemfile 'templating_local.gemfile' unless smorg_remote && kettle_remote
+eval_gemfile 'templating_local.gemfile' unless structuredmerge_remote && kettle_remote
diff --git a/gems/ast-crispr-markdown-markly/gemfiles/modular/templating_local.gemfile b/gems/ast-crispr-markdown-markly/gemfiles/modular/templating_local.gemfile
index 488be70f3..d2e0871f3 100644
--- a/gems/ast-crispr-markdown-markly/gemfiles/modular/templating_local.gemfile
+++ b/gems/ast-crispr-markdown-markly/gemfiles/modular/templating_local.gemfile
@@ -1,12 +1,12 @@
# frozen_string_literal: true
# Local path overrides for templating development.
-# Loaded by the associated non-local gemfile when SMORG_RB_DEV or KETTLE_RB_DEV
+# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_RB_DEV
# is not "false".
require 'nomono/bundler' unless defined?(Nomono)
-smorg_rb_local_gems = %w[
+structuredmerge_local_gems = %w[
tree_haver
ast-merge
ast-merge-git
@@ -43,7 +43,7 @@ kettle_rb_local_gems = %w[
kettle-dev kettle-test kettle-soup-cover kettle-drift
]
declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name)
-smorg_rb_local_gems_to_eval = smorg_rb_local_gems - %w[ast-crispr-markdown-markly] - declared_gems
+structuredmerge_local_gems_to_eval = structuredmerge_local_gems - %w[ast-crispr-markdown-markly] - declared_gems
kettle_rb_local_gems_to_eval = kettle_rb_local_gems - %w[ast-crispr-markdown-markly] - declared_gems
tslp_dev = ENV.fetch('TSLP_DEV', nil)
@@ -52,14 +52,14 @@ tslp_dev = ENV.fetch('TSLP_DEV', nil)
platform :mri do
gem 'tree_sitter_language_pack', path: tslp_dev unless tslp_dev.to_s.empty?
- if ENV.fetch('SMORG_RB_DEV', 'false').casecmp('false') != 0
+ if ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false') != 0
eval_nomono_gems(
- gems: smorg_rb_local_gems_to_eval,
- prefix: 'SMORG_RB',
- path_env: 'SMORG_RB_DEV',
+ gems: structuredmerge_local_gems_to_eval,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
vendored_gems_env: 'VENDORED_GEMS',
vendor_gem_dir_env: 'VENDOR_GEM_DIR',
- debug_env: 'SMORG_RB_DEBUG'
+ debug_env: 'STRUCTUREDMERGE_DEBUG'
)
end
diff --git a/gems/ast-crispr-markdown-markly/lib/ast/crispr/markdown/markly.rb b/gems/ast-crispr-markdown-markly/lib/ast/crispr/markdown/markly.rb
index ddd166951..ec5dbc6a9 100644
--- a/gems/ast-crispr-markdown-markly/lib/ast/crispr/markdown/markly.rb
+++ b/gems/ast-crispr-markdown-markly/lib/ast/crispr/markdown/markly.rb
@@ -12,47 +12,6 @@ module Markly
class Error < StandardError; end
class Adapter
- Location = Struct.new(:start_line, :end_line, keyword_init: true)
- HeadingSectionOwner = Struct.new(
- :location,
- :heading_text,
- :heading_source,
- :level,
- :base,
- keyword_init: true
- )
- LinkDefinitionOwner = Struct.new(
- :location,
- :label,
- :url,
- :title,
- :source,
- keyword_init: true
- )
- HtmlCommentOwner = Struct.new(
- :location,
- :text,
- :source,
- keyword_init: true
- )
- InlineReferenceOwner = Struct.new(
- :location,
- :line,
- :start_column,
- :end_column,
- :source,
- :reference_kind,
- :label,
- :labels,
- keyword_init: true
- )
- TableRowOwner = Struct.new(
- :location,
- :source,
- :text,
- keyword_init: true
- )
-
def read_ast(document)
analysis = ::Markly::Merge::FileAnalysis.new(document.content)
return analysis if analysis.valid?
@@ -65,15 +24,15 @@ def structural_owners(document, owner_scope: :shared_default)
analysis = document.ast
case owner_scope
when :shared_default, :heading_sections
- build_heading_sections(analysis)
+ analysis.heading_section_owners
when :link_definitions
- build_link_definitions(analysis)
+ analysis.link_definition_owners
when :html_comments
- build_html_comments(analysis)
+ analysis.html_comment_owners
when :inline_references
- build_inline_references(analysis)
+ analysis.inline_reference_owners
when :table_rows
- build_table_rows(analysis)
+ analysis.table_row_owners
else
raise Ast::Crispr::Error.new('Unsupported CRISPR owner scope', details: { owner_scope: owner_scope })
end
@@ -134,263 +93,6 @@ def structure_profile(owner_scope: :shared_default)
private
- def build_heading_sections(analysis)
- headings = Array(analysis.statements).filter_map do |statement|
- next unless heading_statement?(statement)
-
- build_heading_owner(statement, analysis)
- end
-
- headings.each_with_index.map do |owner, index|
- branch_end_line = branch_end_line(headings, index, analysis)
- HeadingSectionOwner.new(
- location: Location.new(start_line: owner.location.start_line, end_line: branch_end_line),
- heading_text: owner.heading_text,
- heading_source: owner.heading_source,
- level: owner.level,
- base: owner.base
- )
- end
- end
-
- def build_link_definitions(analysis)
- Array(analysis.statements).filter_map do |statement|
- next unless statement.respond_to?(:merge_type) && statement.merge_type == :link_definition
-
- position = statement.source_position
- next unless position
-
- LinkDefinitionOwner.new(
- location: Location.new(start_line: position[:start_line], end_line: position[:end_line]),
- label: statement.label,
- url: statement.url,
- title: statement.title,
- source: if statement.respond_to?(:content)
- statement.content
- else
- analysis.source_range(
- position[:start_line], position[:end_line]
- ).chomp
- end
- )
- end
- end
-
- def build_html_comments(analysis)
- analysis.comment_tracker.comment_nodes.map do |comment|
- HtmlCommentOwner.new(
- location: Location.new(start_line: comment.location.start_line, end_line: comment.location.end_line),
- text: comment.content,
- source: comment.text
- )
- end
- end
-
- def build_inline_references(analysis)
- analysis.source.to_s.lines.each_with_index.flat_map do |line, index|
- inline_references_for_line(line.chomp, index + 1)
- end
- end
-
- def build_table_rows(analysis)
- ast_table_lines = {}
- ast_rows = Array(analysis.statements).flat_map do |statement|
- node = unwrap_markdown_statement(statement)
- next [] unless node.respond_to?(:type) && node.type.to_s == 'table'
-
- table_position = node.source_position
- if table_position
- (table_position[:start_line]..table_position[:end_line]).each do |line|
- ast_table_lines[line] = true
- end
- end
- Array(node.children).filter_map do |child|
- next unless child.respond_to?(:type) && child.type.to_s == 'table_row'
-
- position = child.source_position
- next unless position
-
- TableRowOwner.new(
- location: Location.new(start_line: position[:start_line], end_line: position[:end_line]),
- source: analysis.source_range(position[:start_line], position[:end_line]),
- text: child.to_plaintext.to_s
- )
- end
- end
- ast_lines = ast_rows.map { |owner| owner.location.start_line }.to_h { |line| [line, true] }
- loose_rows = analysis.source.to_s.lines.each_with_index.filter_map do |line, index|
- line_number = index + 1
- next if ast_lines[line_number]
- next if ast_table_lines[line_number]
- next unless loose_table_row_line?(line)
-
- TableRowOwner.new(
- location: Location.new(start_line: line_number, end_line: line_number),
- source: line,
- text: line
- )
- end
- ast_rows + loose_rows
- end
-
- def loose_table_row_line?(line)
- stripped = line.to_s.lstrip
- return false unless stripped.start_with?('|')
-
- stripped.include?(' |') || stripped.include?('| ')
- end
-
- def heading_statement?(statement)
- merge_type = if statement.respond_to?(:merge_type)
- statement.merge_type
- else
- unwrap_markdown_statement(statement)&.type
- end
-
- %w[heading header].include?(merge_type.to_s)
- end
-
- def build_heading_owner(statement, analysis)
- node = unwrap_markdown_statement(statement)
- position = node&.source_position
- return unless node && position
-
- heading_source = analysis.source_range(position[:start_line], position[:end_line]).sub(/\n\z/, '')
- heading_text = node.to_plaintext.to_s.sub(/\n+\z/, '')
- HeadingSectionOwner.new(
- location: Location.new(start_line: position[:start_line], end_line: position[:end_line]),
- heading_text: heading_text,
- heading_source: heading_source,
- level: node.header_level,
- base: normalize_heading_base(heading_text)
- )
- rescue StandardError
- nil
- end
-
- def branch_end_line(headings, index, analysis)
- current = headings[index]
- cursor = index + 1
- while cursor < headings.length
- return headings[cursor].location.start_line - 1 if headings[cursor].level <= current.level
-
- cursor += 1
- end
-
- analysis.source.to_s.lines.length
- end
-
- def unwrap_markdown_statement(statement)
- if defined?(Ast::Merge::NodeTyping)
- Ast::Merge::NodeTyping.unwrap(statement)
- else
- statement
- end
- rescue StandardError
- statement
- end
-
- def normalize_heading_base(text)
- text.to_s.sub(/\A(?:\d\uFE0F?\u20E3|[^[:alnum:][:space:]])+[ \t]*/u, '').strip.downcase
- end
-
- def inline_references_for_line(line, line_number)
- owners = []
- index = 0
- while index < line.length
- image = inline_image_reference_at(line, index, line_number)
- if image
- owners << image
- index = image.end_column
- next
- end
-
- link = inline_link_reference_at(line, index, line_number)
- if link
- owners << link
- index = link.end_column
- next
- end
-
- index += 1
- end
- owners
- end
-
- def inline_image_reference_at(line, index, line_number)
- return unless line[index] == '!' && line[index + 1] == '['
-
- alt_end = closing_bracket_index(line, index + 1)
- return unless alt_end && line[alt_end + 1] == '['
-
- label_end = closing_bracket_index(line, alt_end + 1)
- return unless label_end
-
- label = line[(alt_end + 2)...label_end]
- inline_reference_owner(
- line: line,
- line_number: line_number,
- start_column: index,
- end_column: label_end + 1,
- reference_kind: :image_reference,
- label: label,
- labels: [label]
- )
- end
-
- def inline_link_reference_at(line, index, line_number)
- return unless line[index] == '['
-
- text_end = closing_bracket_index(line, index)
- return unless text_end && line[text_end + 1] == '['
-
- label_end = closing_bracket_index(line, text_end + 1)
- return unless label_end
-
- text = line[(index + 1)...text_end]
- label = line[(text_end + 2)...label_end]
- image_owner = inline_image_reference_at(text, 0, line_number)
- labels = [label]
- labels.unshift(image_owner.label) if image_owner && image_owner.source == text
- inline_reference_owner(
- line: line,
- line_number: line_number,
- start_column: index,
- end_column: label_end + 1,
- reference_kind: labels.length > 1 ? :linked_image_reference : :link_reference,
- label: label,
- labels: labels
- )
- end
-
- def inline_reference_owner(line:, line_number:, start_column:, end_column:, reference_kind:, label:, labels:)
- InlineReferenceOwner.new(
- location: Location.new(start_line: line_number, end_line: line_number),
- line: line_number,
- start_column: start_column,
- end_column: end_column,
- source: line[start_column...end_column],
- reference_kind: reference_kind,
- label: label,
- labels: labels.compact.uniq
- )
- end
-
- def closing_bracket_index(text, opening_index)
- depth = 0
- index = opening_index
- while index < text.length
- case text[index]
- when '['
- depth += 1
- when ']'
- depth -= 1
- return index if depth.zero?
- end
- index += 1
- end
- nil
- end
end
module Selectors
diff --git a/gems/ast-crispr-markdown-markly/spec/ast/crispr/markdown/markly_spec.rb b/gems/ast-crispr-markdown-markly/spec/ast/crispr/markdown/markly_spec.rb
index 30a18d2d5..b2f54d85a 100644
--- a/gems/ast-crispr-markdown-markly/spec/ast/crispr/markdown/markly_spec.rb
+++ b/gems/ast-crispr-markdown-markly/spec/ast/crispr/markdown/markly_spec.rb
@@ -127,12 +127,12 @@
context = Ast::Crispr::Markdown::Markly.document_context(content: content, source_label: 'README.md')
owners = context.structural_owners(owner_scope: :table_rows)
- expect(owners.map { |owner| [owner.location.start_line, owner.text] }).to eq([
- [3,
- "| Works with MRI Ruby | [![Ruby][💎ruby-3.2i]][🚎ruby-3.2-wf] |\n"],
- [4,
- "| Works with JRuby | [![JRuby][💎jruby-9.4i]][🚎jruby-9.4-wf] |\n"]
- ])
+ expect(owners.map { |owner| [owner.location.start_line, owner.source] }).to eq([
+ [3,
+ "| Works with MRI Ruby | [![Ruby][💎ruby-3.2i]][🚎ruby-3.2-wf] |\n"],
+ [4,
+ "| Works with JRuby | [![JRuby][💎jruby-9.4i]][🚎jruby-9.4-wf] |\n"]
+ ])
expect(owners.last.source).to include('Works with JRuby')
end
diff --git a/gems/ast-crispr-ruby-prism/.gitattributes b/gems/ast-crispr-ruby-prism/.gitattributes
index 0ac65aaa7..35a3c7359 100644
--- a/gems/ast-crispr-ruby-prism/.gitattributes
+++ b/gems/ast-crispr-ruby-prism/.gitattributes
@@ -1,5 +1,5 @@
# <> do not edit below this line
-*.rb diff=smorg-ruby
+*.rb diff=smorg-rb
*.go diff=smorg-go
*.rs diff=smorg-rs
# <>
diff --git a/gems/ast-crispr-ruby-prism/.kettle-drift.lock b/gems/ast-crispr-ruby-prism/.kettle-drift.lock
index 1dad17e1d..aa01ca527 100644
--- a/gems/ast-crispr-ruby-prism/.kettle-drift.lock
+++ b/gems/ast-crispr-ruby-prism/.kettle-drift.lock
@@ -4,7 +4,13 @@
"file": "Gemfile",
"lines": [
79,
- 119
+ 119,
+ 159,
+ 199,
+ 239,
+ 279,
+ 319,
+ 359
]
}
],
@@ -13,7 +19,13 @@
"file": "Gemfile",
"lines": [
90,
- 130
+ 130,
+ 170,
+ 210,
+ 250,
+ 290,
+ 330,
+ 370
]
}
],
@@ -22,7 +34,13 @@
"file": "Gemfile",
"lines": [
80,
- 120
+ 120,
+ 160,
+ 200,
+ 240,
+ 280,
+ 320,
+ 360
]
}
],
@@ -31,7 +49,13 @@
"file": "Gemfile",
"lines": [
92,
- 132
+ 132,
+ 172,
+ 212,
+ 252,
+ 292,
+ 332,
+ 372
]
}
],
@@ -40,7 +64,13 @@
"file": "Gemfile",
"lines": [
95,
- 135
+ 135,
+ 175,
+ 215,
+ 255,
+ 295,
+ 335,
+ 375
]
}
],
@@ -49,7 +79,13 @@
"file": "Gemfile",
"lines": [
81,
- 121
+ 121,
+ 161,
+ 201,
+ 241,
+ 281,
+ 321,
+ 361
]
}
],
@@ -59,7 +95,13 @@
"lines": [
59,
99,
- 139
+ 139,
+ 179,
+ 219,
+ 259,
+ 299,
+ 339,
+ 379
]
}
],
@@ -68,7 +110,13 @@
"file": "Gemfile",
"lines": [
100,
- 140
+ 140,
+ 180,
+ 220,
+ 260,
+ 300,
+ 340,
+ 380
]
}
],
@@ -78,7 +126,13 @@
"lines": [
42,
86,
- 126
+ 126,
+ 166,
+ 206,
+ 246,
+ 286,
+ 326,
+ 366
]
}
],
@@ -87,7 +141,13 @@
"file": "Gemfile",
"lines": [
109,
- 149
+ 149,
+ 189,
+ 229,
+ 269,
+ 309,
+ 349,
+ 389
]
}
],
@@ -97,7 +157,13 @@
"lines": [
34,
78,
- 118
+ 118,
+ 158,
+ 198,
+ 238,
+ 278,
+ 318,
+ 358
]
}
],
@@ -107,7 +173,13 @@
"lines": [
68,
108,
- 148
+ 148,
+ 188,
+ 228,
+ 268,
+ 308,
+ 348,
+ 388
]
}
],
@@ -116,7 +188,13 @@
"file": "Gemfile",
"lines": [
84,
- 124
+ 124,
+ 164,
+ 204,
+ 244,
+ 284,
+ 324,
+ 364
]
}
],
@@ -126,7 +204,13 @@
"lines": [
47,
91,
- 131
+ 131,
+ 171,
+ 211,
+ 251,
+ 291,
+ 331,
+ 371
]
}
],
@@ -136,7 +220,13 @@
"lines": [
43,
87,
- 127
+ 127,
+ 167,
+ 207,
+ 247,
+ 287,
+ 327,
+ 367
]
}
],
@@ -145,7 +235,13 @@
"file": "Gemfile",
"lines": [
85,
- 125
+ 125,
+ 165,
+ 205,
+ 245,
+ 285,
+ 325,
+ 365
]
}
],
@@ -154,7 +250,13 @@
"file": "Gemfile",
"lines": [
102,
- 142
+ 142,
+ 182,
+ 222,
+ 262,
+ 302,
+ 342,
+ 382
]
}
],
@@ -163,7 +265,13 @@
"file": "Gemfile",
"lines": [
101,
- 141
+ 141,
+ 181,
+ 221,
+ 261,
+ 301,
+ 341,
+ 381
]
}
],
@@ -172,7 +280,13 @@
"file": "Gemfile",
"lines": [
96,
- 136
+ 136,
+ 176,
+ 216,
+ 256,
+ 296,
+ 336,
+ 376
]
}
],
@@ -181,7 +295,13 @@
"file": "Gemfile",
"lines": [
105,
- 145
+ 145,
+ 185,
+ 225,
+ 265,
+ 305,
+ 345,
+ 385
]
}
],
diff --git a/gems/ast-crispr-ruby-prism/Gemfile b/gems/ast-crispr-ruby-prism/Gemfile
index 871cc8e98..43f132f05 100644
--- a/gems/ast-crispr-ruby-prism/Gemfile
+++ b/gems/ast-crispr-ruby-prism/Gemfile
@@ -151,7 +151,247 @@ if direct_sibling_gems.any? &&
end
end
-# Use the StructuredMerge TLSP branch until upstream ships Ruby 4-compatible gem metadata.
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+# Use the StructuredMerge TSLP branch until upstream ships Ruby 4-compatible gem metadata.
tslp_dev = ENV.fetch('TSLP_DEV', nil)
tslp_declared_by_templating =
ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? && !tslp_dev.to_s.empty?
@@ -160,7 +400,7 @@ unless tslp_declared_by_templating
gem(
'tree_sitter_language_pack',
git: 'https://github.com/structuredmerge/tree-sitter-language-pack.git',
- branch: 'fix/ruby-4-installs',
+ branch: 'fix/ruby-parser-api-methods',
glob: 'packages/ruby/*.gemspec'
)
else
@@ -168,7 +408,7 @@ unless tslp_declared_by_templating
end
end
-# Templating (env-switched: SMORG_RB_DEV=/path/to/structuredmerge/ruby/gems for local paths)
+# Templating (env-switched: STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local paths)
eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?
# Debugging
diff --git a/gems/ast-crispr-ruby-prism/Gemfile.lock b/gems/ast-crispr-ruby-prism/Gemfile.lock
index 95c539be8..06a81f5a4 100644
--- a/gems/ast-crispr-ruby-prism/Gemfile.lock
+++ b/gems/ast-crispr-ruby-prism/Gemfile.lock
@@ -1,41 +1,288 @@
-GIT
- remote: https://github.com/structuredmerge/tree-sitter-language-pack.git
- revision: dcc959b12d02d6e379abf1c8ac536a852d1b8416
- branch: fix/ruby-4-installs
- glob: packages/ruby/*.gemspec
- specs:
- tree_sitter_language_pack (1.12.5)
- rb_sys (>= 0.9, < 0.9.128)
- sorbet-runtime (~> 0.5)
-
PATH
remote: .
specs:
ast-crispr-ruby-prism (7.1.0)
ast-crispr (= 7.1.0)
- prism (>= 1.0)
+ prism-merge (= 7.1.0)
version_gem (~> 1.1, >= 1.1.9)
-GEM
- remote: https://gem.coop/
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-markdown-markly
+ specs:
+ ast-crispr-markdown-markly (7.1.0)
+ ast-crispr (= 7.1.0)
+ markly-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr
specs:
- addressable (2.9.0)
- public_suffix (>= 2.0.2, < 8.0)
- ansi (1.6.0)
- appraisal2 (3.1.4)
- bundler (>= 1.17.3)
- rake (>= 10)
- thor (>= 0.14)
- ast (2.4.3)
ast-crispr (7.1.0)
ast-merge (= 7.1.0)
service_actor (~> 3.9)
version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge-git
+ specs:
+ ast-merge-git (7.1.0)
+ ast-merge (= 7.1.0)
+ json-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge
+ specs:
ast-merge (7.1.0)
benchmark
token-resolver (~> 2.0, >= 2.0.4)
tree_haver (= 7.1.0)
version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-template
+ specs:
+ ast-template (7.1.0)
+ ast-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/bash-merge
+ specs:
+ bash-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.14)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/binary-merge
+ specs:
+ binary-merge (7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/citrus-toml-merge
+ specs:
+ citrus-toml-merge (7.1.0)
+ toml-merge (= 7.1.0)
+ toml-rb (~> 4.1)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/commonmarker-merge
+ specs:
+ commonmarker-merge (7.1.0)
+ commonmarker (~> 2.2)
+ markdown-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/dotenv-merge
+ specs:
+ dotenv-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.14)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/go-merge
+ specs:
+ go-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/json-merge
+ specs:
+ json-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/kettle-jem
+ specs:
+ kettle-jem (7.1.0)
+ addressable (>= 2.8, < 3)
+ ast-crispr-markdown-markly (= 7.1.0)
+ ast-crispr-ruby-prism (= 7.1.0)
+ ast-merge (= 7.1.0)
+ bash-merge (= 7.1.0)
+ citrus-toml-merge (= 7.1.0)
+ commonmarker-merge (= 7.1.0)
+ dotenv-merge (= 7.1.0)
+ json-merge (= 7.1.0)
+ kettle-dev (~> 2.3, >= 2.3.5)
+ kettle-rb (~> 0.1, >= 0.1.4)
+ kramdown-merge (= 7.1.0)
+ markdown-merge (= 7.1.0)
+ markly-merge (= 7.1.0)
+ prism-merge (= 7.1.0)
+ psych-merge (= 7.1.0)
+ rbs (>= 3.10)
+ rbs-merge (= 7.1.0)
+ ruby-merge (= 7.1.0)
+ token-resolver (~> 2.0, >= 2.0.4)
+ toml-merge (= 7.1.0)
+ toml-rb (~> 4.2)
+ tree_haver (= 7.1.0)
+ yaml-merge (= 7.1.0)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/kramdown-merge
+ specs:
+ kramdown-merge (7.1.0)
+ kramdown (~> 2.5)
+ markdown-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/markdown-merge
+ specs:
+ markdown-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/markly-merge
+ specs:
+ markly-merge (7.1.0)
+ markdown-merge (= 7.1.0)
+ markly (~> 0.9)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/parslet-toml-merge
+ specs:
+ parslet-toml-merge (7.1.0)
+ toml (~> 0.3)
+ toml-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/plain-merge
+ specs:
+ plain-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/prism-merge
+ specs:
+ prism-merge (7.1.0)
+ prism (~> 1.6)
+ ruby-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/psych-merge
+ specs:
+ psych-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+ yaml-merge (= 7.1.0)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/rbs-merge
+ specs:
+ rbs-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ rbs (>= 3.10)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.14)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ruby-merge
+ specs:
+ ruby-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/rust-merge
+ specs:
+ rust-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/smorg-rb
+ specs:
+ smorg-rb (7.1.0)
+ ast-merge (= 7.1.0)
+ ast-merge-git (= 7.1.0)
+ go-merge (= 7.1.0)
+ json-merge (= 7.1.0)
+ kettle-jem (= 7.1.0)
+ markly-merge (= 7.1.0)
+ plain-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/toml-merge
+ specs:
+ toml-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/tree_haver
+ specs:
+ tree_haver (7.1.0)
+ citrus (~> 3.0)
+ parslet (~> 2.0)
+ tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/typescript-merge
+ specs:
+ typescript-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/yaml-merge
+ specs:
+ yaml-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/zip-merge
+ specs:
+ zip-merge (7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /var/home/pboling/src/my/structuredmerge/vendor/tree-sitter-language-pack/packages/ruby
+ specs:
+ tree_sitter_language_pack (1.12.5)
+ rb_sys (>= 0.9, < 0.9.128)
+ sorbet-runtime (~> 0.5)
+
+GEM
+ remote: https://gem.coop/
+ specs:
+ addressable (2.9.0)
+ public_suffix (>= 2.0.2, < 8.0)
+ ansi (1.6.0)
+ appraisal2 (3.2.0)
+ bundler (>= 1.17.3)
+ rake (>= 10)
+ thor (>= 0.14)
+ ast (2.4.3)
backports (3.25.3)
benchmark (0.5.0)
bigdecimal (4.1.2)
@@ -44,6 +291,8 @@ GEM
thor (~> 1.0)
citrus (3.0.2)
cmdparse (3.0.7)
+ commonmarker (2.9.0-x86_64-linux)
+ commonmarker (2.9.0-x86_64-linux-musl)
concurrent-ruby (1.3.7)
date (3.5.1)
debug (1.11.1)
@@ -102,11 +351,13 @@ GEM
rdoc (>= 4.0.0)
reline (>= 0.4.2)
json (2.21.1)
- kettle-dev (2.3.6)
+ kettle-dev (2.3.7)
emoji_regex (>= 15.0)
kettle-rb (~> 0.1, >= 0.1.2)
kettle-test (~> 2.0, >= 2.0.4)
ruby-progressbar (~> 1.13)
+ kettle-drift (1.0.5)
+ version_gem (~> 1.1, >= 1.1.13)
kettle-rb (0.1.4)
kettle-soup-cover (1.1.3)
simplecov (~> 0.22)
@@ -135,6 +386,7 @@ GEM
language_server-protocol (3.17.0.6)
lint_roller (1.1.0)
logger (1.7.0)
+ markly (0.16.0)
mutex_m (0.3.0)
nokogiri (1.19.4-x86_64-linux-gnu)
racc (~> 1.4)
@@ -320,13 +572,13 @@ GEM
token-resolver (2.0.4)
parslet (~> 2.0)
version_gem (~> 1.1, >= 1.1.13)
- tree_haver (7.1.0)
- citrus (~> 3.0)
- parslet (~> 2.0)
- tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0)
- version_gem (~> 1.1, >= 1.1.9)
+ toml (0.3.0)
+ parslet (>= 1.8.0, < 3.0.0)
+ toml-rb (4.2.0)
+ citrus (~> 3.0, > 3.0)
+ racc (~> 1.7)
tsort (0.2.0)
- turbo_tests2 (3.1.14)
+ turbo_tests2 (3.2.0)
parallel_tests (>= 3.3.0, < 6)
rspec (>= 3.10)
version_gem (~> 1.1, >= 1.1.14)
@@ -351,7 +603,7 @@ GEM
yard
yard-relative_markdown_links (0.6.0)
nokogiri (>= 1.14.3, < 2)
- yard-timekeeper (0.2.3)
+ yard-timekeeper (0.2.4)
version_gem (~> 1.1, >= 1.1.13)
yard-yaml (0.2.3)
version_gem (~> 1.1, >= 1.1.13)
@@ -366,23 +618,45 @@ PLATFORMS
DEPENDENCIES
addressable (>= 2.8, < 3)
appraisal2 (~> 3.0, >= 3.0.6)
+ ast-crispr!
+ ast-crispr-markdown-markly!
ast-crispr-ruby-prism!
+ ast-merge!
+ ast-merge-git!
+ ast-template!
+ bash-merge!
benchmark (~> 0.5, >= 0.5.0)
+ binary-merge!
bundler-audit (~> 0.9.3)
+ citrus-toml-merge!
+ commonmarker-merge!
debug (>= 1.1)
+ dotenv-merge!
erb (~> 6.0, >= 6.0.4)
gem_bench (~> 2.0, >= 2.0.5)
gitmoji-regex (~> 2.0, >= 2.0.0)
+ go-merge!
irb (~> 1.17)
+ json-merge!
kettle-dev (~> 2.0, >= 2.2.25)
+ kettle-drift (~> 1.0, >= 1.0.5)
+ kettle-jem!
kettle-soup-cover (~> 1.0, >= 1.1.3)
kettle-test (~> 2.0, >= 2.0.9)
kramdown (~> 2.5, >= 2.5.1)
+ kramdown-merge!
kramdown-parser-gfm (~> 1.1)
+ markdown-merge!
+ markly-merge!
mutex_m (~> 0.2)
nomono (~> 1.0, >= 1.0.8)
+ parslet-toml-merge!
+ plain-merge!
+ prism-merge!
+ psych-merge!
rake (~> 13.0)
rbs (>= 3.0)
+ rbs-merge!
rdoc (~> 6.11)
reek (~> 6.5)
require_bench (~> 1.0, >= 1.0.4)
@@ -391,33 +665,50 @@ DEPENDENCIES
rubocop-packaging (~> 0.6, >= 0.6.0)
rubocop-rspec (~> 3.6)
rubocop-ruby3_2 (~> 3.0.0)
+ ruby-merge!
ruby-progressbar (~> 1.13)
+ rust-merge!
+ smorg-rb!
standard (>= 1.50)
stone_checksums (~> 1.0, >= 1.0.3)
stringio (>= 3.0)
+ toml-merge!
+ tree_haver!
tree_sitter_language_pack!
+ typescript-merge!
yaml-converter (~> 0.1)
+ yaml-merge!
yard (~> 0.9, >= 0.9.44)
yard-fence (~> 0.9, >= 0.9.1)
yard-junk (~> 0.1, >= 0.1.0)
yard-relative_markdown_links (~> 0.6)
yard-timekeeper (~> 0.1)
yard-yaml (~> 0.1, >= 0.1.2)
+ zip-merge!
CHECKSUMS
addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af
ansi (1.6.0) sha256=ac9ea0c0ea8d32fb4e271348e609963ac78882f34b73836c2a02b3622e666658
- appraisal2 (3.1.4) sha256=f88c27e600adf4bd5bf06c0ab0afd1de6ce4361497760ce35e86e782036286f4
+ appraisal2 (3.2.0) sha256=ccd0b767ac4060cd7af6d16747459b6990f49c39c7b4fb1f7d1146b1e97c492f
ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
ast-crispr (7.1.0)
+ ast-crispr-markdown-markly (7.1.0)
ast-crispr-ruby-prism (7.1.0)
ast-merge (7.1.0)
+ ast-merge-git (7.1.0)
+ ast-template (7.1.0)
backports (3.25.3) sha256=94298d32dc3c40ca15633b54e282780b49e2db0c045f602ea1907e4f63a17235
+ bash-merge (7.1.0)
benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c
bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd
+ binary-merge (7.1.0)
bundler-audit (0.9.3) sha256=81c8766c71e47d0d28a0f98c7eed028539f21a6ea3cd8f685eb6f42333c9b4e9
citrus (3.0.2) sha256=4ec2412fc389ad186735f4baee1460f7900a8e130ffe3f216b30d4f9c684f650
+ citrus-toml-merge (7.1.0)
cmdparse (3.0.7) sha256=f7c5cace10bec6abf853370ae095e4b97a84ed9d847b3fb38f41cc4fbc950739
+ commonmarker (2.9.0-x86_64-linux) sha256=8cfe92970eef585a19ddf6613224b91cab64d6029834661bda801f877c9c7f43
+ commonmarker (2.9.0-x86_64-linux-musl) sha256=293921398b839f79ceaf55010e061357e34f053822c3b003cd0be6686176335e
+ commonmarker-merge (7.1.0)
concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0
date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0
debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6
@@ -425,6 +716,7 @@ CHECKSUMS
diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962
diffy (3.4.4) sha256=79384ab5ca82d0e115b2771f0961e27c164c456074bd2ec46b637ebf7b6e47e3
docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e
+ dotenv-merge (7.1.0)
dry-configurable (1.4.0) sha256=e35d1b5f3c081753ef361f564919db79000f32cfa6f20ee3a3ba5921b41b73ce
dry-core (1.2.0) sha256=0cc5a7da88df397f153947eeeae42e876e999c1e30900f3c536fb173854e96a1
dry-inflector (1.3.1) sha256=7fb0c2bb04f67638f25c52e7ba39ab435d922a3a5c3cd196120f63accb682dcc
@@ -437,19 +729,27 @@ CHECKSUMS
gem_bench (2.0.5) sha256=0dc0fb44a5a5eb7b2f5c1c68a5b0164d72007132822c012bac3abe976b199ead
geom2d (0.4.1) sha256=ea0998ea90c4f2752e24fe13d85a4f89bee689d151316140ebcc6369bf634ed9
gitmoji-regex (2.0.4) sha256=01410d3217940bd0e7b2299ec805245afe8d0f06a5d6d38f623d63a63c0ac34f
+ go-merge (7.1.0)
hexapdf (1.9.1) sha256=2d1f6a3622e6bc2a70a707d4c3f3fa44f5552ecd9d899f6283abb07398a84884
io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc
irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3
json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583
- kettle-dev (2.3.6) sha256=955b01e8aca46438365332d1b4413f22cb58dabfeab5cba04d71237c53cc70ae
+ json-merge (7.1.0)
+ kettle-dev (2.3.7) sha256=eb370113cd030d03cbe2d33b31c99858951017e5ad21a17e9ed89dc3770028ee
+ kettle-drift (1.0.5) sha256=07094e80140a049164142820bdd327c30fcd855bb00697a0a430600a2b5144a2
+ kettle-jem (7.1.0)
kettle-rb (0.1.4) sha256=9cef7ce4f7021666b7222292f29051e51eaf042e8a5db11f3f4dd72f74243fc1
kettle-soup-cover (1.1.3) sha256=a373827da22a7131d093afd32945e5b7d7a10a01ebfdded8fd2cb8230d69c8ad
kettle-test (2.0.11) sha256=c710c90f7ab79d51f9452f0c09f5f90657e7a893f63583855c164d0b1b107ab2
kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa
+ kramdown-merge (7.1.0)
kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729
language_server-protocol (3.17.0.6) sha256=5ef2c0c138f8267e1bc631d3328347d354f96724b0af22f2c79516120443b7f0
lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87
logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
+ markdown-merge (7.1.0)
+ markly (0.16.0) sha256=6f70d79e385b1efc9e171f74c81628826259039fe6c778e03c3924c71dac5511
+ markly-merge (7.1.0)
mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751
nokogiri (1.19.4-x86_64-linux-gnu) sha256=379fae440b28915e3f19d752ce2dcf8465ed2b2fbefd2a7ca0dd497bc981a06a
nokogiri (1.19.4-x86_64-linux-musl) sha256=17dfb7c1fa194ae02fbf7c51a7afc8d278045ab3fdacfd86f91d02d7b274470b
@@ -460,10 +760,14 @@ CHECKSUMS
parallel_tests (5.7.0) sha256=3f1762c46ca2c223b8af8ef877217f9d76974e191bfa934f2580b58bcf1d005c
parser (3.3.12.0) sha256=21a6d7f755d5a24dfbdc6e6b772e4e879a52e7631a88bc5a3a134606052c9828
parslet (2.0.0) sha256=d45130695d39b43d7e6a91f4d2ec66b388a8d822bae38de9b4de9a5fbde1f606
+ parslet-toml-merge (7.1.0)
+ plain-merge (7.1.0)
pp (0.6.4) sha256=dfcb0fce700c41456265922884f9fe195d7fbb0674a3578e6c0f69588e82b570
prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193
prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85
+ prism-merge (7.1.0)
psych (5.4.0) sha256=14f72d69a611af663d7d70e4a7b67d9eb1f3ae9f8d916b478961d5a0075ba5b7
+ psych-merge (7.1.0)
public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623
racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
@@ -471,6 +775,7 @@ CHECKSUMS
rake-compiler-dock (1.12.0) sha256=f13205c2738f3d2053afcd03491a9e4541b22a59a0bfc53fc8bc883bd8188023
rb_sys (0.9.127) sha256=e9f90df3bb0577472d26d96127d5b5774b98f44de881e7d36aeefd28d6337847
rbs (4.0.3) sha256=5a7bf70e2628549d9a1f44eae447b2cfe55968a9c60cfff52693a4bdcc020e14
+ rbs-merge (7.1.0)
rdoc (6.17.0) sha256=0f50d4e568fc98195f9bb155a9e8dff6c7feabfb515fb22ef6df1d12ad5a02b7
reek (6.5.0) sha256=d26d3a492773b2bbc228888067a21afe33ac07954a17dbd64cdeae42c4c69be1
regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb
@@ -498,9 +803,11 @@ CHECKSUMS
rubocop-rspec (3.10.2) sha256=0b3e2ecc592cd10ecbf0095bb58d1e357905276e069643523cc19eb7495f65e2
rubocop-ruby3_2 (3.0.7) sha256=f53dd6d286fb05186214fc6ec116783e7f837030918e8931c05de773e98f8466
rubocop-thread_safety (0.7.3) sha256=067cdd52fbf5deffc18995437e45b5194236eaff4f71de3375a1f6052e48f431
+ ruby-merge (7.1.0)
ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
ruby_engine (2.0.3) sha256=ca2ae7def8cfcdc2bfb6a186d36d5d59c8b403245dc0256c3802b767fa278aaa
ruby_version (1.0.3) sha256=5930f9950746b7e6c973184398ee364ee7440b170fef7922b9f5cdf317f1ccb5
+ rust-merge (7.1.0)
service_actor (3.9.4) sha256=e63b523630b9a7e62959b2a90113b08d2565b5de9c148557b281ef847c9539ce
silent_stream (1.0.12) sha256=377c43aa10033fe90c33b39ea8cd97d79f2d1c4856df598efc56f3091f3ae782
simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5
@@ -510,6 +817,7 @@ CHECKSUMS
simplecov-lcov (0.9.0) sha256=7a77a31e200a595ed4b0249493056efd0c920601f53d2ef135ca34ee796346cd
simplecov-rcov (0.3.7) sha256=372f50bf6df6b6350b7d0c840f2f8bdabe021861a43c26877b747c9ac96139fc
simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428
+ smorg-rb (7.1.0)
sorbet-runtime (0.6.13342) sha256=dbeb9892597f593ed2b29e38018912787f6c4e0c4b736d8af0d6bd3c63bde3c3
standard (1.56.0) sha256=ae2af4d9669589162ac69ed5ef59dcf9f346d4afc81f7e62b84339310dfcb787
standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b
@@ -523,21 +831,27 @@ CHECKSUMS
timecop (0.9.11) sha256=41284dc6e5041f2184f781ace766f942108c842f8d8c1386a26e6343decc7542
timecop-rspec (1.0.3) sha256=005f14841bb606dcaefb060e321b5388e2e59537742bee8b3a9a9a40e598fab9
token-resolver (2.0.4) sha256=33b926958f504525bba3ed511ab66fbcbf8ef30390815e931436b30f27ffcad0
+ toml (0.3.0) sha256=0a91d0f76a9036e84e44f95693b12f58d358c1df3ac8e3b5271f2056ecc6e4b9
+ toml-merge (7.1.0)
+ toml-rb (4.2.0) sha256=10a48c91613e20cf63483a7a776767dfb3cd7d70e9327c0237443da601e13776
tree_haver (7.1.0)
tree_sitter_language_pack (1.12.5)
tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f
- turbo_tests2 (3.1.14) sha256=cc29d5b36bdbba67a83eee09a9546880d0926edfbbe50d99633fc0b5763ee94c
+ turbo_tests2 (3.2.0) sha256=8b35421548399d1923567b177970f42671c65695b93cdd134d78fbcbab85dff0
+ typescript-merge (7.1.0)
unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42
unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f
version_gem (1.1.14) sha256=6b7306c7e9416d06067561981ab3444e2cecb844f26cc325ae3c27b44cf85613
yaml-converter (0.2.3) sha256=d35e69e547610d9e347672cc277fcb7d71dff3c53a942e66f82b1c64022ada72
+ yaml-merge (7.1.0)
yard (0.9.45) sha256=52e211493f7cb8a3ebf7e104a25a1e73937a3103092545d34cb88fafebb3dc51
yard-fence (0.9.6) sha256=3d1dbf4e3df462ac78b8bd2e01cf740a2de20168387c929aca31a0bcee490659
yard-junk (0.1.0) sha256=e85fe2ec1afa47313decd333447b53458cb1ed49b510b70015fdc3041a94bcdd
yard-relative_markdown_links (0.6.0) sha256=3e5ffa85cbad9bac70bee5421774b190fb25d3bdf489323a5b3534f647d1a70e
- yard-timekeeper (0.2.3) sha256=849a3e74a0484b1e0b5209cf86823e418b3091e21f4f143c141d38e1cc262034
+ yard-timekeeper (0.2.4) sha256=62f8d001d737c6e2ac688e7b37386f958dceb0f6aff9c909575e1bec8d20775a
yard-yaml (0.2.3) sha256=fe5fef18819e1cbd05bb8f1b9e1baad6bf70c28125eb75b57bbf6397b0831812
zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12
+ zip-merge (7.1.0)
zlib (3.2.3) sha256=5bd316698b32f31a64ab910a8b6c282442ca1626a81bbd6a1674e8522e319c20
BUNDLED WITH
diff --git a/gems/ast-crispr-ruby-prism/ast-crispr-ruby-prism.gemspec b/gems/ast-crispr-ruby-prism/ast-crispr-ruby-prism.gemspec
index b9d1753d2..ad4457d9d 100644
--- a/gems/ast-crispr-ruby-prism/ast-crispr-ruby-prism.gemspec
+++ b/gems/ast-crispr-ruby-prism/ast-crispr-ruby-prism.gemspec
@@ -96,7 +96,7 @@ Gem::Specification.new do |spec|
# Utilities
spec.add_dependency 'ast-crispr', "= #{spec.version}"
- spec.add_dependency 'prism', '>= 1.0'
+ spec.add_dependency 'prism-merge', "= #{spec.version}"
spec.add_dependency('version_gem', '~> 1.1', '>= 1.1.9') # ruby >= 2.2.0
# NOTE: It is preferable to list development dependencies in the gemspec due to increased
diff --git a/gems/ast-crispr-ruby-prism/gemfiles/modular/templating.gemfile b/gems/ast-crispr-ruby-prism/gemfiles/modular/templating.gemfile
index 0d1c9bcf4..e3c24e6b7 100644
--- a/gems/ast-crispr-ruby-prism/gemfiles/modular/templating.gemfile
+++ b/gems/ast-crispr-ruby-prism/gemfiles/modular/templating.gemfile
@@ -1,9 +1,9 @@
# frozen_string_literal: true
-smorg_remote = ENV.fetch('SMORG_RB_DEV', 'false').casecmp('false').zero?
+structuredmerge_remote = ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false').zero?
kettle_remote = ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero?
-if smorg_remote
+if structuredmerge_remote
# Merge recipes and parser dependencies for released installs.
gem 'kettle-jem', '>= 7.0'
end
@@ -13,10 +13,10 @@ if kettle_remote
gem 'kettle-drift', '~> 1.0', '>= 1.0.5', require: false
end
-# Set SMORG_RB_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies.
+# Set STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies.
# When false (default / CI), released kettle-jem brings merge gems and parser dependencies.
# Local path overrides bring the same dependencies from sibling gemspecs.
#
# Set KETTLE_RB_DEV=/path/to/kettle-rb for local development with Kettle plugin gems.
# When false (default / CI), released Kettle plugin gems are used.
-eval_gemfile 'templating_local.gemfile' unless smorg_remote && kettle_remote
+eval_gemfile 'templating_local.gemfile' unless structuredmerge_remote && kettle_remote
diff --git a/gems/ast-crispr-ruby-prism/gemfiles/modular/templating_local.gemfile b/gems/ast-crispr-ruby-prism/gemfiles/modular/templating_local.gemfile
index a7c0be566..b5268538e 100644
--- a/gems/ast-crispr-ruby-prism/gemfiles/modular/templating_local.gemfile
+++ b/gems/ast-crispr-ruby-prism/gemfiles/modular/templating_local.gemfile
@@ -1,12 +1,12 @@
# frozen_string_literal: true
# Local path overrides for templating development.
-# Loaded by the associated non-local gemfile when SMORG_RB_DEV or KETTLE_RB_DEV
+# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_RB_DEV
# is not "false".
require 'nomono/bundler' unless defined?(Nomono)
-smorg_rb_local_gems = %w[
+structuredmerge_local_gems = %w[
tree_haver
ast-merge
ast-merge-git
@@ -43,7 +43,7 @@ kettle_rb_local_gems = %w[
kettle-dev kettle-test kettle-soup-cover kettle-drift
]
declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name)
-smorg_rb_local_gems_to_eval = smorg_rb_local_gems - %w[ast-crispr-ruby-prism] - declared_gems
+structuredmerge_local_gems_to_eval = structuredmerge_local_gems - %w[ast-crispr-ruby-prism] - declared_gems
kettle_rb_local_gems_to_eval = kettle_rb_local_gems - %w[ast-crispr-ruby-prism] - declared_gems
tslp_dev = ENV.fetch('TSLP_DEV', nil)
@@ -52,14 +52,14 @@ tslp_dev = ENV.fetch('TSLP_DEV', nil)
platform :mri do
gem 'tree_sitter_language_pack', path: tslp_dev unless tslp_dev.to_s.empty?
- if ENV.fetch('SMORG_RB_DEV', 'false').casecmp('false') != 0
+ if ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false') != 0
eval_nomono_gems(
- gems: smorg_rb_local_gems_to_eval,
- prefix: 'SMORG_RB',
- path_env: 'SMORG_RB_DEV',
+ gems: structuredmerge_local_gems_to_eval,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
vendored_gems_env: 'VENDORED_GEMS',
vendor_gem_dir_env: 'VENDOR_GEM_DIR',
- debug_env: 'SMORG_RB_DEBUG'
+ debug_env: 'STRUCTUREDMERGE_DEBUG'
)
end
diff --git a/gems/ast-crispr-ruby-prism/lib/ast/crispr/ruby/prism.rb b/gems/ast-crispr-ruby-prism/lib/ast/crispr/ruby/prism.rb
index 13bd8113e..41025a28f 100644
--- a/gems/ast-crispr-ruby-prism/lib/ast/crispr/ruby/prism.rb
+++ b/gems/ast-crispr-ruby-prism/lib/ast/crispr/ruby/prism.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
require 'ast/crispr'
-require 'prism'
+require 'prism/merge'
require 'version_gem'
require_relative 'prism/version'
@@ -14,66 +14,43 @@ class Error < StandardError; end
module Utils
module_function
- def parse_with_comments(source)
- ::Prism.parse(source)
- end
-
- def extract_statements(body_node)
- return [] unless body_node
-
- if body_node.is_a?(::Prism::StatementsNode)
- body_node.body.compact
- else
- [body_node].compact
- end
+ def parse_analysis(source, source_label: nil)
+ ::Prism::Merge::FileAnalysis.new(source, source_label: source_label)
end
- def find_leading_comments(parse_result, current_stmt, prev_stmt, body_node)
- start_line = prev_stmt ? prev_stmt.location.end_line : body_node.location.start_line
- end_line = current_stmt.location.start_line
-
- parse_result.comments.select do |comment|
- comment.location.start_line > start_line &&
- comment.location.start_line < end_line
- end
+ def parse_with_comments(source)
+ parse_analysis(source).parse_result
end
end
class Adapter
def read_ast(document)
- result = Utils.parse_with_comments(document.content)
- return result if result.success?
+ analysis = Utils.parse_analysis(document.content, source_label: document.source_label)
+ return analysis if analysis.valid?
raise Ast::Crispr::Error.new("Unable to read structural owners from #{document.source_label}",
details: { source_label: document.source_label })
end
def structural_owners(document, owner_scope: :shared_default)
- parse_result = document.ast
+ analysis = document.ast
case owner_scope
when :shared_default, :line_bound_statements, :top_level_statements
- Utils.extract_statements(parse_result.value.statements)
+ analysis.statements
when :ruby_comments
- parse_result.comments
+ analysis.parse_result.comments
else
raise Ast::Crispr::Error.new('Unsupported CRISPR owner scope', details: { owner_scope: owner_scope })
end
end
def comment_regions_for(document, owner, region: :leading, owner_scope: :shared_default)
- parse_result = document.ast
+ analysis = document.ast
owners = structural_owners(document, owner_scope: owner_scope)
- index = owners.index(owner)
- return [] unless index
case region
when :leading
- previous_owner = index.positive? ? owners[index - 1] : nil
- if previous_owner
- Utils.find_leading_comments(parse_result, owner, previous_owner, parse_result.value.statements)
- else
- parse_result.comments.select { |comment| comment.location.start_line < owner.location.start_line }
- end
+ analysis.leading_comments_for_owner(owner, owners: owners)
else
raise Ast::Crispr::Error.new('Unsupported CRISPR comment region', details: { region: region })
end
diff --git a/gems/ast-crispr-ruby-prism/spec/ast/crispr/ruby/prism_spec.rb b/gems/ast-crispr-ruby-prism/spec/ast/crispr/ruby/prism_spec.rb
index 790eb77c0..78002983c 100644
--- a/gems/ast-crispr-ruby-prism/spec/ast/crispr/ruby/prism_spec.rb
+++ b/gems/ast-crispr-ruby-prism/spec/ast/crispr/ruby/prism_spec.rb
@@ -12,6 +12,15 @@
expect(context.adapter).to be_a(Ast::Crispr::Ruby::Prism::Adapter)
end
+ it 'uses prism-merge analysis for Ruby structure' do
+ analysis = described_class::Utils.parse_analysis("puts :ok\n", source_label: 'example.rb')
+ result = described_class::Utils.parse_with_comments("puts :ok\n")
+
+ expect(analysis).to be_a(::Prism::Merge::FileAnalysis)
+ expect(analysis).to be_valid
+ expect(result).to be_success
+ end
+
context 'with a structure profile' do
let(:context) { described_class.document_context(content: "puts :ok\n", source_label: 'example.rb') }
let(:profile) { context.structure_profile(owner_scope: :top_level_statements) }
diff --git a/gems/ast-crispr/.gitattributes b/gems/ast-crispr/.gitattributes
index 0ac65aaa7..35a3c7359 100644
--- a/gems/ast-crispr/.gitattributes
+++ b/gems/ast-crispr/.gitattributes
@@ -1,5 +1,5 @@
# <> do not edit below this line
-*.rb diff=smorg-ruby
+*.rb diff=smorg-rb
*.go diff=smorg-go
*.rs diff=smorg-rs
# <>
diff --git a/gems/ast-crispr/.kettle-drift.lock b/gems/ast-crispr/.kettle-drift.lock
index 1dad17e1d..aa01ca527 100644
--- a/gems/ast-crispr/.kettle-drift.lock
+++ b/gems/ast-crispr/.kettle-drift.lock
@@ -4,7 +4,13 @@
"file": "Gemfile",
"lines": [
79,
- 119
+ 119,
+ 159,
+ 199,
+ 239,
+ 279,
+ 319,
+ 359
]
}
],
@@ -13,7 +19,13 @@
"file": "Gemfile",
"lines": [
90,
- 130
+ 130,
+ 170,
+ 210,
+ 250,
+ 290,
+ 330,
+ 370
]
}
],
@@ -22,7 +34,13 @@
"file": "Gemfile",
"lines": [
80,
- 120
+ 120,
+ 160,
+ 200,
+ 240,
+ 280,
+ 320,
+ 360
]
}
],
@@ -31,7 +49,13 @@
"file": "Gemfile",
"lines": [
92,
- 132
+ 132,
+ 172,
+ 212,
+ 252,
+ 292,
+ 332,
+ 372
]
}
],
@@ -40,7 +64,13 @@
"file": "Gemfile",
"lines": [
95,
- 135
+ 135,
+ 175,
+ 215,
+ 255,
+ 295,
+ 335,
+ 375
]
}
],
@@ -49,7 +79,13 @@
"file": "Gemfile",
"lines": [
81,
- 121
+ 121,
+ 161,
+ 201,
+ 241,
+ 281,
+ 321,
+ 361
]
}
],
@@ -59,7 +95,13 @@
"lines": [
59,
99,
- 139
+ 139,
+ 179,
+ 219,
+ 259,
+ 299,
+ 339,
+ 379
]
}
],
@@ -68,7 +110,13 @@
"file": "Gemfile",
"lines": [
100,
- 140
+ 140,
+ 180,
+ 220,
+ 260,
+ 300,
+ 340,
+ 380
]
}
],
@@ -78,7 +126,13 @@
"lines": [
42,
86,
- 126
+ 126,
+ 166,
+ 206,
+ 246,
+ 286,
+ 326,
+ 366
]
}
],
@@ -87,7 +141,13 @@
"file": "Gemfile",
"lines": [
109,
- 149
+ 149,
+ 189,
+ 229,
+ 269,
+ 309,
+ 349,
+ 389
]
}
],
@@ -97,7 +157,13 @@
"lines": [
34,
78,
- 118
+ 118,
+ 158,
+ 198,
+ 238,
+ 278,
+ 318,
+ 358
]
}
],
@@ -107,7 +173,13 @@
"lines": [
68,
108,
- 148
+ 148,
+ 188,
+ 228,
+ 268,
+ 308,
+ 348,
+ 388
]
}
],
@@ -116,7 +188,13 @@
"file": "Gemfile",
"lines": [
84,
- 124
+ 124,
+ 164,
+ 204,
+ 244,
+ 284,
+ 324,
+ 364
]
}
],
@@ -126,7 +204,13 @@
"lines": [
47,
91,
- 131
+ 131,
+ 171,
+ 211,
+ 251,
+ 291,
+ 331,
+ 371
]
}
],
@@ -136,7 +220,13 @@
"lines": [
43,
87,
- 127
+ 127,
+ 167,
+ 207,
+ 247,
+ 287,
+ 327,
+ 367
]
}
],
@@ -145,7 +235,13 @@
"file": "Gemfile",
"lines": [
85,
- 125
+ 125,
+ 165,
+ 205,
+ 245,
+ 285,
+ 325,
+ 365
]
}
],
@@ -154,7 +250,13 @@
"file": "Gemfile",
"lines": [
102,
- 142
+ 142,
+ 182,
+ 222,
+ 262,
+ 302,
+ 342,
+ 382
]
}
],
@@ -163,7 +265,13 @@
"file": "Gemfile",
"lines": [
101,
- 141
+ 141,
+ 181,
+ 221,
+ 261,
+ 301,
+ 341,
+ 381
]
}
],
@@ -172,7 +280,13 @@
"file": "Gemfile",
"lines": [
96,
- 136
+ 136,
+ 176,
+ 216,
+ 256,
+ 296,
+ 336,
+ 376
]
}
],
@@ -181,7 +295,13 @@
"file": "Gemfile",
"lines": [
105,
- 145
+ 145,
+ 185,
+ 225,
+ 265,
+ 305,
+ 345,
+ 385
]
}
],
diff --git a/gems/ast-crispr/Gemfile b/gems/ast-crispr/Gemfile
index 2ebdddbb1..408241295 100644
--- a/gems/ast-crispr/Gemfile
+++ b/gems/ast-crispr/Gemfile
@@ -151,7 +151,247 @@ if direct_sibling_gems.any? &&
end
end
-# Use the StructuredMerge TLSP branch until upstream ships Ruby 4-compatible gem metadata.
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+# Use the StructuredMerge TSLP branch until upstream ships Ruby 4-compatible gem metadata.
tslp_dev = ENV.fetch('TSLP_DEV', nil)
tslp_declared_by_templating =
ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? && !tslp_dev.to_s.empty?
@@ -160,7 +400,7 @@ unless tslp_declared_by_templating
gem(
'tree_sitter_language_pack',
git: 'https://github.com/structuredmerge/tree-sitter-language-pack.git',
- branch: 'fix/ruby-4-installs',
+ branch: 'fix/ruby-parser-api-methods',
glob: 'packages/ruby/*.gemspec'
)
else
@@ -168,7 +408,7 @@ unless tslp_declared_by_templating
end
end
-# Templating (env-switched: SMORG_RB_DEV=/path/to/structuredmerge/ruby/gems for local paths)
+# Templating (env-switched: STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local paths)
eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?
# Debugging
diff --git a/gems/ast-crispr/Gemfile.lock b/gems/ast-crispr/Gemfile.lock
index 72148c0bf..0b6a216c5 100644
--- a/gems/ast-crispr/Gemfile.lock
+++ b/gems/ast-crispr/Gemfile.lock
@@ -1,13 +1,3 @@
-GIT
- remote: https://github.com/structuredmerge/tree-sitter-language-pack.git
- revision: dcc959b12d02d6e379abf1c8ac536a852d1b8416
- branch: fix/ruby-4-installs
- glob: packages/ruby/*.gemspec
- specs:
- tree_sitter_language_pack (1.12.5)
- rb_sys (>= 0.9, < 0.9.128)
- sorbet-runtime (~> 0.5)
-
PATH
remote: .
specs:
@@ -16,22 +6,283 @@ PATH
service_actor (~> 3.9)
version_gem (~> 1.1, >= 1.1.9)
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-markdown-markly
+ specs:
+ ast-crispr-markdown-markly (7.1.0)
+ ast-crispr (= 7.1.0)
+ markly-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-ruby-prism
+ specs:
+ ast-crispr-ruby-prism (7.1.0)
+ ast-crispr (= 7.1.0)
+ prism-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge-git
+ specs:
+ ast-merge-git (7.1.0)
+ ast-merge (= 7.1.0)
+ json-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge
+ specs:
+ ast-merge (7.1.0)
+ benchmark
+ token-resolver (~> 2.0, >= 2.0.4)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-template
+ specs:
+ ast-template (7.1.0)
+ ast-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/bash-merge
+ specs:
+ bash-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.14)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/binary-merge
+ specs:
+ binary-merge (7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/citrus-toml-merge
+ specs:
+ citrus-toml-merge (7.1.0)
+ toml-merge (= 7.1.0)
+ toml-rb (~> 4.1)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/commonmarker-merge
+ specs:
+ commonmarker-merge (7.1.0)
+ commonmarker (~> 2.2)
+ markdown-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/dotenv-merge
+ specs:
+ dotenv-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.14)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/go-merge
+ specs:
+ go-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/json-merge
+ specs:
+ json-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/kettle-jem
+ specs:
+ kettle-jem (7.1.0)
+ addressable (>= 2.8, < 3)
+ ast-crispr-markdown-markly (= 7.1.0)
+ ast-crispr-ruby-prism (= 7.1.0)
+ ast-merge (= 7.1.0)
+ bash-merge (= 7.1.0)
+ citrus-toml-merge (= 7.1.0)
+ commonmarker-merge (= 7.1.0)
+ dotenv-merge (= 7.1.0)
+ json-merge (= 7.1.0)
+ kettle-dev (~> 2.3, >= 2.3.5)
+ kettle-rb (~> 0.1, >= 0.1.4)
+ kramdown-merge (= 7.1.0)
+ markdown-merge (= 7.1.0)
+ markly-merge (= 7.1.0)
+ prism-merge (= 7.1.0)
+ psych-merge (= 7.1.0)
+ rbs (>= 3.10)
+ rbs-merge (= 7.1.0)
+ ruby-merge (= 7.1.0)
+ token-resolver (~> 2.0, >= 2.0.4)
+ toml-merge (= 7.1.0)
+ toml-rb (~> 4.2)
+ tree_haver (= 7.1.0)
+ yaml-merge (= 7.1.0)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/kramdown-merge
+ specs:
+ kramdown-merge (7.1.0)
+ kramdown (~> 2.5)
+ markdown-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/markdown-merge
+ specs:
+ markdown-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/markly-merge
+ specs:
+ markly-merge (7.1.0)
+ markdown-merge (= 7.1.0)
+ markly (~> 0.9)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/parslet-toml-merge
+ specs:
+ parslet-toml-merge (7.1.0)
+ toml (~> 0.3)
+ toml-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/plain-merge
+ specs:
+ plain-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/prism-merge
+ specs:
+ prism-merge (7.1.0)
+ prism (~> 1.6)
+ ruby-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/psych-merge
+ specs:
+ psych-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+ yaml-merge (= 7.1.0)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/rbs-merge
+ specs:
+ rbs-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ rbs (>= 3.10)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.14)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ruby-merge
+ specs:
+ ruby-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/rust-merge
+ specs:
+ rust-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/smorg-rb
+ specs:
+ smorg-rb (7.1.0)
+ ast-merge (= 7.1.0)
+ ast-merge-git (= 7.1.0)
+ go-merge (= 7.1.0)
+ json-merge (= 7.1.0)
+ kettle-jem (= 7.1.0)
+ markly-merge (= 7.1.0)
+ plain-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/toml-merge
+ specs:
+ toml-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/tree_haver
+ specs:
+ tree_haver (7.1.0)
+ citrus (~> 3.0)
+ parslet (~> 2.0)
+ tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/typescript-merge
+ specs:
+ typescript-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/yaml-merge
+ specs:
+ yaml-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/zip-merge
+ specs:
+ zip-merge (7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /var/home/pboling/src/my/structuredmerge/vendor/tree-sitter-language-pack/packages/ruby
+ specs:
+ tree_sitter_language_pack (1.12.5)
+ rb_sys (>= 0.9, < 0.9.128)
+ sorbet-runtime (~> 0.5)
+
GEM
remote: https://gem.coop/
specs:
addressable (2.9.0)
public_suffix (>= 2.0.2, < 8.0)
ansi (1.6.0)
- appraisal2 (3.1.4)
+ appraisal2 (3.2.0)
bundler (>= 1.17.3)
rake (>= 10)
thor (>= 0.14)
ast (2.4.3)
- ast-merge (7.1.0)
- benchmark
- token-resolver (~> 2.0, >= 2.0.4)
- tree_haver (= 7.1.0)
- version_gem (~> 1.1, >= 1.1.9)
backports (3.25.3)
benchmark (0.5.0)
bigdecimal (4.1.2)
@@ -40,6 +291,12 @@ GEM
thor (~> 1.0)
citrus (3.0.2)
cmdparse (3.0.7)
+ commonmarker (2.9.0-aarch64-linux)
+ commonmarker (2.9.0-aarch64-linux-musl)
+ commonmarker (2.9.0-arm64-darwin)
+ commonmarker (2.9.0-x86_64-darwin)
+ commonmarker (2.9.0-x86_64-linux)
+ commonmarker (2.9.0-x86_64-linux-musl)
concurrent-ruby (1.3.7)
date (3.5.1)
debug (1.11.1)
@@ -98,11 +355,13 @@ GEM
rdoc (>= 4.0.0)
reline (>= 0.4.2)
json (2.21.1)
- kettle-dev (2.3.6)
+ kettle-dev (2.3.7)
emoji_regex (>= 15.0)
kettle-rb (~> 0.1, >= 0.1.2)
kettle-test (~> 2.0, >= 2.0.4)
ruby-progressbar (~> 1.13)
+ kettle-drift (1.0.5)
+ version_gem (~> 1.1, >= 1.1.13)
kettle-rb (0.1.4)
kettle-soup-cover (1.1.3)
simplecov (~> 0.22)
@@ -131,6 +390,7 @@ GEM
language_server-protocol (3.17.0.6)
lint_roller (1.1.0)
logger (1.7.0)
+ markly (0.16.0)
mutex_m (0.3.0)
nokogiri (1.19.4-aarch64-linux-gnu)
racc (~> 1.4)
@@ -324,13 +584,13 @@ GEM
token-resolver (2.0.4)
parslet (~> 2.0)
version_gem (~> 1.1, >= 1.1.13)
- tree_haver (7.1.0)
- citrus (~> 3.0)
- parslet (~> 2.0)
- tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0)
- version_gem (~> 1.1, >= 1.1.9)
+ toml (0.3.0)
+ parslet (>= 1.8.0, < 3.0.0)
+ toml-rb (4.2.0)
+ citrus (~> 3.0, > 3.0)
+ racc (~> 1.7)
tsort (0.2.0)
- turbo_tests2 (3.1.14)
+ turbo_tests2 (3.2.0)
parallel_tests (>= 3.3.0, < 6)
rspec (>= 3.10)
version_gem (~> 1.1, >= 1.1.14)
@@ -355,7 +615,7 @@ GEM
yard
yard-relative_markdown_links (0.6.0)
nokogiri (>= 1.14.3, < 2)
- yard-timekeeper (0.2.3)
+ yard-timekeeper (0.2.4)
version_gem (~> 1.1, >= 1.1.13)
yard-yaml (0.2.3)
version_gem (~> 1.1, >= 1.1.13)
@@ -376,22 +636,44 @@ DEPENDENCIES
addressable (>= 2.8, < 3)
appraisal2 (~> 3.0, >= 3.0.6)
ast-crispr!
+ ast-crispr-markdown-markly!
+ ast-crispr-ruby-prism!
+ ast-merge!
+ ast-merge-git!
+ ast-template!
+ bash-merge!
benchmark (~> 0.5, >= 0.5.0)
+ binary-merge!
bundler-audit (~> 0.9.3)
+ citrus-toml-merge!
+ commonmarker-merge!
debug (>= 1.1)
+ dotenv-merge!
erb (~> 6.0, >= 6.0.4)
gem_bench (~> 2.0, >= 2.0.5)
gitmoji-regex (~> 2.0, >= 2.0.0)
+ go-merge!
irb (~> 1.17)
+ json-merge!
kettle-dev (~> 2.0, >= 2.2.25)
+ kettle-drift (~> 1.0, >= 1.0.5)
+ kettle-jem!
kettle-soup-cover (~> 1.0, >= 1.1.3)
kettle-test (~> 2.0, >= 2.0.9)
kramdown (~> 2.5, >= 2.5.1)
+ kramdown-merge!
kramdown-parser-gfm (~> 1.1)
+ markdown-merge!
+ markly-merge!
mutex_m (~> 0.2)
nomono (~> 1.0, >= 1.0.8)
+ parslet-toml-merge!
+ plain-merge!
+ prism-merge!
+ psych-merge!
rake (~> 13.0)
rbs (>= 3.0)
+ rbs-merge!
rdoc (~> 6.11)
reek (~> 6.5)
require_bench (~> 1.0, >= 1.0.4)
@@ -400,32 +682,54 @@ DEPENDENCIES
rubocop-packaging (~> 0.6, >= 0.6.0)
rubocop-rspec (~> 3.6)
rubocop-ruby3_2 (~> 3.0.0)
+ ruby-merge!
ruby-progressbar (~> 1.13)
+ rust-merge!
+ smorg-rb!
standard (>= 1.50)
stone_checksums (~> 1.0, >= 1.0.3)
stringio (>= 3.0)
+ toml-merge!
+ tree_haver!
tree_sitter_language_pack!
+ typescript-merge!
yaml-converter (~> 0.1)
+ yaml-merge!
yard (~> 0.9, >= 0.9.44)
yard-fence (~> 0.9, >= 0.9.1)
yard-junk (~> 0.1, >= 0.1.0)
yard-relative_markdown_links (~> 0.6)
yard-timekeeper (~> 0.1)
yard-yaml (~> 0.1, >= 0.1.2)
+ zip-merge!
CHECKSUMS
addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af
ansi (1.6.0) sha256=ac9ea0c0ea8d32fb4e271348e609963ac78882f34b73836c2a02b3622e666658
- appraisal2 (3.1.4) sha256=f88c27e600adf4bd5bf06c0ab0afd1de6ce4361497760ce35e86e782036286f4
+ appraisal2 (3.2.0) sha256=ccd0b767ac4060cd7af6d16747459b6990f49c39c7b4fb1f7d1146b1e97c492f
ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
ast-crispr (7.1.0)
+ ast-crispr-markdown-markly (7.1.0)
+ ast-crispr-ruby-prism (7.1.0)
ast-merge (7.1.0)
+ ast-merge-git (7.1.0)
+ ast-template (7.1.0)
backports (3.25.3) sha256=94298d32dc3c40ca15633b54e282780b49e2db0c045f602ea1907e4f63a17235
+ bash-merge (7.1.0)
benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c
bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd
+ binary-merge (7.1.0)
bundler-audit (0.9.3) sha256=81c8766c71e47d0d28a0f98c7eed028539f21a6ea3cd8f685eb6f42333c9b4e9
citrus (3.0.2) sha256=4ec2412fc389ad186735f4baee1460f7900a8e130ffe3f216b30d4f9c684f650
+ citrus-toml-merge (7.1.0)
cmdparse (3.0.7) sha256=f7c5cace10bec6abf853370ae095e4b97a84ed9d847b3fb38f41cc4fbc950739
+ commonmarker (2.9.0-aarch64-linux) sha256=e2b4aadb9a2cfa4e206582641ce3a49465549ac1ed4c289fdd63b78d8f24579c
+ commonmarker (2.9.0-aarch64-linux-musl) sha256=1cf4d2821f2a7e64945f1ed7c4eeced586fdb27ea7fe7337788802cf8f57cfca
+ commonmarker (2.9.0-arm64-darwin) sha256=1748dbfa4f5813b0d2a14bb4bbfa65a4ec293aa1c825016d60029ee0e132b046
+ commonmarker (2.9.0-x86_64-darwin) sha256=0a9914ccfd2f5d2a59c7bd0dda4fe90eb084cf513b477e499008e09ec9d6edd6
+ commonmarker (2.9.0-x86_64-linux) sha256=8cfe92970eef585a19ddf6613224b91cab64d6029834661bda801f877c9c7f43
+ commonmarker (2.9.0-x86_64-linux-musl) sha256=293921398b839f79ceaf55010e061357e34f053822c3b003cd0be6686176335e
+ commonmarker-merge (7.1.0)
concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0
date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0
debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6
@@ -433,6 +737,7 @@ CHECKSUMS
diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962
diffy (3.4.4) sha256=79384ab5ca82d0e115b2771f0961e27c164c456074bd2ec46b637ebf7b6e47e3
docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e
+ dotenv-merge (7.1.0)
dry-configurable (1.4.0) sha256=e35d1b5f3c081753ef361f564919db79000f32cfa6f20ee3a3ba5921b41b73ce
dry-core (1.2.0) sha256=0cc5a7da88df397f153947eeeae42e876e999c1e30900f3c536fb173854e96a1
dry-inflector (1.3.1) sha256=7fb0c2bb04f67638f25c52e7ba39ab435d922a3a5c3cd196120f63accb682dcc
@@ -445,19 +750,27 @@ CHECKSUMS
gem_bench (2.0.5) sha256=0dc0fb44a5a5eb7b2f5c1c68a5b0164d72007132822c012bac3abe976b199ead
geom2d (0.4.1) sha256=ea0998ea90c4f2752e24fe13d85a4f89bee689d151316140ebcc6369bf634ed9
gitmoji-regex (2.0.4) sha256=01410d3217940bd0e7b2299ec805245afe8d0f06a5d6d38f623d63a63c0ac34f
+ go-merge (7.1.0)
hexapdf (1.9.1) sha256=2d1f6a3622e6bc2a70a707d4c3f3fa44f5552ecd9d899f6283abb07398a84884
io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc
irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3
json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583
- kettle-dev (2.3.6) sha256=955b01e8aca46438365332d1b4413f22cb58dabfeab5cba04d71237c53cc70ae
+ json-merge (7.1.0)
+ kettle-dev (2.3.7) sha256=eb370113cd030d03cbe2d33b31c99858951017e5ad21a17e9ed89dc3770028ee
+ kettle-drift (1.0.5) sha256=07094e80140a049164142820bdd327c30fcd855bb00697a0a430600a2b5144a2
+ kettle-jem (7.1.0)
kettle-rb (0.1.4) sha256=9cef7ce4f7021666b7222292f29051e51eaf042e8a5db11f3f4dd72f74243fc1
kettle-soup-cover (1.1.3) sha256=a373827da22a7131d093afd32945e5b7d7a10a01ebfdded8fd2cb8230d69c8ad
kettle-test (2.0.11) sha256=c710c90f7ab79d51f9452f0c09f5f90657e7a893f63583855c164d0b1b107ab2
kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa
+ kramdown-merge (7.1.0)
kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729
language_server-protocol (3.17.0.6) sha256=5ef2c0c138f8267e1bc631d3328347d354f96724b0af22f2c79516120443b7f0
lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87
logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
+ markdown-merge (7.1.0)
+ markly (0.16.0) sha256=6f70d79e385b1efc9e171f74c81628826259039fe6c778e03c3924c71dac5511
+ markly-merge (7.1.0)
mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751
nokogiri (1.19.4-aarch64-linux-gnu) sha256=1269fb644a6de405057a53dd5c762b1209b43ca7424f839454d3dbc677c31a8f
nokogiri (1.19.4-aarch64-linux-musl) sha256=35c65b9ce72b3bb03207bdbe7067915019dc18c1b9b59139684bd6690fdd01af
@@ -472,10 +785,14 @@ CHECKSUMS
parallel_tests (5.7.0) sha256=3f1762c46ca2c223b8af8ef877217f9d76974e191bfa934f2580b58bcf1d005c
parser (3.3.12.0) sha256=21a6d7f755d5a24dfbdc6e6b772e4e879a52e7631a88bc5a3a134606052c9828
parslet (2.0.0) sha256=d45130695d39b43d7e6a91f4d2ec66b388a8d822bae38de9b4de9a5fbde1f606
+ parslet-toml-merge (7.1.0)
+ plain-merge (7.1.0)
pp (0.6.4) sha256=dfcb0fce700c41456265922884f9fe195d7fbb0674a3578e6c0f69588e82b570
prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193
prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85
+ prism-merge (7.1.0)
psych (5.4.0) sha256=14f72d69a611af663d7d70e4a7b67d9eb1f3ae9f8d916b478961d5a0075ba5b7
+ psych-merge (7.1.0)
public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623
racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
@@ -483,6 +800,7 @@ CHECKSUMS
rake-compiler-dock (1.12.0) sha256=f13205c2738f3d2053afcd03491a9e4541b22a59a0bfc53fc8bc883bd8188023
rb_sys (0.9.127) sha256=e9f90df3bb0577472d26d96127d5b5774b98f44de881e7d36aeefd28d6337847
rbs (4.0.3) sha256=5a7bf70e2628549d9a1f44eae447b2cfe55968a9c60cfff52693a4bdcc020e14
+ rbs-merge (7.1.0)
rdoc (6.17.0) sha256=0f50d4e568fc98195f9bb155a9e8dff6c7feabfb515fb22ef6df1d12ad5a02b7
reek (6.5.0) sha256=d26d3a492773b2bbc228888067a21afe33ac07954a17dbd64cdeae42c4c69be1
regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb
@@ -510,9 +828,11 @@ CHECKSUMS
rubocop-rspec (3.10.2) sha256=0b3e2ecc592cd10ecbf0095bb58d1e357905276e069643523cc19eb7495f65e2
rubocop-ruby3_2 (3.0.7) sha256=f53dd6d286fb05186214fc6ec116783e7f837030918e8931c05de773e98f8466
rubocop-thread_safety (0.7.3) sha256=067cdd52fbf5deffc18995437e45b5194236eaff4f71de3375a1f6052e48f431
+ ruby-merge (7.1.0)
ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
ruby_engine (2.0.3) sha256=ca2ae7def8cfcdc2bfb6a186d36d5d59c8b403245dc0256c3802b767fa278aaa
ruby_version (1.0.3) sha256=5930f9950746b7e6c973184398ee364ee7440b170fef7922b9f5cdf317f1ccb5
+ rust-merge (7.1.0)
service_actor (3.9.4) sha256=e63b523630b9a7e62959b2a90113b08d2565b5de9c148557b281ef847c9539ce
silent_stream (1.0.12) sha256=377c43aa10033fe90c33b39ea8cd97d79f2d1c4856df598efc56f3091f3ae782
simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5
@@ -522,6 +842,7 @@ CHECKSUMS
simplecov-lcov (0.9.0) sha256=7a77a31e200a595ed4b0249493056efd0c920601f53d2ef135ca34ee796346cd
simplecov-rcov (0.3.7) sha256=372f50bf6df6b6350b7d0c840f2f8bdabe021861a43c26877b747c9ac96139fc
simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428
+ smorg-rb (7.1.0)
sorbet-runtime (0.6.13342) sha256=dbeb9892597f593ed2b29e38018912787f6c4e0c4b736d8af0d6bd3c63bde3c3
standard (1.56.0) sha256=ae2af4d9669589162ac69ed5ef59dcf9f346d4afc81f7e62b84339310dfcb787
standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b
@@ -535,21 +856,27 @@ CHECKSUMS
timecop (0.9.11) sha256=41284dc6e5041f2184f781ace766f942108c842f8d8c1386a26e6343decc7542
timecop-rspec (1.0.3) sha256=005f14841bb606dcaefb060e321b5388e2e59537742bee8b3a9a9a40e598fab9
token-resolver (2.0.4) sha256=33b926958f504525bba3ed511ab66fbcbf8ef30390815e931436b30f27ffcad0
+ toml (0.3.0) sha256=0a91d0f76a9036e84e44f95693b12f58d358c1df3ac8e3b5271f2056ecc6e4b9
+ toml-merge (7.1.0)
+ toml-rb (4.2.0) sha256=10a48c91613e20cf63483a7a776767dfb3cd7d70e9327c0237443da601e13776
tree_haver (7.1.0)
tree_sitter_language_pack (1.12.5)
tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f
- turbo_tests2 (3.1.14) sha256=cc29d5b36bdbba67a83eee09a9546880d0926edfbbe50d99633fc0b5763ee94c
+ turbo_tests2 (3.2.0) sha256=8b35421548399d1923567b177970f42671c65695b93cdd134d78fbcbab85dff0
+ typescript-merge (7.1.0)
unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42
unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f
version_gem (1.1.14) sha256=6b7306c7e9416d06067561981ab3444e2cecb844f26cc325ae3c27b44cf85613
yaml-converter (0.2.3) sha256=d35e69e547610d9e347672cc277fcb7d71dff3c53a942e66f82b1c64022ada72
+ yaml-merge (7.1.0)
yard (0.9.45) sha256=52e211493f7cb8a3ebf7e104a25a1e73937a3103092545d34cb88fafebb3dc51
yard-fence (0.9.6) sha256=3d1dbf4e3df462ac78b8bd2e01cf740a2de20168387c929aca31a0bcee490659
yard-junk (0.1.0) sha256=e85fe2ec1afa47313decd333447b53458cb1ed49b510b70015fdc3041a94bcdd
yard-relative_markdown_links (0.6.0) sha256=3e5ffa85cbad9bac70bee5421774b190fb25d3bdf489323a5b3534f647d1a70e
- yard-timekeeper (0.2.3) sha256=849a3e74a0484b1e0b5209cf86823e418b3091e21f4f143c141d38e1cc262034
+ yard-timekeeper (0.2.4) sha256=62f8d001d737c6e2ac688e7b37386f958dceb0f6aff9c909575e1bec8d20775a
yard-yaml (0.2.3) sha256=fe5fef18819e1cbd05bb8f1b9e1baad6bf70c28125eb75b57bbf6397b0831812
zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12
+ zip-merge (7.1.0)
zlib (3.2.3) sha256=5bd316698b32f31a64ab910a8b6c282442ca1626a81bbd6a1674e8522e319c20
BUNDLED WITH
diff --git a/gems/ast-crispr/gemfiles/modular/templating.gemfile b/gems/ast-crispr/gemfiles/modular/templating.gemfile
index 0d1c9bcf4..e3c24e6b7 100644
--- a/gems/ast-crispr/gemfiles/modular/templating.gemfile
+++ b/gems/ast-crispr/gemfiles/modular/templating.gemfile
@@ -1,9 +1,9 @@
# frozen_string_literal: true
-smorg_remote = ENV.fetch('SMORG_RB_DEV', 'false').casecmp('false').zero?
+structuredmerge_remote = ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false').zero?
kettle_remote = ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero?
-if smorg_remote
+if structuredmerge_remote
# Merge recipes and parser dependencies for released installs.
gem 'kettle-jem', '>= 7.0'
end
@@ -13,10 +13,10 @@ if kettle_remote
gem 'kettle-drift', '~> 1.0', '>= 1.0.5', require: false
end
-# Set SMORG_RB_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies.
+# Set STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies.
# When false (default / CI), released kettle-jem brings merge gems and parser dependencies.
# Local path overrides bring the same dependencies from sibling gemspecs.
#
# Set KETTLE_RB_DEV=/path/to/kettle-rb for local development with Kettle plugin gems.
# When false (default / CI), released Kettle plugin gems are used.
-eval_gemfile 'templating_local.gemfile' unless smorg_remote && kettle_remote
+eval_gemfile 'templating_local.gemfile' unless structuredmerge_remote && kettle_remote
diff --git a/gems/ast-crispr/gemfiles/modular/templating_local.gemfile b/gems/ast-crispr/gemfiles/modular/templating_local.gemfile
index a39610b04..33f003f01 100644
--- a/gems/ast-crispr/gemfiles/modular/templating_local.gemfile
+++ b/gems/ast-crispr/gemfiles/modular/templating_local.gemfile
@@ -1,12 +1,12 @@
# frozen_string_literal: true
# Local path overrides for templating development.
-# Loaded by the associated non-local gemfile when SMORG_RB_DEV or KETTLE_RB_DEV
+# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_RB_DEV
# is not "false".
require 'nomono/bundler' unless defined?(Nomono)
-smorg_rb_local_gems = %w[
+structuredmerge_local_gems = %w[
tree_haver
ast-merge
ast-merge-git
@@ -43,7 +43,7 @@ kettle_rb_local_gems = %w[
kettle-dev kettle-test kettle-soup-cover kettle-drift
]
declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name)
-smorg_rb_local_gems_to_eval = smorg_rb_local_gems - %w[ast-crispr] - declared_gems
+structuredmerge_local_gems_to_eval = structuredmerge_local_gems - %w[ast-crispr] - declared_gems
kettle_rb_local_gems_to_eval = kettle_rb_local_gems - %w[ast-crispr] - declared_gems
tslp_dev = ENV.fetch('TSLP_DEV', nil)
@@ -52,14 +52,14 @@ tslp_dev = ENV.fetch('TSLP_DEV', nil)
platform :mri do
gem 'tree_sitter_language_pack', path: tslp_dev unless tslp_dev.to_s.empty?
- if ENV.fetch('SMORG_RB_DEV', 'false').casecmp('false') != 0
+ if ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false') != 0
eval_nomono_gems(
- gems: smorg_rb_local_gems_to_eval,
- prefix: 'SMORG_RB',
- path_env: 'SMORG_RB_DEV',
+ gems: structuredmerge_local_gems_to_eval,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
vendored_gems_env: 'VENDORED_GEMS',
vendor_gem_dir_env: 'VENDOR_GEM_DIR',
- debug_env: 'SMORG_RB_DEBUG'
+ debug_env: 'STRUCTUREDMERGE_DEBUG'
)
end
diff --git a/gems/ast-crispr/lib/ast/crispr.rb b/gems/ast-crispr/lib/ast/crispr.rb
index c04d41e3b..04d239161 100644
--- a/gems/ast-crispr/lib/ast/crispr.rb
+++ b/gems/ast-crispr/lib/ast/crispr.rb
@@ -290,24 +290,15 @@ def to_h
private
def normalize_start_boundary(value)
- boundary = value&.to_sym
- return boundary if KNOWN_START_BOUNDARIES.include?(boundary)
-
- raise Error.new('Unsupported CRISPR match start boundary', details: { start_boundary: value.inspect })
+ value&.to_sym
end
def normalize_end_boundary(value)
- boundary = value&.to_sym
- return boundary if KNOWN_END_BOUNDARIES.include?(boundary)
-
- raise Error.new('Unsupported CRISPR match end boundary', details: { end_boundary: value.inspect })
+ value&.to_sym
end
def normalize_payload_kind(value)
- kind = value&.to_sym
- return kind if KNOWN_PAYLOAD_KINDS.include?(kind)
-
- raise Error.new('Unsupported CRISPR match payload kind', details: { payload_kind: value.inspect })
+ value&.to_sym
end
end
@@ -435,25 +426,15 @@ def to_h
private
def normalize_resolution_kind(value)
- kind = value&.to_sym
- return kind if KNOWN_RESOLUTION_KINDS.include?(kind)
-
- raise Error.new('Unsupported CRISPR destination resolution kind', details: { resolution_kind: value.inspect })
+ value&.to_sym
end
def normalize_resolution_source(value)
- source = value&.to_sym
- return source if KNOWN_RESOLUTION_SOURCES.include?(source)
-
- raise Error.new('Unsupported CRISPR destination resolution source',
- details: { resolution_source: value.inspect })
+ value&.to_sym
end
def normalize_anchor_boundary(value)
- boundary = value&.to_sym
- return boundary if KNOWN_ANCHOR_BOUNDARIES.include?(boundary)
-
- raise Error.new('Unsupported CRISPR destination anchor boundary', details: { anchor_boundary: value.inspect })
+ value&.to_sym
end
end
@@ -528,14 +509,19 @@ class SelectionProfile
attr_reader :owner_scope, :selector_kind, :selection_intent, :comment_region, :include_trailing_gap,
:structure_profile, :metadata
- def initialize(owner_scope:, selector_kind:, selection_intent:, structure_profile:, comment_region: nil,
+ def initialize(owner_scope:, selector_kind:, selection_intent:, structure_profile: nil, owner_selector: nil,
+ comment_region: nil,
include_trailing_gap: false, metadata: {}, **options)
@owner_scope = owner_scope&.to_sym
@selector_kind = selector_kind&.to_sym
@selection_intent = selection_intent&.to_sym
@comment_region = comment_region&.to_sym
@include_trailing_gap = include_trailing_gap ? true : false
- @structure_profile = structure_profile
+ @structure_profile = structure_profile || StructureProfile.new(
+ owner_scope: owner_scope,
+ owner_selector: owner_selector || :line_bound_statements,
+ supported_comment_regions: [comment_region].compact
+ )
@metadata = metadata.merge(options).freeze
end
@@ -586,6 +572,10 @@ class OperationProfile
family: :rewrite,
description: 'Replace selected content with explicit replacement text'
},
+ merge_replace: {
+ family: :rewrite,
+ description: 'Replace selected content with the result of a merge-gem slice merge'
+ },
delete: {
family: :removal,
description: 'Delete selected content without inserting replacement text'
@@ -600,7 +590,7 @@ class OperationProfile
}
}.freeze
KNOWN_REQUIREMENTS = %i[none optional required].freeze
- KNOWN_REPLACEMENT_SOURCES = %i[none explicit_text captured_text_or_explicit].freeze
+ KNOWN_REPLACEMENT_SOURCES = %i[none explicit_text captured_text_or_explicit merge_template_text].freeze
attr_reader :operation_kind, :source_requirement, :destination_requirement, :replacement_source, :metadata
@@ -676,18 +666,11 @@ def to_h
private
def normalize_requirement(value, field_name)
- requirement = value&.to_sym
- return requirement if KNOWN_REQUIREMENTS.include?(requirement)
-
- raise Error.new('Unsupported CRISPR operation requirement',
- details: { field: field_name, value: value.inspect })
+ value&.to_sym
end
def normalize_replacement_source(value)
- replacement = value&.to_sym
- return replacement if KNOWN_REPLACEMENT_SOURCES.include?(replacement)
-
- raise Error.new('Unsupported CRISPR replacement source', details: { replacement_source: value.inspect })
+ value&.to_sym
end
end
@@ -1060,6 +1043,79 @@ def replace_line_ranges(source, matches, replacement)
Ast::Merge::StructuralEdit::PlanSet.new(source: source, plans: plans).merged_content
end
+ def merge_replace_line_ranges(source, matches, replacement, merger_class:, merger_options:)
+ assert_non_overlapping!(matches)
+ merge_results = []
+ plans = matches.map do |match|
+ destination_slice = match.slice_from(source)
+ merge_result = merge_replacement_slice(
+ replacement.to_s,
+ destination_slice,
+ merger_class: merger_class,
+ merger_options: merger_options
+ )
+ merge_results << merge_result
+
+ Ast::Merge::StructuralEdit::SplicePlan.new(
+ source: source,
+ replace_start_line: match.start_line,
+ replace_end_line: match.end_line,
+ replacement: merge_result.fetch(:content),
+ metadata: { merge_result: merge_result, mode: :merge_replace }
+ )
+ end
+
+ [
+ Ast::Merge::StructuralEdit::PlanSet.new(source: source, plans: plans).merged_content,
+ merge_results
+ ]
+ end
+
+ def merge_replacement_slice(template_slice, destination_slice, merger_class:, merger_options:)
+ merger = merger_class.new(template_slice, destination_slice, **merger_options)
+ result = merger.respond_to?(:merge_result) ? merger.merge_result : merger.merge
+ content = merge_result_content(result)
+
+ {
+ content: content,
+ result: result,
+ stats: merge_result_stats(result, merger),
+ conflicts: merge_result_conflicts(result),
+ unresolved: merge_result_unresolved?(result)
+ }
+ end
+
+ def merge_result_content(result)
+ return result if result.is_a?(String)
+ return result.output if result.respond_to?(:output)
+ return result.content if result.respond_to?(:content) && result.content.is_a?(String)
+
+ result.to_s
+ end
+
+ def merge_result_stats(result, merger)
+ if result.respond_to?(:stats)
+ stats = result.stats
+ return stats unless stats.respond_to?(:empty?) && stats.empty?
+ end
+ return merger.stats if merger.respond_to?(:stats)
+
+ {}
+ end
+
+ def merge_result_conflicts(result)
+ return result.conflicts if result.respond_to?(:conflicts)
+
+ []
+ end
+
+ def merge_result_unresolved?(result)
+ return result.unresolved? if result.respond_to?(:unresolved?)
+ return result.review_required? if result.respond_to?(:review_required?)
+
+ false
+ end
+
def assert_non_overlapping!(matches)
ranges = matches.map(&:line_range).sort_by(&:begin)
ranges.each_cons(2) do |left, right|
@@ -1215,6 +1271,59 @@ def operation_profile
end
end
+ class MergeReplace < Actor
+ include OperationSupport
+ include OperationProfilable
+
+ declare_operation_profile(
+ operation_kind: :merge_replace,
+ source_requirement: :required,
+ destination_requirement: :none,
+ replacement_source: :merge_template_text,
+ captures_source_text: true,
+ supports_if_missing: false
+ )
+
+ input :content, type: String
+ input :target, type: OwnerSelector
+ input :replacement, type: String
+ input :merger_class
+ input :merger_options, default: -> { {} }
+ input :source_label, type: String, default: 'source'
+
+ output :updated_content
+ output :matches, default: -> { [] }
+ output :match_count, type: Integer, default: 0
+ output :changed, default: false
+ output :captured_text, allow_nil: true, default: nil
+ output :merge_results, default: -> { [] }
+ output :operation_profile
+
+ def call
+ self.operation_profile = self.class.operation_profile
+ context = context_for(content: content, source_label: source_label, target: target)
+ self.matches = normalize_matches(target, context)
+ self.match_count = matches.size
+ self.captured_text = capture_text(content, matches)
+ if matches.empty?
+ self.updated_content = content
+ self.changed = false
+ return
+ end
+
+ self.updated_content, self.merge_results = merge_replace_line_ranges(
+ content,
+ matches,
+ replacement,
+ merger_class: merger_class,
+ merger_options: merger_options.to_h
+ )
+ self.changed = updated_content != content
+ rescue Error => e
+ crispr_fail!(e)
+ end
+ end
+
class Replace < Actor
include OperationSupport
include OperationProfilable
@@ -1427,18 +1536,6 @@ def report
)
stringified_report(data)
end
-
- def normalize_start_boundary(value)
- value&.to_sym
- end
-
- def normalize_end_boundary(value)
- value&.to_sym
- end
-
- def normalize_payload_kind(value)
- value&.to_sym
- end
end
class SelectionProfile
@@ -1463,21 +1560,6 @@ class SelectionProfile
section_heading: :section
}.freeze
- def initialize(owner_scope:, selector_kind:, selection_intent:, structure_profile: nil, owner_selector: nil,
- comment_region: nil, include_trailing_gap: false, metadata: {}, **options)
- @owner_scope = owner_scope&.to_sym
- @selector_kind = selector_kind&.to_sym
- @selection_intent = selection_intent&.to_sym
- @comment_region = comment_region&.to_sym
- @include_trailing_gap = include_trailing_gap ? true : false
- @structure_profile = structure_profile || StructureProfile.new(
- owner_scope: owner_scope,
- owner_selector: owner_selector || :line_bound_statements,
- supported_comment_regions: [comment_region].compact
- )
- @metadata = metadata.merge(options).freeze
- end
-
def report
data = to_h
selector_kind_family = KNOWN_SELECTOR_KINDS[selector_kind]&.fetch(:family, nil)
@@ -1497,24 +1579,6 @@ def report
)
stringified_report(data)
end
-
- def normalize_owner_selector(value)
- value&.to_sym
- end
-
- def normalize_selector_kind(value)
- value&.to_sym
- end
-
- def normalize_selection_intent(value)
- value&.to_sym
- end
-
- def normalize_comment_region(value)
- return nil if value.nil?
-
- value&.to_sym
- end
end
class DestinationProfile
@@ -1530,18 +1594,6 @@ def report
)
stringified_report(data)
end
-
- def normalize_resolution_kind(value)
- value&.to_sym
- end
-
- def normalize_resolution_source(value)
- value&.to_sym
- end
-
- def normalize_anchor_boundary(value)
- value&.to_sym
- end
end
class OperationProfile
@@ -1562,18 +1614,6 @@ def report
)
stringified_report(data)
end
-
- def normalize_operation_kind(value)
- value&.to_sym
- end
-
- def normalize_requirement(value, *)
- value&.to_sym
- end
-
- def normalize_replacement_source(value)
- value&.to_sym
- end
end
class StructureProfile
@@ -1582,14 +1622,6 @@ class StructureProfile
def report
stringified_report(to_h)
end
-
- def normalize_owner_selector(value)
- value&.to_sym
- end
-
- def normalize_comment_region(value)
- value&.to_sym
- end
end
class << self
diff --git a/gems/ast-crispr/spec/old_runtime_spec.rb b/gems/ast-crispr/spec/old_runtime_spec.rb
index 96130da78..7e8509493 100644
--- a/gems/ast-crispr/spec/old_runtime_spec.rb
+++ b/gems/ast-crispr/spec/old_runtime_spec.rb
@@ -1,5 +1,8 @@
# frozen_string_literal: true
+require 'json'
+require 'pathname'
+
RSpec.describe Ast::Crispr do
FakeLocation = Struct.new(:start_line, :end_line, keyword_init: true)
FakeCommentRegion = Struct.new(:location, :text, keyword_init: true)
@@ -55,6 +58,14 @@ def structure_profile(owner_scope: :shared_default)
end
let(:adapter) { FakeAdapter.new(owners: owners, comments: comments) }
+ def fixtures_root
+ Pathname(__dir__).join('..', '..', '..', '..', 'fixtures').expand_path
+ end
+
+ def read_json(path)
+ Ast::Merge.normalize_value(JSON.parse(path.read))
+ end
+
it 'has a version number' do
expect(Ast::Crispr::VERSION).not_to be_nil
end
@@ -331,6 +342,26 @@ def structure_profile(owner_scope: :shared_default)
it_behaves_like 'Ast::Crispr::OperationProfile contract'
end
+ describe Ast::Crispr::MergeReplace do
+ let(:operation_profile) { described_class.operation_profile }
+ let(:expected_operation_kind) { :merge_replace }
+ let(:expected_operation_family) { :rewrite }
+ let(:expected_known_operation_kind) { true }
+ let(:expected_source_requirement) { :required }
+ let(:expected_destination_requirement) { :none }
+ let(:expected_replacement_source) { :merge_template_text }
+ let(:expected_captures_source_text) { true }
+ let(:expected_supports_if_missing) { false }
+ let(:expected_selects_source) { true }
+ let(:expected_requires_source) { true }
+ let(:expected_supports_destination) { false }
+ let(:expected_requires_destination) { false }
+ let(:expected_explicit_replacement) { false }
+ let(:expected_may_reuse_captured_text) { false }
+
+ it_behaves_like 'Ast::Crispr::OperationProfile contract'
+ end
+
describe Ast::Crispr::Delete do
let(:operation_profile) { described_class.operation_profile }
let(:expected_operation_kind) { :delete }
@@ -415,6 +446,39 @@ def structure_profile(owner_scope: :shared_default)
end
end
+ describe described_class::MergeReplace do
+ it 'merges replacement text into the selected slice before splicing it back' do
+ fixture = read_json(fixtures_root.join('diagnostics', 'slice-1018-crispr-slice-merge',
+ 'crispr-slice-merge.json'))
+ operation = fixture.fetch(:operation)
+ selector = operation.fetch(:selector)
+ merge = operation.fetch(:merge)
+ target = Ast::Crispr::Selectors.line_block(
+ start_line_text: selector.fetch(:start_line_text),
+ end_line_text: selector.fetch(:end_line_text),
+ limit: selector.fetch(:limit)
+ )
+
+ actor = described_class.call(
+ content: operation.fetch(:content),
+ target: target,
+ replacement: operation.fetch(:replacement),
+ merger_class: Ast::Merge::Text::SmartMerger,
+ merger_options: {
+ preference: merge.fetch(:preference).to_sym,
+ add_template_only_nodes: merge.fetch(:add_template_only_nodes)
+ }
+ )
+
+ expected = fixture.fetch(:expected)
+ expect(actor.changed).to eq(expected.fetch(:changed))
+ expect(actor.match_count).to eq(expected.fetch(:match_count))
+ expect(actor.captured_text).to include(expected.fetch(:captured_text_contains))
+ expect(actor.merge_results.first.fetch(:stats)).not_to be_empty
+ expect(actor.updated_content).to eq(expected.fetch(:output))
+ end
+ end
+
describe described_class::Insert do
it 'appends when configured and no destination is resolved' do
content = <<~RUBY
diff --git a/gems/ast-crispr/spec/provider_architecture_spec.rb b/gems/ast-crispr/spec/provider_architecture_spec.rb
new file mode 100644
index 000000000..d816944b9
--- /dev/null
+++ b/gems/ast-crispr/spec/provider_architecture_spec.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+require 'pathname'
+
+RSpec.describe 'Ast::Crispr provider architecture' do
+ let(:repo_root) { Pathname(__dir__).join('..', '..', '..').expand_path }
+ let(:provider_lib_files) { repo_root.join('gems').glob('ast-crispr-*/lib/**/*.rb') }
+
+ let(:forbidden_patterns) do
+ {
+ /(? 'delegate Ruby/Prism analysis to prism-merge',
+ /(? 'delegate Markdown/Markly analysis to markly-merge',
+ /(? 'delegate Markdown/CommonMarker analysis to commonmarker-merge',
+ /Kramdown::Document\.new\b/ => 'delegate Markdown/Kramdown analysis to kramdown-merge',
+ /(? 'delegate JSON analysis to json-merge',
+ /(? 'delegate YAML analysis to yaml-merge or psych-merge',
+ /\bTomlRB\b/ => 'delegate TOML analysis to toml-merge or a TOML provider merge gem',
+ /\bTOML::Parslet\b/ => 'delegate TOML analysis to toml-merge or parslet-toml-merge',
+ /TreeHaver\.register_language\b/ => 'register TreeHaver backends in merge gems',
+ /TreeHaver::BackendRegistry\.register\b/ => 'register TreeHaver backends in merge gems',
+ /TreeHaver\.parser_for\b/ => 'delegate parsing and analysis to merge gems'
+ }
+ end
+
+ it 'keeps provider gems above merge-gem analysis instead of parser APIs' do
+ violations = provider_lib_files.flat_map do |path|
+ content = path.read
+ relative_path = path.relative_path_from(repo_root)
+
+ forbidden_patterns.filter_map do |pattern, guidance|
+ next unless content.match?(pattern)
+
+ "#{relative_path}: matches #{pattern.inspect}; #{guidance}"
+ end
+ end
+
+ expect(violations).to be_empty, violations.join("\n")
+ end
+end
diff --git a/gems/ast-merge-git/.gitattributes b/gems/ast-merge-git/.gitattributes
index 0ac65aaa7..35a3c7359 100644
--- a/gems/ast-merge-git/.gitattributes
+++ b/gems/ast-merge-git/.gitattributes
@@ -1,5 +1,5 @@
# <> do not edit below this line
-*.rb diff=smorg-ruby
+*.rb diff=smorg-rb
*.go diff=smorg-go
*.rs diff=smorg-rs
# <>
diff --git a/gems/ast-merge-git/.kettle-drift.lock b/gems/ast-merge-git/.kettle-drift.lock
index 1dad17e1d..e3a4ed60c 100644
--- a/gems/ast-merge-git/.kettle-drift.lock
+++ b/gems/ast-merge-git/.kettle-drift.lock
@@ -3,8 +3,15 @@
{
"file": "Gemfile",
"lines": [
- 79,
- 119
+ 80,
+ 120,
+ 160,
+ 200,
+ 240,
+ 280,
+ 320,
+ 360,
+ 400
]
}
],
@@ -12,8 +19,15 @@
{
"file": "Gemfile",
"lines": [
- 90,
- 130
+ 91,
+ 131,
+ 171,
+ 211,
+ 251,
+ 291,
+ 331,
+ 371,
+ 411
]
}
],
@@ -21,8 +35,15 @@
{
"file": "Gemfile",
"lines": [
- 80,
- 120
+ 81,
+ 121,
+ 161,
+ 201,
+ 241,
+ 281,
+ 321,
+ 361,
+ 401
]
}
],
@@ -30,8 +51,15 @@
{
"file": "Gemfile",
"lines": [
- 92,
- 132
+ 93,
+ 133,
+ 173,
+ 213,
+ 253,
+ 293,
+ 333,
+ 373,
+ 413
]
}
],
@@ -39,8 +67,15 @@
{
"file": "Gemfile",
"lines": [
- 95,
- 135
+ 96,
+ 136,
+ 176,
+ 216,
+ 256,
+ 296,
+ 336,
+ 376,
+ 416
]
}
],
@@ -48,8 +83,15 @@
{
"file": "Gemfile",
"lines": [
- 81,
- 121
+ 82,
+ 122,
+ 162,
+ 202,
+ 242,
+ 282,
+ 322,
+ 362,
+ 402
]
}
],
@@ -57,9 +99,16 @@
{
"file": "Gemfile",
"lines": [
- 59,
- 99,
- 139
+ 60,
+ 100,
+ 140,
+ 180,
+ 220,
+ 260,
+ 300,
+ 340,
+ 380,
+ 420
]
}
],
@@ -67,8 +116,15 @@
{
"file": "Gemfile",
"lines": [
- 100,
- 140
+ 101,
+ 141,
+ 181,
+ 221,
+ 261,
+ 301,
+ 341,
+ 381,
+ 421
]
}
],
@@ -76,9 +132,16 @@
{
"file": "Gemfile",
"lines": [
- 42,
- 86,
- 126
+ 43,
+ 87,
+ 127,
+ 167,
+ 207,
+ 247,
+ 287,
+ 327,
+ 367,
+ 407
]
}
],
@@ -86,8 +149,15 @@
{
"file": "Gemfile",
"lines": [
- 109,
- 149
+ 110,
+ 150,
+ 190,
+ 230,
+ 270,
+ 310,
+ 350,
+ 390,
+ 430
]
}
],
@@ -95,9 +165,16 @@
{
"file": "Gemfile",
"lines": [
- 34,
- 78,
- 118
+ 35,
+ 79,
+ 119,
+ 159,
+ 199,
+ 239,
+ 279,
+ 319,
+ 359,
+ 399
]
}
],
@@ -105,9 +182,16 @@
{
"file": "Gemfile",
"lines": [
- 68,
- 108,
- 148
+ 69,
+ 109,
+ 149,
+ 189,
+ 229,
+ 269,
+ 309,
+ 349,
+ 389,
+ 429
]
}
],
@@ -115,8 +199,15 @@
{
"file": "Gemfile",
"lines": [
- 84,
- 124
+ 85,
+ 125,
+ 165,
+ 205,
+ 245,
+ 285,
+ 325,
+ 365,
+ 405
]
}
],
@@ -124,9 +215,16 @@
{
"file": "Gemfile",
"lines": [
- 47,
- 91,
- 131
+ 48,
+ 92,
+ 132,
+ 172,
+ 212,
+ 252,
+ 292,
+ 332,
+ 372,
+ 412
]
}
],
@@ -134,9 +232,16 @@
{
"file": "Gemfile",
"lines": [
- 43,
- 87,
- 127
+ 44,
+ 88,
+ 128,
+ 168,
+ 208,
+ 248,
+ 288,
+ 328,
+ 368,
+ 408
]
}
],
@@ -144,8 +249,15 @@
{
"file": "Gemfile",
"lines": [
- 85,
- 125
+ 86,
+ 126,
+ 166,
+ 206,
+ 246,
+ 286,
+ 326,
+ 366,
+ 406
]
}
],
@@ -153,8 +265,15 @@
{
"file": "Gemfile",
"lines": [
- 102,
- 142
+ 103,
+ 143,
+ 183,
+ 223,
+ 263,
+ 303,
+ 343,
+ 383,
+ 423
]
}
],
@@ -162,8 +281,15 @@
{
"file": "Gemfile",
"lines": [
- 101,
- 141
+ 102,
+ 142,
+ 182,
+ 222,
+ 262,
+ 302,
+ 342,
+ 382,
+ 422
]
}
],
@@ -171,8 +297,15 @@
{
"file": "Gemfile",
"lines": [
- 96,
- 136
+ 97,
+ 137,
+ 177,
+ 217,
+ 257,
+ 297,
+ 337,
+ 377,
+ 417
]
}
],
@@ -180,8 +313,15 @@
{
"file": "Gemfile",
"lines": [
- 105,
- 145
+ 106,
+ 146,
+ 186,
+ 226,
+ 266,
+ 306,
+ 346,
+ 386,
+ 426
]
}
],
diff --git a/gems/ast-merge-git/.rubocop_gradual.lock b/gems/ast-merge-git/.rubocop_gradual.lock
index bc438def4..ff0066794 100644
--- a/gems/ast-merge-git/.rubocop_gradual.lock
+++ b/gems/ast-merge-git/.rubocop_gradual.lock
@@ -8,11 +8,11 @@
[163, 121, 22, "Layout/LineLength: Line is too long. [142/120]", 1367093088],
[166, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 3881946477]
],
- "ast-merge-git.gemspec:646301195": [
- [127, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 2821357214],
- [142, 121, 50, "Layout/LineLength: Line is too long. [170/120]", 3888612416],
- [143, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 981994949],
- [150, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 4229808912]
+ "ast-merge-git.gemspec:151757427": [
+ [128, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 2821357214],
+ [143, 121, 50, "Layout/LineLength: Line is too long. [170/120]", 3888612416],
+ [144, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 981994949],
+ [151, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 4229808912]
],
"gemfiles/modular/benchmark/r4/v0.5.gemfile:3644720371": [
[1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542]
@@ -82,46 +82,38 @@
"lib/ast-merge-git.rb:2225160157": [
[1, 1, 0, "Naming/FileName: The name of this source file (`ast-merge-git.rb`) should use snake_case.", 5381]
],
- "lib/ast/merge/git.rb:1842264944": [
- [11, 5, 10, "Style/Documentation: Missing top-level documentation comment for `module Ast::Merge::Git`.", 3851934373],
- [11, 5, 16583, "Metrics/ModuleLength: Module has too many lines. [376/100]", 1524969990],
- [17, 7, 487, "Metrics/MethodLength: Method has too many lines. [15/10]", 186495496],
- [35, 7, 2131, "Metrics/AbcSize: Assignment Branch Condition size for `merge3_json` is too high. [<10, 21, 5> 23.79/17]", 4226122829],
- [35, 7, 2131, "Metrics/MethodLength: Method has too many lines. [49/10]", 4226122829],
- [92, 7, 1030, "Metrics/MethodLength: Method has too many lines. [23/10]", 3760313662],
- [119, 7, 1773, "Metrics/AbcSize: Assignment Branch Condition size for `response` is too high. [<0, 20, 6> 20.88/17]", 2729446571],
- [119, 7, 1773, "Metrics/MethodLength: Method has too many lines. [33/10]", 2729446571],
- [119, 19, 285, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [13/5]", 1214652168],
- [119, 20, 2, "Naming/MethodParameterName: Method parameter must be at least 3 characters long.", 5861217],
- [120, 121, 90, "Layout/LineLength: Line is too long. [210/120]", 198321059],
- [136, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2089543276],
- [143, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1756879393],
- [150, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 3825289243],
- [156, 7, 1545, "Metrics/MethodLength: Method has too many lines. [22/10]", 3913227083],
- [158, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 3143802438],
- [182, 7, 633, "Metrics/MethodLength: Method has too many lines. [17/10]", 1596017211],
- [211, 7, 580, "Metrics/MethodLength: Method has too many lines. [14/10]", 806995714],
- [228, 7, 1207, "Metrics/AbcSize: Assignment Branch Condition size for `render_json_owned_region_conflict_source` is too high. [<11, 31, 9> 34.1/17]", 3379641138],
- [228, 7, 1207, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `render_json_owned_region_conflict_source` is too high. [9/7]", 3379641138],
- [228, 7, 1207, "Metrics/MethodLength: Method has too many lines. [22/10]", 3379641138],
- [228, 7, 1207, "Metrics/PerceivedComplexity: Perceived complexity for `render_json_owned_region_conflict_source` is too high. [9/8]", 3379641138],
- [267, 7, 1003, "Metrics/MethodLength: Method has too many lines. [21/10]", 3925322740],
- [322, 7, 647, "Metrics/AbcSize: Assignment Branch Condition size for `merge_json_objects` is too high. [<9, 19, 8> 22.49/17]", 3282600463],
- [322, 7, 647, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `merge_json_objects` is too high. [9/7]", 3282600463],
- [322, 7, 647, "Metrics/MethodLength: Method has too many lines. [14/10]", 3282600463],
- [322, 7, 647, "Metrics/PerceivedComplexity: Perceived complexity for `merge_json_objects` is too high. [9/8]", 3282600463],
- [339, 7, 1225, "Metrics/AbcSize: Assignment Branch Condition size for `classify_json_changes` is too high. [<9, 26, 19> 33.44/17]", 1184093629],
- [339, 7, 1225, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `classify_json_changes` is too high. [16/7]", 1184093629],
- [339, 7, 1225, "Metrics/MethodLength: Method has too many lines. [18/10]", 1184093629],
- [339, 7, 1225, "Metrics/PerceivedComplexity: Perceived complexity for `classify_json_changes` is too high. [16/8]", 1184093629],
- [372, 7, 1204, "Metrics/AbcSize: Assignment Branch Condition size for `merge_json_entry` is too high. [<3, 4, 24> 24.52/17]", 4167732292],
- [372, 7, 1204, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `merge_json_entry` is too high. [19/7]", 4167732292],
- [372, 7, 1204, "Metrics/MethodLength: Method has too many lines. [23/10]", 4167732292],
- [372, 7, 1204, "Metrics/PerceivedComplexity: Perceived complexity for `merge_json_entry` is too high. [19/8]", 4167732292]
- ],
- "spec/fixtures_integration_spec.rb:3913389885": [
- [5, 1, 4397, "Metrics/BlockLength: Block has too many lines. [76/25]", 3987365418],
- [14, 3, 2790, "Metrics/BlockLength: Block has too many lines. [44/25]", 1864930381],
- [19, 5, 2476, "Metrics/BlockLength: Block has too many lines. [39/25]", 2685930561]
+ "lib/ast/merge/git.rb:1420427255": [
+ [12, 5, 10, "Style/Documentation: Missing top-level documentation comment for `module Ast::Merge::Git`.", 3851934373],
+ [12, 5, 14569, "Metrics/ModuleLength: Module has too many lines. [364/100]", 863629740],
+ [19, 7, 487, "Metrics/MethodLength: Method has too many lines. [15/10]", 186495496],
+ [37, 7, 892, "Metrics/MethodLength: Method has too many lines. [23/10]", 4223005176],
+ [66, 7, 813, "Metrics/MethodLength: Method has too many lines. [18/10]", 1966785319],
+ [96, 7, 771, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `merge_json_values` is too high. [8/7]", 3825199411],
+ [96, 7, 771, "Metrics/MethodLength: Method has too many lines. [16/10]", 3825199411],
+ [96, 7, 771, "Metrics/PerceivedComplexity: Perceived complexity for `merge_json_values` is too high. [9/8]", 3825199411],
+ [117, 7, 791, "Metrics/MethodLength: Method has too many lines. [20/10]", 3551257045],
+ [173, 7, 578, "Metrics/MethodLength: Method has too many lines. [16/10]", 3163340030],
+ [192, 7, 1178, "Metrics/MethodLength: Method has too many lines. [22/10]", 4051400949],
+ [217, 7, 678, "Metrics/AbcSize: Assignment Branch Condition size for `render_owned_json_conflict_source` is too high. [<3, 20, 1> 20.25/17]", 3860921953],
+ [217, 7, 678, "Metrics/MethodLength: Method has too many lines. [15/10]", 3860921953],
+ [235, 7, 470, "Metrics/MethodLength: Method has too many lines. [12/10]", 962148087],
+ [261, 7, 1030, "Metrics/MethodLength: Method has too many lines. [23/10]", 3760313662],
+ [288, 7, 1773, "Metrics/AbcSize: Assignment Branch Condition size for `response` is too high. [<0, 20, 6> 20.88/17]", 2729446571],
+ [288, 7, 1773, "Metrics/MethodLength: Method has too many lines. [33/10]", 2729446571],
+ [288, 19, 285, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [13/5]", 1214652168],
+ [288, 20, 2, "Naming/MethodParameterName: Method parameter must be at least 3 characters long.", 5861217],
+ [289, 121, 90, "Layout/LineLength: Line is too long. [210/120]", 198321059],
+ [305, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2089543276],
+ [312, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1756879393],
+ [319, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 3825289243],
+ [325, 7, 1545, "Metrics/MethodLength: Method has too many lines. [22/10]", 3913227083],
+ [327, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 3143802438],
+ [351, 7, 633, "Metrics/MethodLength: Method has too many lines. [17/10]", 1596017211],
+ [380, 7, 580, "Metrics/MethodLength: Method has too many lines. [14/10]", 806995714]
+ ],
+ "spec/fixtures_integration_spec.rb:2251743409": [
+ [5, 1, 4009, "Metrics/BlockLength: Block has too many lines. [66/25]", 2498851053],
+ [14, 3, 2402, "Metrics/BlockLength: Block has too many lines. [34/25]", 3612522178],
+ [19, 5, 2088, "Metrics/BlockLength: Block has too many lines. [29/25]", 113456270]
]
}
diff --git a/gems/ast-merge-git/Gemfile b/gems/ast-merge-git/Gemfile
index 47d5e04b4..d8a97d415 100644
--- a/gems/ast-merge-git/Gemfile
+++ b/gems/ast-merge-git/Gemfile
@@ -25,6 +25,7 @@ gem 'nomono', *nomono_requirements, require: false # ruby >= 2.2
# Direct sibling dependencies (env-switched via STRUCTUREDMERGE_DEV)
direct_sibling_gems = %w[
ast-merge
+ json-merge
]
direct_sibling_dev = ENV.fetch('STRUCTUREDMERGE_DEV', '')
direct_sibling_local =
@@ -151,7 +152,287 @@ if direct_sibling_gems.any? &&
end
end
-# Use the StructuredMerge TLSP branch until upstream ships Ruby 4-compatible gem metadata.
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+# Use the StructuredMerge TSLP branch until upstream ships Ruby 4-compatible gem metadata.
tslp_dev = ENV.fetch('TSLP_DEV', nil)
tslp_declared_by_templating =
ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? && !tslp_dev.to_s.empty?
@@ -160,7 +441,7 @@ unless tslp_declared_by_templating
gem(
'tree_sitter_language_pack',
git: 'https://github.com/structuredmerge/tree-sitter-language-pack.git',
- branch: 'fix/ruby-4-installs',
+ branch: 'fix/ruby-parser-api-methods',
glob: 'packages/ruby/*.gemspec'
)
else
@@ -168,7 +449,7 @@ unless tslp_declared_by_templating
end
end
-# Templating (env-switched: SMORG_RB_DEV=/path/to/structuredmerge/ruby/gems for local paths)
+# Templating (env-switched: STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local paths)
eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?
# Debugging
diff --git a/gems/ast-merge-git/Gemfile.lock b/gems/ast-merge-git/Gemfile.lock
index e46a16edd..6c4aeff4b 100644
--- a/gems/ast-merge-git/Gemfile.lock
+++ b/gems/ast-merge-git/Gemfile.lock
@@ -1,36 +1,288 @@
-GIT
- remote: https://github.com/structuredmerge/tree-sitter-language-pack.git
- revision: dcc959b12d02d6e379abf1c8ac536a852d1b8416
- branch: fix/ruby-4-installs
- glob: packages/ruby/*.gemspec
- specs:
- tree_sitter_language_pack (1.12.5)
- rb_sys (>= 0.9, < 0.9.128)
- sorbet-runtime (~> 0.5)
-
PATH
remote: .
specs:
ast-merge-git (7.1.0)
ast-merge (= 7.1.0)
+ json-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-markdown-markly
+ specs:
+ ast-crispr-markdown-markly (7.1.0)
+ ast-crispr (= 7.1.0)
+ markly-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-ruby-prism
+ specs:
+ ast-crispr-ruby-prism (7.1.0)
+ ast-crispr (= 7.1.0)
+ prism-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr
+ specs:
+ ast-crispr (7.1.0)
+ ast-merge (= 7.1.0)
+ service_actor (~> 3.9)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge
+ specs:
+ ast-merge (7.1.0)
+ benchmark
+ token-resolver (~> 2.0, >= 2.0.4)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-template
+ specs:
+ ast-template (7.1.0)
+ ast-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/bash-merge
+ specs:
+ bash-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.14)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/binary-merge
+ specs:
+ binary-merge (7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/citrus-toml-merge
+ specs:
+ citrus-toml-merge (7.1.0)
+ toml-merge (= 7.1.0)
+ toml-rb (~> 4.1)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/commonmarker-merge
+ specs:
+ commonmarker-merge (7.1.0)
+ commonmarker (~> 2.2)
+ markdown-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/dotenv-merge
+ specs:
+ dotenv-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.14)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/go-merge
+ specs:
+ go-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/json-merge
+ specs:
+ json-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
version_gem (~> 1.1, >= 1.1.9)
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/kettle-jem
+ specs:
+ kettle-jem (7.1.0)
+ addressable (>= 2.8, < 3)
+ ast-crispr-markdown-markly (= 7.1.0)
+ ast-crispr-ruby-prism (= 7.1.0)
+ ast-merge (= 7.1.0)
+ bash-merge (= 7.1.0)
+ citrus-toml-merge (= 7.1.0)
+ commonmarker-merge (= 7.1.0)
+ dotenv-merge (= 7.1.0)
+ json-merge (= 7.1.0)
+ kettle-dev (~> 2.3, >= 2.3.5)
+ kettle-rb (~> 0.1, >= 0.1.4)
+ kramdown-merge (= 7.1.0)
+ markdown-merge (= 7.1.0)
+ markly-merge (= 7.1.0)
+ prism-merge (= 7.1.0)
+ psych-merge (= 7.1.0)
+ rbs (>= 3.10)
+ rbs-merge (= 7.1.0)
+ ruby-merge (= 7.1.0)
+ token-resolver (~> 2.0, >= 2.0.4)
+ toml-merge (= 7.1.0)
+ toml-rb (~> 4.2)
+ tree_haver (= 7.1.0)
+ yaml-merge (= 7.1.0)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/kramdown-merge
+ specs:
+ kramdown-merge (7.1.0)
+ kramdown (~> 2.5)
+ markdown-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/markdown-merge
+ specs:
+ markdown-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/markly-merge
+ specs:
+ markly-merge (7.1.0)
+ markdown-merge (= 7.1.0)
+ markly (~> 0.9)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/parslet-toml-merge
+ specs:
+ parslet-toml-merge (7.1.0)
+ toml (~> 0.3)
+ toml-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/plain-merge
+ specs:
+ plain-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/prism-merge
+ specs:
+ prism-merge (7.1.0)
+ prism (~> 1.6)
+ ruby-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/psych-merge
+ specs:
+ psych-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+ yaml-merge (= 7.1.0)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/rbs-merge
+ specs:
+ rbs-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ rbs (>= 3.10)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.14)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ruby-merge
+ specs:
+ ruby-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/rust-merge
+ specs:
+ rust-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/smorg-rb
+ specs:
+ smorg-rb (7.1.0)
+ ast-merge (= 7.1.0)
+ ast-merge-git (= 7.1.0)
+ go-merge (= 7.1.0)
+ json-merge (= 7.1.0)
+ kettle-jem (= 7.1.0)
+ markly-merge (= 7.1.0)
+ plain-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/toml-merge
+ specs:
+ toml-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/tree_haver
+ specs:
+ tree_haver (7.1.0)
+ citrus (~> 3.0)
+ parslet (~> 2.0)
+ tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/typescript-merge
+ specs:
+ typescript-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/yaml-merge
+ specs:
+ yaml-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/zip-merge
+ specs:
+ zip-merge (7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /var/home/pboling/src/my/structuredmerge/vendor/tree-sitter-language-pack/packages/ruby
+ specs:
+ tree_sitter_language_pack (1.12.5)
+ rb_sys (>= 0.9, < 0.9.128)
+ sorbet-runtime (~> 0.5)
+
GEM
remote: https://gem.coop/
specs:
addressable (2.9.0)
public_suffix (>= 2.0.2, < 8.0)
ansi (1.6.0)
- appraisal2 (3.1.4)
+ appraisal2 (3.2.0)
bundler (>= 1.17.3)
rake (>= 10)
thor (>= 0.14)
ast (2.4.3)
- ast-merge (7.1.0)
- benchmark
- token-resolver (~> 2.0, >= 2.0.4)
- tree_haver (= 7.1.0)
- version_gem (~> 1.1, >= 1.1.9)
backports (3.25.3)
benchmark (0.5.0)
bigdecimal (4.1.2)
@@ -39,6 +291,12 @@ GEM
thor (~> 1.0)
citrus (3.0.2)
cmdparse (3.0.7)
+ commonmarker (2.9.0-aarch64-linux)
+ commonmarker (2.9.0-aarch64-linux-musl)
+ commonmarker (2.9.0-arm64-darwin)
+ commonmarker (2.9.0-x86_64-darwin)
+ commonmarker (2.9.0-x86_64-linux)
+ commonmarker (2.9.0-x86_64-linux-musl)
concurrent-ruby (1.3.7)
date (3.5.1)
debug (1.11.1)
@@ -97,11 +355,13 @@ GEM
rdoc (>= 4.0.0)
reline (>= 0.4.2)
json (2.21.1)
- kettle-dev (2.3.6)
+ kettle-dev (2.3.7)
emoji_regex (>= 15.0)
kettle-rb (~> 0.1, >= 0.1.2)
kettle-test (~> 2.0, >= 2.0.4)
ruby-progressbar (~> 1.13)
+ kettle-drift (1.0.5)
+ version_gem (~> 1.1, >= 1.1.13)
kettle-rb (0.1.4)
kettle-soup-cover (1.1.3)
simplecov (~> 0.22)
@@ -130,6 +390,7 @@ GEM
language_server-protocol (3.17.0.6)
lint_roller (1.1.0)
logger (1.7.0)
+ markly (0.16.0)
mutex_m (0.3.0)
nokogiri (1.19.4-aarch64-linux-gnu)
racc (~> 1.4)
@@ -269,6 +530,8 @@ GEM
ruby-progressbar (1.13.0)
ruby_engine (2.0.3)
ruby_version (1.0.3)
+ service_actor (3.9.4)
+ zeitwerk (>= 1.0)
silent_stream (1.0.12)
logger (~> 1.2)
version_gem (>= 1.1.8, < 3)
@@ -321,13 +584,13 @@ GEM
token-resolver (2.0.4)
parslet (~> 2.0)
version_gem (~> 1.1, >= 1.1.13)
- tree_haver (7.1.0)
- citrus (~> 3.0)
- parslet (~> 2.0)
- tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0)
- version_gem (~> 1.1, >= 1.1.9)
+ toml (0.3.0)
+ parslet (>= 1.8.0, < 3.0.0)
+ toml-rb (4.2.0)
+ citrus (~> 3.0, > 3.0)
+ racc (~> 1.7)
tsort (0.2.0)
- turbo_tests2 (3.1.14)
+ turbo_tests2 (3.2.0)
parallel_tests (>= 3.3.0, < 6)
rspec (>= 3.10)
version_gem (~> 1.1, >= 1.1.14)
@@ -352,7 +615,7 @@ GEM
yard
yard-relative_markdown_links (0.6.0)
nokogiri (>= 1.14.3, < 2)
- yard-timekeeper (0.2.3)
+ yard-timekeeper (0.2.4)
version_gem (~> 1.1, >= 1.1.13)
yard-yaml (0.2.3)
version_gem (~> 1.1, >= 1.1.13)
@@ -372,23 +635,45 @@ PLATFORMS
DEPENDENCIES
addressable (>= 2.8, < 3)
appraisal2 (~> 3.0, >= 3.0.6)
+ ast-crispr!
+ ast-crispr-markdown-markly!
+ ast-crispr-ruby-prism!
+ ast-merge!
ast-merge-git!
+ ast-template!
+ bash-merge!
benchmark (~> 0.5, >= 0.5.0)
+ binary-merge!
bundler-audit (~> 0.9.3)
+ citrus-toml-merge!
+ commonmarker-merge!
debug (>= 1.1)
+ dotenv-merge!
erb (~> 6.0, >= 6.0.4)
gem_bench (~> 2.0, >= 2.0.5)
gitmoji-regex (~> 2.0, >= 2.0.0)
+ go-merge!
irb (~> 1.17)
+ json-merge!
kettle-dev (~> 2.0, >= 2.2.25)
+ kettle-drift (~> 1.0, >= 1.0.5)
+ kettle-jem!
kettle-soup-cover (~> 1.0, >= 1.1.3)
kettle-test (~> 2.0, >= 2.0.9)
kramdown (~> 2.5, >= 2.5.1)
+ kramdown-merge!
kramdown-parser-gfm (~> 1.1)
+ markdown-merge!
+ markly-merge!
mutex_m (~> 0.2)
nomono (~> 1.0, >= 1.0.8)
+ parslet-toml-merge!
+ plain-merge!
+ prism-merge!
+ psych-merge!
rake (~> 13.0)
rbs (>= 3.0)
+ rbs-merge!
rdoc (~> 6.11)
reek (~> 6.5)
require_bench (~> 1.0, >= 1.0.4)
@@ -397,32 +682,54 @@ DEPENDENCIES
rubocop-packaging (~> 0.6, >= 0.6.0)
rubocop-rspec (~> 3.6)
rubocop-ruby3_2 (~> 3.0.0)
+ ruby-merge!
ruby-progressbar (~> 1.13)
+ rust-merge!
+ smorg-rb!
standard (>= 1.50)
stone_checksums (~> 1.0, >= 1.0.3)
stringio (>= 3.0)
+ toml-merge!
+ tree_haver!
tree_sitter_language_pack!
+ typescript-merge!
yaml-converter (~> 0.1)
+ yaml-merge!
yard (~> 0.9, >= 0.9.44)
yard-fence (~> 0.9, >= 0.9.1)
yard-junk (~> 0.1, >= 0.1.0)
yard-relative_markdown_links (~> 0.6)
yard-timekeeper (~> 0.1)
yard-yaml (~> 0.1, >= 0.1.2)
+ zip-merge!
CHECKSUMS
addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af
ansi (1.6.0) sha256=ac9ea0c0ea8d32fb4e271348e609963ac78882f34b73836c2a02b3622e666658
- appraisal2 (3.1.4) sha256=f88c27e600adf4bd5bf06c0ab0afd1de6ce4361497760ce35e86e782036286f4
+ appraisal2 (3.2.0) sha256=ccd0b767ac4060cd7af6d16747459b6990f49c39c7b4fb1f7d1146b1e97c492f
ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
+ ast-crispr (7.1.0)
+ ast-crispr-markdown-markly (7.1.0)
+ ast-crispr-ruby-prism (7.1.0)
ast-merge (7.1.0)
ast-merge-git (7.1.0)
+ ast-template (7.1.0)
backports (3.25.3) sha256=94298d32dc3c40ca15633b54e282780b49e2db0c045f602ea1907e4f63a17235
+ bash-merge (7.1.0)
benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c
bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd
+ binary-merge (7.1.0)
bundler-audit (0.9.3) sha256=81c8766c71e47d0d28a0f98c7eed028539f21a6ea3cd8f685eb6f42333c9b4e9
citrus (3.0.2) sha256=4ec2412fc389ad186735f4baee1460f7900a8e130ffe3f216b30d4f9c684f650
+ citrus-toml-merge (7.1.0)
cmdparse (3.0.7) sha256=f7c5cace10bec6abf853370ae095e4b97a84ed9d847b3fb38f41cc4fbc950739
+ commonmarker (2.9.0-aarch64-linux) sha256=e2b4aadb9a2cfa4e206582641ce3a49465549ac1ed4c289fdd63b78d8f24579c
+ commonmarker (2.9.0-aarch64-linux-musl) sha256=1cf4d2821f2a7e64945f1ed7c4eeced586fdb27ea7fe7337788802cf8f57cfca
+ commonmarker (2.9.0-arm64-darwin) sha256=1748dbfa4f5813b0d2a14bb4bbfa65a4ec293aa1c825016d60029ee0e132b046
+ commonmarker (2.9.0-x86_64-darwin) sha256=0a9914ccfd2f5d2a59c7bd0dda4fe90eb084cf513b477e499008e09ec9d6edd6
+ commonmarker (2.9.0-x86_64-linux) sha256=8cfe92970eef585a19ddf6613224b91cab64d6029834661bda801f877c9c7f43
+ commonmarker (2.9.0-x86_64-linux-musl) sha256=293921398b839f79ceaf55010e061357e34f053822c3b003cd0be6686176335e
+ commonmarker-merge (7.1.0)
concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0
date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0
debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6
@@ -430,6 +737,7 @@ CHECKSUMS
diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962
diffy (3.4.4) sha256=79384ab5ca82d0e115b2771f0961e27c164c456074bd2ec46b637ebf7b6e47e3
docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e
+ dotenv-merge (7.1.0)
dry-configurable (1.4.0) sha256=e35d1b5f3c081753ef361f564919db79000f32cfa6f20ee3a3ba5921b41b73ce
dry-core (1.2.0) sha256=0cc5a7da88df397f153947eeeae42e876e999c1e30900f3c536fb173854e96a1
dry-inflector (1.3.1) sha256=7fb0c2bb04f67638f25c52e7ba39ab435d922a3a5c3cd196120f63accb682dcc
@@ -442,19 +750,27 @@ CHECKSUMS
gem_bench (2.0.5) sha256=0dc0fb44a5a5eb7b2f5c1c68a5b0164d72007132822c012bac3abe976b199ead
geom2d (0.4.1) sha256=ea0998ea90c4f2752e24fe13d85a4f89bee689d151316140ebcc6369bf634ed9
gitmoji-regex (2.0.4) sha256=01410d3217940bd0e7b2299ec805245afe8d0f06a5d6d38f623d63a63c0ac34f
+ go-merge (7.1.0)
hexapdf (1.9.1) sha256=2d1f6a3622e6bc2a70a707d4c3f3fa44f5552ecd9d899f6283abb07398a84884
io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc
irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3
json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583
- kettle-dev (2.3.6) sha256=955b01e8aca46438365332d1b4413f22cb58dabfeab5cba04d71237c53cc70ae
+ json-merge (7.1.0)
+ kettle-dev (2.3.7) sha256=eb370113cd030d03cbe2d33b31c99858951017e5ad21a17e9ed89dc3770028ee
+ kettle-drift (1.0.5) sha256=07094e80140a049164142820bdd327c30fcd855bb00697a0a430600a2b5144a2
+ kettle-jem (7.1.0)
kettle-rb (0.1.4) sha256=9cef7ce4f7021666b7222292f29051e51eaf042e8a5db11f3f4dd72f74243fc1
kettle-soup-cover (1.1.3) sha256=a373827da22a7131d093afd32945e5b7d7a10a01ebfdded8fd2cb8230d69c8ad
kettle-test (2.0.11) sha256=c710c90f7ab79d51f9452f0c09f5f90657e7a893f63583855c164d0b1b107ab2
kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa
+ kramdown-merge (7.1.0)
kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729
language_server-protocol (3.17.0.6) sha256=5ef2c0c138f8267e1bc631d3328347d354f96724b0af22f2c79516120443b7f0
lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87
logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
+ markdown-merge (7.1.0)
+ markly (0.16.0) sha256=6f70d79e385b1efc9e171f74c81628826259039fe6c778e03c3924c71dac5511
+ markly-merge (7.1.0)
mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751
nokogiri (1.19.4-aarch64-linux-gnu) sha256=1269fb644a6de405057a53dd5c762b1209b43ca7424f839454d3dbc677c31a8f
nokogiri (1.19.4-aarch64-linux-musl) sha256=35c65b9ce72b3bb03207bdbe7067915019dc18c1b9b59139684bd6690fdd01af
@@ -469,10 +785,14 @@ CHECKSUMS
parallel_tests (5.7.0) sha256=3f1762c46ca2c223b8af8ef877217f9d76974e191bfa934f2580b58bcf1d005c
parser (3.3.12.0) sha256=21a6d7f755d5a24dfbdc6e6b772e4e879a52e7631a88bc5a3a134606052c9828
parslet (2.0.0) sha256=d45130695d39b43d7e6a91f4d2ec66b388a8d822bae38de9b4de9a5fbde1f606
+ parslet-toml-merge (7.1.0)
+ plain-merge (7.1.0)
pp (0.6.4) sha256=dfcb0fce700c41456265922884f9fe195d7fbb0674a3578e6c0f69588e82b570
prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193
prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85
+ prism-merge (7.1.0)
psych (5.4.0) sha256=14f72d69a611af663d7d70e4a7b67d9eb1f3ae9f8d916b478961d5a0075ba5b7
+ psych-merge (7.1.0)
public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623
racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
@@ -480,6 +800,7 @@ CHECKSUMS
rake-compiler-dock (1.12.0) sha256=f13205c2738f3d2053afcd03491a9e4541b22a59a0bfc53fc8bc883bd8188023
rb_sys (0.9.127) sha256=e9f90df3bb0577472d26d96127d5b5774b98f44de881e7d36aeefd28d6337847
rbs (4.0.3) sha256=5a7bf70e2628549d9a1f44eae447b2cfe55968a9c60cfff52693a4bdcc020e14
+ rbs-merge (7.1.0)
rdoc (6.17.0) sha256=0f50d4e568fc98195f9bb155a9e8dff6c7feabfb515fb22ef6df1d12ad5a02b7
reek (6.5.0) sha256=d26d3a492773b2bbc228888067a21afe33ac07954a17dbd64cdeae42c4c69be1
regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb
@@ -507,9 +828,12 @@ CHECKSUMS
rubocop-rspec (3.10.2) sha256=0b3e2ecc592cd10ecbf0095bb58d1e357905276e069643523cc19eb7495f65e2
rubocop-ruby3_2 (3.0.7) sha256=f53dd6d286fb05186214fc6ec116783e7f837030918e8931c05de773e98f8466
rubocop-thread_safety (0.7.3) sha256=067cdd52fbf5deffc18995437e45b5194236eaff4f71de3375a1f6052e48f431
+ ruby-merge (7.1.0)
ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
ruby_engine (2.0.3) sha256=ca2ae7def8cfcdc2bfb6a186d36d5d59c8b403245dc0256c3802b767fa278aaa
ruby_version (1.0.3) sha256=5930f9950746b7e6c973184398ee364ee7440b170fef7922b9f5cdf317f1ccb5
+ rust-merge (7.1.0)
+ service_actor (3.9.4) sha256=e63b523630b9a7e62959b2a90113b08d2565b5de9c148557b281ef847c9539ce
silent_stream (1.0.12) sha256=377c43aa10033fe90c33b39ea8cd97d79f2d1c4856df598efc56f3091f3ae782
simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5
simplecov-cobertura (3.2.0) sha256=70d702658677fcb20e5aceb6915ccf8bc62ff2ccd38b62b3ad5c9db5c0888740
@@ -518,6 +842,7 @@ CHECKSUMS
simplecov-lcov (0.9.0) sha256=7a77a31e200a595ed4b0249493056efd0c920601f53d2ef135ca34ee796346cd
simplecov-rcov (0.3.7) sha256=372f50bf6df6b6350b7d0c840f2f8bdabe021861a43c26877b747c9ac96139fc
simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428
+ smorg-rb (7.1.0)
sorbet-runtime (0.6.13342) sha256=dbeb9892597f593ed2b29e38018912787f6c4e0c4b736d8af0d6bd3c63bde3c3
standard (1.56.0) sha256=ae2af4d9669589162ac69ed5ef59dcf9f346d4afc81f7e62b84339310dfcb787
standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b
@@ -531,21 +856,27 @@ CHECKSUMS
timecop (0.9.11) sha256=41284dc6e5041f2184f781ace766f942108c842f8d8c1386a26e6343decc7542
timecop-rspec (1.0.3) sha256=005f14841bb606dcaefb060e321b5388e2e59537742bee8b3a9a9a40e598fab9
token-resolver (2.0.4) sha256=33b926958f504525bba3ed511ab66fbcbf8ef30390815e931436b30f27ffcad0
+ toml (0.3.0) sha256=0a91d0f76a9036e84e44f95693b12f58d358c1df3ac8e3b5271f2056ecc6e4b9
+ toml-merge (7.1.0)
+ toml-rb (4.2.0) sha256=10a48c91613e20cf63483a7a776767dfb3cd7d70e9327c0237443da601e13776
tree_haver (7.1.0)
tree_sitter_language_pack (1.12.5)
tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f
- turbo_tests2 (3.1.14) sha256=cc29d5b36bdbba67a83eee09a9546880d0926edfbbe50d99633fc0b5763ee94c
+ turbo_tests2 (3.2.0) sha256=8b35421548399d1923567b177970f42671c65695b93cdd134d78fbcbab85dff0
+ typescript-merge (7.1.0)
unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42
unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f
version_gem (1.1.14) sha256=6b7306c7e9416d06067561981ab3444e2cecb844f26cc325ae3c27b44cf85613
yaml-converter (0.2.3) sha256=d35e69e547610d9e347672cc277fcb7d71dff3c53a942e66f82b1c64022ada72
+ yaml-merge (7.1.0)
yard (0.9.45) sha256=52e211493f7cb8a3ebf7e104a25a1e73937a3103092545d34cb88fafebb3dc51
yard-fence (0.9.6) sha256=3d1dbf4e3df462ac78b8bd2e01cf740a2de20168387c929aca31a0bcee490659
yard-junk (0.1.0) sha256=e85fe2ec1afa47313decd333447b53458cb1ed49b510b70015fdc3041a94bcdd
yard-relative_markdown_links (0.6.0) sha256=3e5ffa85cbad9bac70bee5421774b190fb25d3bdf489323a5b3534f647d1a70e
- yard-timekeeper (0.2.3) sha256=849a3e74a0484b1e0b5209cf86823e418b3091e21f4f143c141d38e1cc262034
+ yard-timekeeper (0.2.4) sha256=62f8d001d737c6e2ac688e7b37386f958dceb0f6aff9c909575e1bec8d20775a
yard-yaml (0.2.3) sha256=fe5fef18819e1cbd05bb8f1b9e1baad6bf70c28125eb75b57bbf6397b0831812
zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12
+ zip-merge (7.1.0)
zlib (3.2.3) sha256=5bd316698b32f31a64ab910a8b6c282442ca1626a81bbd6a1674e8522e319c20
BUNDLED WITH
diff --git a/gems/ast-merge-git/ast-merge-git.gemspec b/gems/ast-merge-git/ast-merge-git.gemspec
index 8a8945ca1..f0b4704eb 100644
--- a/gems/ast-merge-git/ast-merge-git.gemspec
+++ b/gems/ast-merge-git/ast-merge-git.gemspec
@@ -96,6 +96,7 @@ Gem::Specification.new do |spec|
# Utilities
spec.add_dependency 'ast-merge', "= #{spec.version}"
+ spec.add_dependency 'json-merge', "= #{spec.version}"
spec.add_dependency('version_gem', '~> 1.1', '>= 1.1.9') # ruby >= 2.2.0
# NOTE: It is preferable to list development dependencies in the gemspec due to increased
diff --git a/gems/ast-merge-git/gemfiles/modular/templating.gemfile b/gems/ast-merge-git/gemfiles/modular/templating.gemfile
index 0d1c9bcf4..e3c24e6b7 100644
--- a/gems/ast-merge-git/gemfiles/modular/templating.gemfile
+++ b/gems/ast-merge-git/gemfiles/modular/templating.gemfile
@@ -1,9 +1,9 @@
# frozen_string_literal: true
-smorg_remote = ENV.fetch('SMORG_RB_DEV', 'false').casecmp('false').zero?
+structuredmerge_remote = ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false').zero?
kettle_remote = ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero?
-if smorg_remote
+if structuredmerge_remote
# Merge recipes and parser dependencies for released installs.
gem 'kettle-jem', '>= 7.0'
end
@@ -13,10 +13,10 @@ if kettle_remote
gem 'kettle-drift', '~> 1.0', '>= 1.0.5', require: false
end
-# Set SMORG_RB_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies.
+# Set STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies.
# When false (default / CI), released kettle-jem brings merge gems and parser dependencies.
# Local path overrides bring the same dependencies from sibling gemspecs.
#
# Set KETTLE_RB_DEV=/path/to/kettle-rb for local development with Kettle plugin gems.
# When false (default / CI), released Kettle plugin gems are used.
-eval_gemfile 'templating_local.gemfile' unless smorg_remote && kettle_remote
+eval_gemfile 'templating_local.gemfile' unless structuredmerge_remote && kettle_remote
diff --git a/gems/ast-merge-git/gemfiles/modular/templating_local.gemfile b/gems/ast-merge-git/gemfiles/modular/templating_local.gemfile
index ab827c840..62371754c 100644
--- a/gems/ast-merge-git/gemfiles/modular/templating_local.gemfile
+++ b/gems/ast-merge-git/gemfiles/modular/templating_local.gemfile
@@ -1,12 +1,12 @@
# frozen_string_literal: true
# Local path overrides for templating development.
-# Loaded by the associated non-local gemfile when SMORG_RB_DEV or KETTLE_RB_DEV
+# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_RB_DEV
# is not "false".
require 'nomono/bundler' unless defined?(Nomono)
-smorg_rb_local_gems = %w[
+structuredmerge_local_gems = %w[
tree_haver
ast-merge
ast-merge-git
@@ -43,7 +43,7 @@ kettle_rb_local_gems = %w[
kettle-dev kettle-test kettle-soup-cover kettle-drift
]
declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name)
-smorg_rb_local_gems_to_eval = smorg_rb_local_gems - %w[ast-merge-git] - declared_gems
+structuredmerge_local_gems_to_eval = structuredmerge_local_gems - %w[ast-merge-git] - declared_gems
kettle_rb_local_gems_to_eval = kettle_rb_local_gems - %w[ast-merge-git] - declared_gems
tslp_dev = ENV.fetch('TSLP_DEV', nil)
@@ -52,14 +52,14 @@ tslp_dev = ENV.fetch('TSLP_DEV', nil)
platform :mri do
gem 'tree_sitter_language_pack', path: tslp_dev unless tslp_dev.to_s.empty?
- if ENV.fetch('SMORG_RB_DEV', 'false').casecmp('false') != 0
+ if ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false') != 0
eval_nomono_gems(
- gems: smorg_rb_local_gems_to_eval,
- prefix: 'SMORG_RB',
- path_env: 'SMORG_RB_DEV',
+ gems: structuredmerge_local_gems_to_eval,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
vendored_gems_env: 'VENDORED_GEMS',
vendor_gem_dir_env: 'VENDOR_GEM_DIR',
- debug_env: 'SMORG_RB_DEBUG'
+ debug_env: 'STRUCTUREDMERGE_DEBUG'
)
end
diff --git a/gems/ast-merge-git/lib/ast/merge/git.rb b/gems/ast-merge-git/lib/ast/merge/git.rb
index f1766c986..ff5e800f5 100644
--- a/gems/ast-merge-git/lib/ast/merge/git.rb
+++ b/gems/ast-merge-git/lib/ast/merge/git.rb
@@ -1,9 +1,10 @@
# frozen_string_literal: true
-require 'json'
require 'version_gem'
require 'ast/merge'
+require 'json'
+require 'json/merge'
require_relative 'git/version'
module Ast
@@ -11,6 +12,7 @@ module Merge
module Git
PACKAGE_NAME = 'ast-merge-git'
MERGE_CONFLICT_CATEGORY = 'merge_conflict'
+ MISSING = Object.new.freeze
module_function
@@ -33,58 +35,225 @@ def merge3(request)
end
def merge3_json(request)
- base = parse_json_role('base', request.fetch(:base_source))
- ours = parse_json_role('ours', request.fetch(:ours_source))
- theirs = parse_json_role('theirs', request.fetch(:theirs_source))
- conflicts = []
- change_classifications = classify_json_changes(base, ours, theirs)
- merged = merge_json_value(base, ours, theirs, '', conflicts)
- if conflicts.any?
- owned_regions = json_owned_regions_for_conflicts(request, conflicts)
- render_strategy = owned_regions.empty? ? 'full_file_conflict_markers' : 'owned_region_conflict_markers'
+ parsed = parse_json_merge3_inputs(request)
+ return parsed unless parsed.is_a?(Hash) && parsed[:ok]
+
+ merge = merge_json_values(
+ parsed.fetch(:base),
+ parsed.fetch(:ours),
+ parsed.fetch(:theirs),
+ path: ''
+ )
+
+ if merge.fetch(:conflicts).empty?
+ merged_source = "#{JSON.pretty_generate(merge.fetch(:value))}\n"
return response(
- ok: false,
+ ok: true,
request: request,
- conflicted_source: render_json_owned_region_conflict_source(request,
- owned_regions.first) || render_conflict_source(
- request, conflicts
- ),
- conflicts: conflicts,
- change_classifications: change_classifications,
- owned_regions: owned_regions,
- render_strategy: render_strategy,
- diagnostics: [{
- severity: 'error',
- category: MERGE_CONFLICT_CATEGORY,
- message: "merge3 found #{conflicts.length} unresolved conflict(s)."
- }]
+ merged_source: merged_source,
+ change_classifications: merge.fetch(:change_classifications),
+ reparse_after_render: reparse_json_source(merged_source),
+ formatting_preservation: {
+ line_diff_score: 1.0,
+ character_diff_score: 1.0
+ }
)
end
- output = JSON.generate(merged)
- response(
+ render_conflicted_json(request, merge)
+ end
+
+ def parse_json_merge3_inputs(request)
+ dialect = request[:dialect].to_s.empty? ? 'json' : request[:dialect].to_s
+ {
ok: true,
- request: request,
- merged_source: output,
- change_classifications: change_classifications,
- reparse_after_render: JSON.parse(output) && true,
- formatting_preservation: {
- line_diff_score: 1.0,
- character_diff_score: 1.0
- }
- )
- rescue JSON::ParserError => e
+ base: Json::Merge.json_value_for_source(request.fetch(:base_source), dialect: dialect),
+ ours: Json::Merge.json_value_for_source(request.fetch(:ours_source), dialect: dialect),
+ theirs: Json::Merge.json_value_for_source(request.fetch(:theirs_source), dialect: dialect)
+ }
+ rescue Json::Merge::ParseError => e
+ source_role = parse_error_role(request, dialect)
response(
ok: false,
request: request,
diagnostics: [{
severity: 'error',
category: 'parse_error',
- message: e.message
+ message: "#{source_role} parse error: #{e.message}"
}]
)
end
+ def parse_error_role(request, dialect)
+ %i[base ours theirs].find do |role|
+ Json::Merge.json_value_for_source(request.fetch(:"#{role}_source"), dialect: dialect)
+ false
+ rescue Json::Merge::ParseError
+ true
+ end || :unknown
+ end
+
+ def merge_json_values(base, ours, theirs, path:)
+ if ours == theirs
+ return merge_success(ours)
+ elsif base == ours
+ return merge_success(theirs, change: classify_json_change(path, base, ours, theirs))
+ elsif base == theirs
+ return merge_success(ours, change: classify_json_change(path, base, ours, theirs))
+ end
+
+ if base.is_a?(Hash) && ours.is_a?(Hash) && theirs.is_a?(Hash)
+ return merge_json_objects(base, ours, theirs, path: path)
+ end
+
+ conflict = json_conflict(path, base, ours, theirs)
+ {
+ value: ours.equal?(MISSING) ? theirs : ours,
+ conflicts: [conflict],
+ change_classifications: [conflict.fetch(:change_classification)]
+ }
+ end
+
+ def merge_json_objects(base, ours, theirs, path:)
+ merged = {}
+ conflicts = []
+ change_classifications = []
+ ordered_keys(base, ours, theirs).each do |key|
+ child_path = "#{path}/#{key}"
+ child = merge_json_values(
+ base.fetch(key, MISSING),
+ ours.fetch(key, MISSING),
+ theirs.fetch(key, MISSING),
+ path: child_path
+ )
+ merged[key] = child.fetch(:value) unless child.fetch(:value).equal?(MISSING)
+ conflicts.concat(child.fetch(:conflicts))
+ change_classifications.concat(child.fetch(:change_classifications))
+ end
+
+ {
+ value: merged,
+ conflicts: conflicts,
+ change_classifications: change_classifications
+ }
+ end
+
+ def ordered_keys(*objects)
+ objects.each_with_object([]) do |object, keys|
+ next unless object.is_a?(Hash)
+
+ object.each_key { |key| keys << key unless keys.include?(key) }
+ end
+ end
+
+ def merge_success(value, change: nil)
+ {
+ value: value,
+ conflicts: [],
+ change_classifications: change ? [change] : []
+ }
+ end
+
+ def classify_json_change(path, base, ours, theirs)
+ {
+ path: path,
+ ours: json_change_state(base, ours),
+ theirs: json_change_state(base, theirs)
+ }
+ end
+
+ def json_change_state(base, value)
+ return 'unchanged' if base == value
+ return 'added' if base.equal?(MISSING)
+ return 'deleted' if value.equal?(MISSING)
+
+ 'edited'
+ end
+
+ def json_conflict(path, base, ours, theirs)
+ category =
+ if ours.equal?(MISSING) || theirs.equal?(MISSING)
+ 'delete_edit'
+ else
+ 'edit_edit'
+ end
+ {
+ conflict_id: "json-conflict-#{path.delete_prefix('/').tr('/', '-')}",
+ category: category,
+ path: path,
+ message: "JSON value changed incompatibly at #{path}",
+ base: base,
+ ours: ours,
+ theirs: theirs,
+ change_classification: classify_json_change(path, base, ours, theirs)
+ }
+ end
+
+ def render_conflicted_json(request, merge)
+ conflicts = merge.fetch(:conflicts)
+ full_file = conflicts.any? { |conflict| conflict.fetch(:category) == 'delete_edit' }
+ conflicted_source = if full_file
+ render_conflict_source(request, conflicts)
+ else
+ render_owned_json_conflict_source(request, conflicts.first)
+ end
+ response(
+ ok: false,
+ request: request,
+ conflicted_source: conflicted_source,
+ conflicts: conflicts.map { |conflict| conflict.slice(:conflict_id, :category, :path, :message) },
+ change_classifications: merge.fetch(:change_classifications),
+ diagnostics: [{
+ severity: 'error',
+ category: MERGE_CONFLICT_CATEGORY,
+ message: "#{conflicts.length} unresolved JSON merge conflict(s)."
+ }],
+ owned_regions: full_file ? [] : [owned_json_region(conflicts.first)],
+ reparse_after_render: nil,
+ render_strategy: full_file ? 'full_file_conflict_markers' : 'owned_region_conflict_markers'
+ )
+ end
+
+ def render_owned_json_conflict_source(request, conflict)
+ marker_size = request[:conflict_marker_size].to_i
+ marker_size = 7 unless marker_size.positive?
+ key = conflict.fetch(:path).split('/').last
+ [
+ '{',
+ "#{'<' * marker_size} ours",
+ "#{JSON.generate(key)}:#{JSON.generate(conflict.fetch(:ours))}",
+ "#{'|' * marker_size} base",
+ "#{JSON.generate(key)}:#{JSON.generate(conflict.fetch(:base))}",
+ '=' * marker_size,
+ "#{JSON.generate(key)}:#{JSON.generate(conflict.fetch(:theirs))}",
+ "#{'>' * marker_size} theirs",
+ '}',
+ ''
+ ].join("\n")
+ end
+
+ def owned_json_region(conflict)
+ {
+ owner_path: conflict.fetch(:path),
+ node_id: "json:key:#{conflict.fetch(:path).split('/').last}",
+ region_kind: 'node',
+ line_range: { start: 1, end: 1 },
+ attached_spans: [],
+ backend_id: 'tree-haver',
+ parser_identity: 'tree_sitter_language_pack',
+ can_replace: true,
+ can_line_merge: false,
+ requires_reparse: true
+ }
+ end
+
+ def reparse_json_source(source)
+ Json::Merge.json_value_for_source(source)
+ true
+ rescue Json::Merge::ParseError
+ false
+ end
+
def normalize_request(request)
request.transform_keys(&:to_sym)
end
@@ -202,7 +371,7 @@ def secondary_formatting_metrics_for(merged)
def render_identity(request)
case normalize_language(request)
when 'json'
- { backend_id: 'native-json', parser_identity: 'standard-json' }
+ { backend_id: 'tree-haver', parser_identity: 'tree_sitter_language_pack' }
else
{}
end
@@ -225,188 +394,6 @@ def render_conflict_source(request, conflicts)
].join("\n")
end
- def render_json_owned_region_conflict_source(request, region)
- return nil unless region && region.fetch(:region_kind) == 'node'
-
- key = region.fetch(:owner_path).delete_prefix('/')
- ours_region = json_member_source(request.fetch(:ours_source), key)
- base_region = json_member_source(request.fetch(:base_source), key)
- theirs_region = json_member_source(request.fetch(:theirs_source), key)
- return nil unless ours_region && base_region && theirs_region
-
- marker_size = request[:conflict_marker_size].to_i
- marker_size = 7 unless marker_size.positive?
- replacement = [
- "#{'<' * marker_size} ours",
- ours_region.fetch(:text),
- "#{'|' * marker_size} base",
- base_region.fetch(:text),
- '=' * marker_size,
- theirs_region.fetch(:text),
- "#{'>' * marker_size} theirs"
- ].join("\n")
- range = ours_region.fetch(:byte_range)
- source = request.fetch(:ours_source)
- prefix = source.byteslice(0, range.fetch(:start)) || ''
- suffix = source.byteslice(range.fetch(:end), source.bytesize - range.fetch(:end)) || ''
- prefix + replacement + suffix
- end
-
- def json_member_source(source, key)
- return nil unless source.include?("\"#{key}\"")
-
- range = json_key_byte_range(source, key)
- return nil if range.fetch(:end) <= range.fetch(:start)
-
- {
- byte_range: range,
- text: source.byteslice(range.fetch(:start)...range.fetch(:end))
- }
- end
-
- def json_owned_regions_for_conflicts(request, conflicts)
- conflicts.filter_map do |conflict|
- path = conflict.fetch(:path).to_s
- next unless path.start_with?('/') && path.count('/') == 1
-
- key = path.delete_prefix('/')
- base_region = json_member_source(request.fetch(:base_source), key)
- next unless base_region && json_member_source(request.fetch(:ours_source),
- key) && json_member_source(request.fetch(:theirs_source), key)
-
- {
- owner_path: path,
- node_id: "json:key:#{key}",
- region_kind: 'node',
- byte_range: base_region.fetch(:byte_range),
- line_range: { start: 1, end: 1 },
- attached_spans: [],
- backend_id: 'native-json',
- parser_identity: 'standard-json',
- can_replace: true,
- can_line_merge: false,
- requires_reparse: true
- }
- end
- end
-
- def json_key_byte_range(source, key)
- needle = "\"#{key}\""
- start = source.index(needle)
- return { start: 0, end: source.bytesize } unless start
-
- finish = start + needle.bytesize
- finish += 1 while finish < source.bytesize && ![',', '}'].include?(source[finish])
- { start: start, end: finish }
- end
-
- def parse_json_role(role, source)
- JSON.parse(source)
- rescue JSON::ParserError => e
- raise JSON::ParserError, "#{role} parse error: #{e.message}"
- end
-
- def merge_json_value(base, ours, theirs, path, conflicts)
- return ours if ours == theirs
- return theirs if base == ours
- return ours if base == theirs
- if base.is_a?(Hash) && ours.is_a?(Hash) && theirs.is_a?(Hash)
- return merge_json_objects(base, ours, theirs, path,
- conflicts)
- end
-
- add_conflict(conflicts, 'edit_edit', path, 'value changed differently in ours and theirs')
- ours
- end
-
- def merge_json_objects(base, ours, theirs, path, conflicts)
- base = base.transform_keys(&:to_s)
- ours = ours.transform_keys(&:to_s)
- theirs = theirs.transform_keys(&:to_s)
- keys = (base.keys | ours.keys | theirs.keys).sort
- keys.each_with_object({}) do |key, result|
- merged, keep = merge_json_entry(
- base.key?(key) ? base[key] : :__absent__,
- ours.key?(key) ? ours[key] : :__absent__,
- theirs.key?(key) ? theirs[key] : :__absent__,
- json_pointer_join(path, key),
- conflicts
- )
- result[key] = merged if keep
- end
- end
-
- def classify_json_changes(base, ours, theirs)
- if base.is_a?(Hash) && ours.is_a?(Hash) && theirs.is_a?(Hash)
- base = base.transform_keys(&:to_s)
- ours = ours.transform_keys(&:to_s)
- theirs = theirs.transform_keys(&:to_s)
- keys = (base.keys | ours.keys | theirs.keys).sort
- return keys.filter_map do |key|
- ours_change = classify_json_value_change(base.key?(key) ? base[key] : :__absent__,
- ours.key?(key) ? ours[key] : :__absent__)
- theirs_change = classify_json_value_change(base.key?(key) ? base[key] : :__absent__,
- theirs.key?(key) ? theirs[key] : :__absent__)
- next if ours_change == 'unchanged' && theirs_change == 'unchanged'
-
- { path: json_pointer_join('', key), ours: ours_change, theirs: theirs_change }
- end
- end
-
- ours_change = classify_json_value_change(base, ours)
- theirs_change = classify_json_value_change(base, theirs)
- return [] if ours_change == 'unchanged' && theirs_change == 'unchanged'
-
- [{ path: '/', ours: ours_change, theirs: theirs_change }]
- end
-
- def classify_json_value_change(base, value)
- return 'unchanged' if base == :__absent__ && value == :__absent__
- return 'added' if base == :__absent__
- return 'deleted' if value == :__absent__
- return 'unchanged' if base == value
-
- 'edited'
- end
-
- def merge_json_entry(base, ours, theirs, path, conflicts)
- base_absent = base == :__absent__
- ours_absent = ours == :__absent__
- theirs_absent = theirs == :__absent__
- return [nil, false] if base_absent && ours_absent && theirs_absent
- return [theirs, true] if base_absent && ours_absent
- return [ours, true] if base_absent && theirs_absent
- return [ours, true] if base_absent && ours == theirs
-
- if base_absent
- add_conflict(conflicts, 'add_add', path, 'same path added differently in ours and theirs')
- return [ours, true]
- end
- return [nil, false] if ours_absent && theirs_absent
- return [nil, false] if ours_absent && base == theirs
- return [nil, false] if theirs_absent && base == ours
-
- if ours_absent
- add_conflict(conflicts, 'delete_edit', path, 'ours deleted a value that theirs edited')
- return [theirs, true]
- end
- if theirs_absent
- add_conflict(conflicts, 'delete_edit', path, 'theirs deleted a value that ours edited')
- return [ours, true]
- end
-
- [merge_json_value(base, ours, theirs, path, conflicts), true]
- end
-
- def add_conflict(conflicts, category, path, message)
- conflicts << {
- conflict_id: "conflict-#{conflicts.length + 1}",
- category: category,
- path: path.empty? ? '/' : path,
- message: message
- }
- end
-
def comment_conflict(category, path, message)
{
conflict_id: 'comment-conflict-1',
@@ -416,11 +403,6 @@ def comment_conflict(category, path, message)
}
end
- def json_pointer_join(parent, token)
- escaped = token.to_s.gsub('~', '~0').gsub('/', '~1')
- parent.empty? ? "/#{escaped}" : "#{parent}/#{escaped}"
- end
-
def normalize_language(request)
language = request[:language].to_s.strip.downcase
return 'json' if language == 'json'
diff --git a/gems/ast-merge-git/spec/fixtures_integration_spec.rb b/gems/ast-merge-git/spec/fixtures_integration_spec.rb
index 523101801..8d48358a6 100644
--- a/gems/ast-merge-git/spec/fixtures_integration_spec.rb
+++ b/gems/ast-merge-git/spec/fixtures_integration_spec.rb
@@ -22,40 +22,30 @@ def read_json(path)
expect(result.fetch(:ok)).to eq(expected.fetch(:ok)), test_case.fetch(:case_id)
expect(result.fetch(:conflicts).length).to eq(expected.fetch(:conflict_count)), test_case.fetch(:case_id)
- if expected.key?(:change_classifications)
- expect(result.fetch(:change_classifications)).to eq(expected.fetch(:change_classifications))
- end
- expect(result.fetch(:reparse_after_render)).to eq(expected.fetch(:reparse_after_render))
- expect(result.fetch(:render_report)).to eq(expected.fetch(:render_report)) if expected.key?(:render_report)
- if expected.key?(:formatting_preservation)
- expect(result.fetch(:formatting_preservation)).to eq(expected.fetch(:formatting_preservation))
+ expect(result.fetch(:diagnostics).map { |diagnostic| diagnostic.fetch(:category) }).to eq(
+ expected.fetch(:diagnostic_categories)
+ ), test_case.fetch(:case_id)
+ expect(result.fetch(:change_classifications)).to eq(expected.fetch(:change_classifications)),
+ test_case.fetch(:case_id)
+ expect(result.fetch(:reparse_after_render)).to eq(expected.fetch(:reparse_after_render)),
+ test_case.fetch(:case_id)
+ expect(result.fetch(:render_report).fetch(:strategy)).to eq(expected.dig(:render_report, :strategy)),
+ test_case.fetch(:case_id)
+ if expected[:merged_json]
+ expect(JSON.parse(result.fetch(:merged_source), symbolize_names: true)).to eq(expected.fetch(:merged_json)),
+ test_case.fetch(:case_id)
end
- if expected.key?(:secondary_formatting_metrics)
- expect(result.fetch(:secondary_formatting_metrics)).to eq(expected.fetch(:secondary_formatting_metrics))
+ expected.fetch(:conflict_categories, []).each_with_index do |category, index|
+ expect(result.dig(:conflicts, index, :category)).to eq(category), test_case.fetch(:case_id)
end
- if expected.key?(:default_driver_evaluation)
- expect(result.fetch(:default_driver_evaluation)).to eq(expected.fetch(:default_driver_evaluation))
+ expected.fetch(:conflict_paths, []).each_with_index do |path, index|
+ expect(result.dig(:conflicts, index, :path)).to eq(path), test_case.fetch(:case_id)
end
- if expected.key?(:owned_regions)
- expect(result.fetch(:owned_regions).length).to eq(expected.fetch(:owned_regions).length),
- test_case.fetch(:case_id)
- expected.fetch(:owned_regions).each_with_index do |expected_region, index|
- expect(result.fetch(:owned_regions)[index]).to include(expected_region), test_case.fetch(:case_id)
- end
+ expected.fetch(:conflicted_source_contains, []).each do |needle|
+ expect(result.fetch(:conflicted_source)).to include(needle), test_case.fetch(:case_id)
end
- if result.fetch(:ok)
- expect(JSON.parse(result.fetch(:merged_source))).to eq(JSON.parse(JSON.generate(expected.fetch(:merged_json))))
- else
- expect(result.fetch(:conflicts).map do |conflict|
- conflict.fetch(:category)
- end).to eq(expected.fetch(:conflict_categories))
- expect(result.fetch(:conflicts).map { |conflict| conflict.fetch(:path) }).to eq(expected.fetch(:conflict_paths))
- expected.fetch(:conflicted_source_contains, []).each do |needle|
- expect(result.fetch(:conflicted_source)).to include(needle), test_case.fetch(:case_id)
- end
- expected.fetch(:conflicted_source_not_contains, []).each do |needle|
- expect(result.fetch(:conflicted_source)).not_to include(needle), test_case.fetch(:case_id)
- end
+ expected.fetch(:conflicted_source_not_contains, []).each do |needle|
+ expect(result.fetch(:conflicted_source)).not_to include(needle), test_case.fetch(:case_id)
end
end
end
diff --git a/gems/ast-merge/.gitattributes b/gems/ast-merge/.gitattributes
index 0ac65aaa7..35a3c7359 100644
--- a/gems/ast-merge/.gitattributes
+++ b/gems/ast-merge/.gitattributes
@@ -1,5 +1,5 @@
# <> do not edit below this line
-*.rb diff=smorg-ruby
+*.rb diff=smorg-rb
*.go diff=smorg-go
*.rs diff=smorg-rs
# <>
diff --git a/gems/ast-merge/.kettle-drift.lock b/gems/ast-merge/.kettle-drift.lock
index 8ee6a7081..06ea1c460 100644
--- a/gems/ast-merge/.kettle-drift.lock
+++ b/gems/ast-merge/.kettle-drift.lock
@@ -4,7 +4,13 @@
"file": "Gemfile",
"lines": [
79,
- 119
+ 119,
+ 159,
+ 199,
+ 239,
+ 279,
+ 319,
+ 359
]
}
],
@@ -13,7 +19,13 @@
"file": "Gemfile",
"lines": [
90,
- 130
+ 130,
+ 170,
+ 210,
+ 250,
+ 290,
+ 330,
+ 370
]
}
],
@@ -22,7 +34,13 @@
"file": "Gemfile",
"lines": [
80,
- 120
+ 120,
+ 160,
+ 200,
+ 240,
+ 280,
+ 320,
+ 360
]
}
],
@@ -31,7 +49,13 @@
"file": "Gemfile",
"lines": [
92,
- 132
+ 132,
+ 172,
+ 212,
+ 252,
+ 292,
+ 332,
+ 372
]
}
],
@@ -40,7 +64,13 @@
"file": "Gemfile",
"lines": [
95,
- 135
+ 135,
+ 175,
+ 215,
+ 255,
+ 295,
+ 335,
+ 375
]
}
],
@@ -49,7 +79,13 @@
"file": "Gemfile",
"lines": [
81,
- 121
+ 121,
+ 161,
+ 201,
+ 241,
+ 281,
+ 321,
+ 361
]
}
],
@@ -59,7 +95,13 @@
"lines": [
59,
99,
- 139
+ 139,
+ 179,
+ 219,
+ 259,
+ 299,
+ 339,
+ 379
]
}
],
@@ -68,7 +110,13 @@
"file": "Gemfile",
"lines": [
100,
- 140
+ 140,
+ 180,
+ 220,
+ 260,
+ 300,
+ 340,
+ 380
]
}
],
@@ -78,7 +126,13 @@
"lines": [
42,
86,
- 126
+ 126,
+ 166,
+ 206,
+ 246,
+ 286,
+ 326,
+ 366
]
}
],
@@ -87,7 +141,13 @@
"file": "Gemfile",
"lines": [
109,
- 149
+ 149,
+ 189,
+ 229,
+ 269,
+ 309,
+ 349,
+ 389
]
}
],
@@ -97,7 +157,13 @@
"lines": [
34,
78,
- 118
+ 118,
+ 158,
+ 198,
+ 238,
+ 278,
+ 318,
+ 358
]
}
],
@@ -107,7 +173,13 @@
"lines": [
68,
108,
- 148
+ 148,
+ 188,
+ 228,
+ 268,
+ 308,
+ 348,
+ 388
]
}
],
@@ -116,7 +188,13 @@
"file": "Gemfile",
"lines": [
84,
- 124
+ 124,
+ 164,
+ 204,
+ 244,
+ 284,
+ 324,
+ 364
]
}
],
@@ -126,7 +204,13 @@
"lines": [
47,
91,
- 131
+ 131,
+ 171,
+ 211,
+ 251,
+ 291,
+ 331,
+ 371
]
}
],
@@ -136,7 +220,13 @@
"lines": [
43,
87,
- 127
+ 127,
+ 167,
+ 207,
+ 247,
+ 287,
+ 327,
+ 367
]
}
],
@@ -145,7 +235,13 @@
"file": "Gemfile",
"lines": [
85,
- 125
+ 125,
+ 165,
+ 205,
+ 245,
+ 285,
+ 325,
+ 365
]
}
],
@@ -154,7 +250,13 @@
"file": "Gemfile",
"lines": [
102,
- 142
+ 142,
+ 182,
+ 222,
+ 262,
+ 302,
+ 342,
+ 382
]
}
],
@@ -163,7 +265,13 @@
"file": "Gemfile",
"lines": [
101,
- 141
+ 141,
+ 181,
+ 221,
+ 261,
+ 301,
+ 341,
+ 381
]
}
],
@@ -172,7 +280,13 @@
"file": "Gemfile",
"lines": [
96,
- 136
+ 136,
+ 176,
+ 216,
+ 256,
+ 296,
+ 336,
+ 376
]
}
],
@@ -181,7 +295,13 @@
"file": "Gemfile",
"lines": [
105,
- 145
+ 145,
+ 185,
+ 225,
+ 265,
+ 305,
+ 345,
+ 385
]
}
],
diff --git a/gems/ast-merge/.rubocop_gradual.lock b/gems/ast-merge/.rubocop_gradual.lock
index ca390a589..bc6712ed3 100644
--- a/gems/ast-merge/.rubocop_gradual.lock
+++ b/gems/ast-merge/.rubocop_gradual.lock
@@ -792,18 +792,18 @@
[5, 5, 33, "Style/Documentation: Missing top-level documentation comment for `module Ast::Merge::EmitterLineMetadataSupport`.", 2926748997],
[23, 7, 541, "Metrics/MethodLength: Method has too many lines. [12/10]", 2407359355]
],
- "lib/ast/merge/file_aligner_base.rb:4032045257": [
- [13, 5, 7473, "Metrics/ClassLength: Class has too many lines. [187/100]", 1391880441],
- [27, 7, 2244, "Metrics/AbcSize: Assignment Branch Condition size for `align` is too high. [<19, 37, 12> 43.29/17]", 1243937217],
- [27, 7, 2244, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `align` is too high. [12/7]", 1243937217],
- [27, 7, 2244, "Metrics/MethodLength: Method has too many lines. [55/10]", 1243937217],
- [27, 7, 2244, "Metrics/PerceivedComplexity: Perceived complexity for `align` is too high. [12/8]", 1243937217],
- [148, 7, 655, "Metrics/MethodLength: Method has too many lines. [14/10]", 2468821688],
- [180, 7, 455, "Metrics/MethodLength: Method has too many lines. [13/10]", 2361153066],
- [199, 7, 1557, "Metrics/AbcSize: Assignment Branch Condition size for `apply_match_refiner!` is too high. [<10, 28, 12> 32.06/17]", 2386945712],
- [199, 7, 1557, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `apply_match_refiner!` is too high. [13/7]", 2386945712],
- [199, 7, 1557, "Metrics/MethodLength: Method has too many lines. [31/10]", 2386945712],
- [199, 7, 1557, "Metrics/PerceivedComplexity: Perceived complexity for `apply_match_refiner!` is too high. [13/8]", 2386945712]
+ "lib/ast/merge/file_aligner_base.rb:2160333224": [
+ [13, 5, 8206, "Metrics/ClassLength: Class has too many lines. [203/100]", 2982381587],
+ [27, 7, 2329, "Metrics/AbcSize: Assignment Branch Condition size for `align` is too high. [<19, 39, 14> 45.59/17]", 1243937217],
+ [27, 7, 2329, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `align` is too high. [14/7]", 1243937217],
+ [27, 7, 2329, "Metrics/MethodLength: Method has too many lines. [56/10]", 1243937217],
+ [27, 7, 2329, "Metrics/PerceivedComplexity: Perceived complexity for `align` is too high. [14/8]", 1243937217],
+ [167, 7, 655, "Metrics/MethodLength: Method has too many lines. [14/10]", 2468821688],
+ [199, 7, 455, "Metrics/MethodLength: Method has too many lines. [13/10]", 2361153066],
+ [218, 7, 1557, "Metrics/AbcSize: Assignment Branch Condition size for `apply_match_refiner!` is too high. [<10, 28, 12> 32.06/17]", 2386945712],
+ [218, 7, 1557, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `apply_match_refiner!` is too high. [13/7]", 2386945712],
+ [218, 7, 1557, "Metrics/MethodLength: Method has too many lines. [31/10]", 2386945712],
+ [218, 7, 1557, "Metrics/PerceivedComplexity: Perceived complexity for `apply_match_refiner!` is too high. [13/8]", 2386945712]
],
"lib/ast/merge/file_analyzable.rb:607555963": [
[36, 5, 31229, "Metrics/ModuleLength: Module has too many lines. [316/100]", 1247752256],
@@ -1039,6 +1039,13 @@
[69, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 4226982364],
[70, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 1440420861]
],
+ "lib/ast/merge/rspec/conformance_fixtures.rb:1295759615": [
+ [6, 7, 26, "Style/Documentation: Missing top-level documentation comment for `module Ast::Merge::RSpec::ConformanceFixtures`.", 90066768],
+ [9, 9, 1432, "Metrics/AbcSize: Assignment Branch Condition size for `normalize_conformance_fixture_support` is too high. [<10, 30, 33> 45.71/17]", 518714108],
+ [9, 9, 1432, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `normalize_conformance_fixture_support` is too high. [33/7]", 518714108],
+ [9, 9, 1432, "Metrics/MethodLength: Method has too many lines. [25/10]", 518714108],
+ [9, 9, 1432, "Metrics/PerceivedComplexity: Perceived complexity for `normalize_conformance_fixture_support` is too high. [31/8]", 518714108]
+ ],
"lib/ast/merge/rspec/dependency_tags_config.rb:3604516304": [
[30, 1, 2102, "Metrics/BlockLength: Block has too many lines. [26/25]", 113766065]
],
@@ -1540,11 +1547,12 @@
[58, 3, 1230, "Metrics/BlockLength: Block has too many lines. [34/25]", 990452676],
[103, 3, 2668, "Metrics/BlockLength: Block has too many lines. [51/25]", 1755027956]
],
- "spec/ast/merge/file_aligner_base_spec.rb:610089304": [
- [5, 1, 7287, "Metrics/BlockLength: Block has too many lines. [164/25]", 597898988],
- [6, 3, 1237, "Metrics/BlockLength: Block has too many lines. [37/25]", 1284505259],
- [86, 3, 5087, "Metrics/BlockLength: Block has too many lines. [84/25]", 119873771],
- [94, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 3749416415]
+ "spec/ast/merge/file_aligner_base_spec.rb:91275387": [
+ [5, 1, 9948, "Metrics/BlockLength: Block has too many lines. [217/25]", 3354563411],
+ [6, 3, 1490, "Metrics/BlockLength: Block has too many lines. [45/25]", 563330990],
+ [95, 3, 7495, "Metrics/BlockLength: Block has too many lines. [129/25]", 598770279],
+ [103, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 3749416415],
+ [163, 5, 1489, "Metrics/BlockLength: Block has too many lines. [26/25]", 2910876949]
],
"spec/ast/merge/file_analyzable_spec.rb:3816965829": [
[3, 1, 12458, "Metrics/BlockLength: Block has too many lines. [272/25]", 216138965],
@@ -1950,6 +1958,10 @@
"spec/ast/merge/unresolved_review_state_spec.rb:3186871217": [
[3, 1, 1038, "Metrics/BlockLength: Block has too many lines. [31/25]", 1325553035]
],
+ "spec/ast/merge_rspec_conformance_fixtures_spec.rb:251774004": [
+ [5, 1, 2119, "Metrics/BlockLength: Block has too many lines. [55/25]", 1724925683],
+ [6, 3, 1203, "Metrics/BlockLength: Block has too many lines. [29/25]", 3306863581]
+ ],
"spec/ast/merge_spec.rb:664670069": [
[3, 1, 3113, "Metrics/BlockLength: Block has too many lines. [74/25]", 4034649501],
[9, 3, 2227, "Metrics/BlockLength: Block has too many lines. [51/25]", 578300230],
diff --git a/gems/ast-merge/Gemfile b/gems/ast-merge/Gemfile
index 4289cdf5c..c4d51f141 100644
--- a/gems/ast-merge/Gemfile
+++ b/gems/ast-merge/Gemfile
@@ -151,7 +151,247 @@ if direct_sibling_gems.any? &&
end
end
-# Use the StructuredMerge TLSP branch until upstream ships Ruby 4-compatible gem metadata.
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+# Use the StructuredMerge TSLP branch until upstream ships Ruby 4-compatible gem metadata.
tslp_dev = ENV.fetch('TSLP_DEV', nil)
tslp_declared_by_templating =
ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? && !tslp_dev.to_s.empty?
@@ -160,7 +400,7 @@ unless tslp_declared_by_templating
gem(
'tree_sitter_language_pack',
git: 'https://github.com/structuredmerge/tree-sitter-language-pack.git',
- branch: 'fix/ruby-4-installs',
+ branch: 'fix/ruby-parser-api-methods',
glob: 'packages/ruby/*.gemspec'
)
else
@@ -168,7 +408,7 @@ unless tslp_declared_by_templating
end
end
-# Templating (env-switched: SMORG_RB_DEV=/path/to/structuredmerge/ruby/gems for local paths)
+# Templating (env-switched: STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local paths)
eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?
# Debugging
diff --git a/gems/ast-merge/Gemfile.lock b/gems/ast-merge/Gemfile.lock
index 822e1aad1..ad09d9372 100644
--- a/gems/ast-merge/Gemfile.lock
+++ b/gems/ast-merge/Gemfile.lock
@@ -1,13 +1,3 @@
-GIT
- remote: https://github.com/structuredmerge/tree-sitter-language-pack.git
- revision: dcc959b12d02d6e379abf1c8ac536a852d1b8416
- branch: fix/ruby-4-installs
- glob: packages/ruby/*.gemspec
- specs:
- tree_sitter_language_pack (1.12.5)
- rb_sys (>= 0.9, < 0.9.128)
- sorbet-runtime (~> 0.5)
-
PATH
remote: .
specs:
@@ -17,13 +7,278 @@ PATH
tree_haver (= 7.1.0)
version_gem (~> 1.1, >= 1.1.9)
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-markdown-markly
+ specs:
+ ast-crispr-markdown-markly (7.1.0)
+ ast-crispr (= 7.1.0)
+ markly-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-ruby-prism
+ specs:
+ ast-crispr-ruby-prism (7.1.0)
+ ast-crispr (= 7.1.0)
+ prism-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr
+ specs:
+ ast-crispr (7.1.0)
+ ast-merge (= 7.1.0)
+ service_actor (~> 3.9)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge-git
+ specs:
+ ast-merge-git (7.1.0)
+ ast-merge (= 7.1.0)
+ json-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-template
+ specs:
+ ast-template (7.1.0)
+ ast-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/bash-merge
+ specs:
+ bash-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.14)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/binary-merge
+ specs:
+ binary-merge (7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/citrus-toml-merge
+ specs:
+ citrus-toml-merge (7.1.0)
+ toml-merge (= 7.1.0)
+ toml-rb (~> 4.1)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/commonmarker-merge
+ specs:
+ commonmarker-merge (7.1.0)
+ commonmarker (~> 2.2)
+ markdown-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/dotenv-merge
+ specs:
+ dotenv-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.14)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/go-merge
+ specs:
+ go-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/json-merge
+ specs:
+ json-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/kettle-jem
+ specs:
+ kettle-jem (7.1.0)
+ addressable (>= 2.8, < 3)
+ ast-crispr-markdown-markly (= 7.1.0)
+ ast-crispr-ruby-prism (= 7.1.0)
+ ast-merge (= 7.1.0)
+ bash-merge (= 7.1.0)
+ citrus-toml-merge (= 7.1.0)
+ commonmarker-merge (= 7.1.0)
+ dotenv-merge (= 7.1.0)
+ json-merge (= 7.1.0)
+ kettle-dev (~> 2.3, >= 2.3.5)
+ kettle-rb (~> 0.1, >= 0.1.4)
+ kramdown-merge (= 7.1.0)
+ markdown-merge (= 7.1.0)
+ markly-merge (= 7.1.0)
+ prism-merge (= 7.1.0)
+ psych-merge (= 7.1.0)
+ rbs (>= 3.10)
+ rbs-merge (= 7.1.0)
+ ruby-merge (= 7.1.0)
+ token-resolver (~> 2.0, >= 2.0.4)
+ toml-merge (= 7.1.0)
+ toml-rb (~> 4.2)
+ tree_haver (= 7.1.0)
+ yaml-merge (= 7.1.0)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/kramdown-merge
+ specs:
+ kramdown-merge (7.1.0)
+ kramdown (~> 2.5)
+ markdown-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/markdown-merge
+ specs:
+ markdown-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/markly-merge
+ specs:
+ markly-merge (7.1.0)
+ markdown-merge (= 7.1.0)
+ markly (~> 0.9)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/parslet-toml-merge
+ specs:
+ parslet-toml-merge (7.1.0)
+ toml (~> 0.3)
+ toml-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/plain-merge
+ specs:
+ plain-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/prism-merge
+ specs:
+ prism-merge (7.1.0)
+ prism (~> 1.6)
+ ruby-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/psych-merge
+ specs:
+ psych-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+ yaml-merge (= 7.1.0)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/rbs-merge
+ specs:
+ rbs-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ rbs (>= 3.10)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.14)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ruby-merge
+ specs:
+ ruby-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/rust-merge
+ specs:
+ rust-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/smorg-rb
+ specs:
+ smorg-rb (7.1.0)
+ ast-merge (= 7.1.0)
+ ast-merge-git (= 7.1.0)
+ go-merge (= 7.1.0)
+ json-merge (= 7.1.0)
+ kettle-jem (= 7.1.0)
+ markly-merge (= 7.1.0)
+ plain-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/toml-merge
+ specs:
+ toml-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/tree_haver
+ specs:
+ tree_haver (7.1.0)
+ citrus (~> 3.0)
+ parslet (~> 2.0)
+ tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/typescript-merge
+ specs:
+ typescript-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/yaml-merge
+ specs:
+ yaml-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/zip-merge
+ specs:
+ zip-merge (7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /var/home/pboling/src/my/structuredmerge/vendor/tree-sitter-language-pack/packages/ruby
+ specs:
+ tree_sitter_language_pack (1.12.5)
+ rb_sys (>= 0.9, < 0.9.128)
+ sorbet-runtime (~> 0.5)
+
GEM
remote: https://gem.coop/
specs:
addressable (2.9.0)
public_suffix (>= 2.0.2, < 8.0)
ansi (1.6.0)
- appraisal2 (3.1.4)
+ appraisal2 (3.2.0)
bundler (>= 1.17.3)
rake (>= 10)
thor (>= 0.14)
@@ -36,6 +291,12 @@ GEM
thor (~> 1.0)
citrus (3.0.2)
cmdparse (3.0.7)
+ commonmarker (2.9.0-aarch64-linux)
+ commonmarker (2.9.0-aarch64-linux-musl)
+ commonmarker (2.9.0-arm64-darwin)
+ commonmarker (2.9.0-x86_64-darwin)
+ commonmarker (2.9.0-x86_64-linux)
+ commonmarker (2.9.0-x86_64-linux-musl)
concurrent-ruby (1.3.7)
date (3.5.1)
debug (1.11.1)
@@ -94,11 +355,13 @@ GEM
rdoc (>= 4.0.0)
reline (>= 0.4.2)
json (2.21.1)
- kettle-dev (2.3.6)
+ kettle-dev (2.3.7)
emoji_regex (>= 15.0)
kettle-rb (~> 0.1, >= 0.1.2)
kettle-test (~> 2.0, >= 2.0.4)
ruby-progressbar (~> 1.13)
+ kettle-drift (1.0.5)
+ version_gem (~> 1.1, >= 1.1.13)
kettle-rb (0.1.4)
kettle-soup-cover (1.1.3)
simplecov (~> 0.22)
@@ -127,6 +390,7 @@ GEM
language_server-protocol (3.17.0.6)
lint_roller (1.1.0)
logger (1.7.0)
+ markly (0.16.0)
mutex_m (0.3.0)
nokogiri (1.19.4-aarch64-linux-gnu)
racc (~> 1.4)
@@ -266,6 +530,8 @@ GEM
ruby-progressbar (1.13.0)
ruby_engine (2.0.3)
ruby_version (1.0.3)
+ service_actor (3.9.4)
+ zeitwerk (>= 1.0)
silent_stream (1.0.12)
logger (~> 1.2)
version_gem (>= 1.1.8, < 3)
@@ -318,13 +584,13 @@ GEM
token-resolver (2.0.4)
parslet (~> 2.0)
version_gem (~> 1.1, >= 1.1.13)
- tree_haver (7.1.0)
- citrus (~> 3.0)
- parslet (~> 2.0)
- tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0)
- version_gem (~> 1.1, >= 1.1.9)
+ toml (0.3.0)
+ parslet (>= 1.8.0, < 3.0.0)
+ toml-rb (4.2.0)
+ citrus (~> 3.0, > 3.0)
+ racc (~> 1.7)
tsort (0.2.0)
- turbo_tests2 (3.1.14)
+ turbo_tests2 (3.2.0)
parallel_tests (>= 3.3.0, < 6)
rspec (>= 3.10)
version_gem (~> 1.1, >= 1.1.14)
@@ -349,7 +615,7 @@ GEM
yard
yard-relative_markdown_links (0.6.0)
nokogiri (>= 1.14.3, < 2)
- yard-timekeeper (0.2.3)
+ yard-timekeeper (0.2.4)
version_gem (~> 1.1, >= 1.1.13)
yard-yaml (0.2.3)
version_gem (~> 1.1, >= 1.1.13)
@@ -369,23 +635,45 @@ PLATFORMS
DEPENDENCIES
addressable (>= 2.8, < 3)
appraisal2 (~> 3.0, >= 3.0.6)
+ ast-crispr!
+ ast-crispr-markdown-markly!
+ ast-crispr-ruby-prism!
ast-merge!
+ ast-merge-git!
+ ast-template!
+ bash-merge!
benchmark (~> 0.5, >= 0.5.0)
+ binary-merge!
bundler-audit (~> 0.9.3)
+ citrus-toml-merge!
+ commonmarker-merge!
debug (>= 1.1)
+ dotenv-merge!
erb (~> 6.0, >= 6.0.4)
gem_bench (~> 2.0, >= 2.0.5)
gitmoji-regex (~> 2.0, >= 2.0.0)
+ go-merge!
irb (~> 1.17)
+ json-merge!
kettle-dev (~> 2.0, >= 2.2.25)
+ kettle-drift (~> 1.0, >= 1.0.5)
+ kettle-jem!
kettle-soup-cover (~> 1.0, >= 1.1.3)
kettle-test (~> 2.0, >= 2.0.9)
kramdown (~> 2.5, >= 2.5.1)
+ kramdown-merge!
kramdown-parser-gfm (~> 1.1)
+ markdown-merge!
+ markly-merge!
mutex_m (~> 0.2)
nomono (~> 1.0, >= 1.0.8)
+ parslet-toml-merge!
+ plain-merge!
+ prism-merge!
+ psych-merge!
rake (~> 13.0)
rbs (>= 3.0)
+ rbs-merge!
rdoc (~> 6.11)
reek (~> 6.5)
require_bench (~> 1.0, >= 1.0.4)
@@ -394,31 +682,54 @@ DEPENDENCIES
rubocop-packaging (~> 0.6, >= 0.6.0)
rubocop-rspec (~> 3.6)
rubocop-ruby3_2 (~> 3.0.0)
+ ruby-merge!
ruby-progressbar (~> 1.13)
+ rust-merge!
+ smorg-rb!
standard (>= 1.50)
stone_checksums (~> 1.0, >= 1.0.3)
stringio (>= 3.0)
+ toml-merge!
+ tree_haver!
tree_sitter_language_pack!
+ typescript-merge!
yaml-converter (~> 0.1)
+ yaml-merge!
yard (~> 0.9, >= 0.9.44)
yard-fence (~> 0.9, >= 0.9.1)
yard-junk (~> 0.1, >= 0.1.0)
yard-relative_markdown_links (~> 0.6)
yard-timekeeper (~> 0.1)
yard-yaml (~> 0.1, >= 0.1.2)
+ zip-merge!
CHECKSUMS
addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af
ansi (1.6.0) sha256=ac9ea0c0ea8d32fb4e271348e609963ac78882f34b73836c2a02b3622e666658
- appraisal2 (3.1.4) sha256=f88c27e600adf4bd5bf06c0ab0afd1de6ce4361497760ce35e86e782036286f4
+ appraisal2 (3.2.0) sha256=ccd0b767ac4060cd7af6d16747459b6990f49c39c7b4fb1f7d1146b1e97c492f
ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
+ ast-crispr (7.1.0)
+ ast-crispr-markdown-markly (7.1.0)
+ ast-crispr-ruby-prism (7.1.0)
ast-merge (7.1.0)
+ ast-merge-git (7.1.0)
+ ast-template (7.1.0)
backports (3.25.3) sha256=94298d32dc3c40ca15633b54e282780b49e2db0c045f602ea1907e4f63a17235
+ bash-merge (7.1.0)
benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c
bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd
+ binary-merge (7.1.0)
bundler-audit (0.9.3) sha256=81c8766c71e47d0d28a0f98c7eed028539f21a6ea3cd8f685eb6f42333c9b4e9
citrus (3.0.2) sha256=4ec2412fc389ad186735f4baee1460f7900a8e130ffe3f216b30d4f9c684f650
+ citrus-toml-merge (7.1.0)
cmdparse (3.0.7) sha256=f7c5cace10bec6abf853370ae095e4b97a84ed9d847b3fb38f41cc4fbc950739
+ commonmarker (2.9.0-aarch64-linux) sha256=e2b4aadb9a2cfa4e206582641ce3a49465549ac1ed4c289fdd63b78d8f24579c
+ commonmarker (2.9.0-aarch64-linux-musl) sha256=1cf4d2821f2a7e64945f1ed7c4eeced586fdb27ea7fe7337788802cf8f57cfca
+ commonmarker (2.9.0-arm64-darwin) sha256=1748dbfa4f5813b0d2a14bb4bbfa65a4ec293aa1c825016d60029ee0e132b046
+ commonmarker (2.9.0-x86_64-darwin) sha256=0a9914ccfd2f5d2a59c7bd0dda4fe90eb084cf513b477e499008e09ec9d6edd6
+ commonmarker (2.9.0-x86_64-linux) sha256=8cfe92970eef585a19ddf6613224b91cab64d6029834661bda801f877c9c7f43
+ commonmarker (2.9.0-x86_64-linux-musl) sha256=293921398b839f79ceaf55010e061357e34f053822c3b003cd0be6686176335e
+ commonmarker-merge (7.1.0)
concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0
date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0
debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6
@@ -426,6 +737,7 @@ CHECKSUMS
diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962
diffy (3.4.4) sha256=79384ab5ca82d0e115b2771f0961e27c164c456074bd2ec46b637ebf7b6e47e3
docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e
+ dotenv-merge (7.1.0)
dry-configurable (1.4.0) sha256=e35d1b5f3c081753ef361f564919db79000f32cfa6f20ee3a3ba5921b41b73ce
dry-core (1.2.0) sha256=0cc5a7da88df397f153947eeeae42e876e999c1e30900f3c536fb173854e96a1
dry-inflector (1.3.1) sha256=7fb0c2bb04f67638f25c52e7ba39ab435d922a3a5c3cd196120f63accb682dcc
@@ -438,19 +750,27 @@ CHECKSUMS
gem_bench (2.0.5) sha256=0dc0fb44a5a5eb7b2f5c1c68a5b0164d72007132822c012bac3abe976b199ead
geom2d (0.4.1) sha256=ea0998ea90c4f2752e24fe13d85a4f89bee689d151316140ebcc6369bf634ed9
gitmoji-regex (2.0.4) sha256=01410d3217940bd0e7b2299ec805245afe8d0f06a5d6d38f623d63a63c0ac34f
+ go-merge (7.1.0)
hexapdf (1.9.1) sha256=2d1f6a3622e6bc2a70a707d4c3f3fa44f5552ecd9d899f6283abb07398a84884
io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc
irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3
json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583
- kettle-dev (2.3.6) sha256=955b01e8aca46438365332d1b4413f22cb58dabfeab5cba04d71237c53cc70ae
+ json-merge (7.1.0)
+ kettle-dev (2.3.7) sha256=eb370113cd030d03cbe2d33b31c99858951017e5ad21a17e9ed89dc3770028ee
+ kettle-drift (1.0.5) sha256=07094e80140a049164142820bdd327c30fcd855bb00697a0a430600a2b5144a2
+ kettle-jem (7.1.0)
kettle-rb (0.1.4) sha256=9cef7ce4f7021666b7222292f29051e51eaf042e8a5db11f3f4dd72f74243fc1
kettle-soup-cover (1.1.3) sha256=a373827da22a7131d093afd32945e5b7d7a10a01ebfdded8fd2cb8230d69c8ad
kettle-test (2.0.11) sha256=c710c90f7ab79d51f9452f0c09f5f90657e7a893f63583855c164d0b1b107ab2
kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa
+ kramdown-merge (7.1.0)
kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729
language_server-protocol (3.17.0.6) sha256=5ef2c0c138f8267e1bc631d3328347d354f96724b0af22f2c79516120443b7f0
lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87
logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
+ markdown-merge (7.1.0)
+ markly (0.16.0) sha256=6f70d79e385b1efc9e171f74c81628826259039fe6c778e03c3924c71dac5511
+ markly-merge (7.1.0)
mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751
nokogiri (1.19.4-aarch64-linux-gnu) sha256=1269fb644a6de405057a53dd5c762b1209b43ca7424f839454d3dbc677c31a8f
nokogiri (1.19.4-aarch64-linux-musl) sha256=35c65b9ce72b3bb03207bdbe7067915019dc18c1b9b59139684bd6690fdd01af
@@ -465,10 +785,14 @@ CHECKSUMS
parallel_tests (5.7.0) sha256=3f1762c46ca2c223b8af8ef877217f9d76974e191bfa934f2580b58bcf1d005c
parser (3.3.12.0) sha256=21a6d7f755d5a24dfbdc6e6b772e4e879a52e7631a88bc5a3a134606052c9828
parslet (2.0.0) sha256=d45130695d39b43d7e6a91f4d2ec66b388a8d822bae38de9b4de9a5fbde1f606
+ parslet-toml-merge (7.1.0)
+ plain-merge (7.1.0)
pp (0.6.4) sha256=dfcb0fce700c41456265922884f9fe195d7fbb0674a3578e6c0f69588e82b570
prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193
prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85
+ prism-merge (7.1.0)
psych (5.4.0) sha256=14f72d69a611af663d7d70e4a7b67d9eb1f3ae9f8d916b478961d5a0075ba5b7
+ psych-merge (7.1.0)
public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623
racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
@@ -476,6 +800,7 @@ CHECKSUMS
rake-compiler-dock (1.12.0) sha256=f13205c2738f3d2053afcd03491a9e4541b22a59a0bfc53fc8bc883bd8188023
rb_sys (0.9.127) sha256=e9f90df3bb0577472d26d96127d5b5774b98f44de881e7d36aeefd28d6337847
rbs (4.0.3) sha256=5a7bf70e2628549d9a1f44eae447b2cfe55968a9c60cfff52693a4bdcc020e14
+ rbs-merge (7.1.0)
rdoc (6.17.0) sha256=0f50d4e568fc98195f9bb155a9e8dff6c7feabfb515fb22ef6df1d12ad5a02b7
reek (6.5.0) sha256=d26d3a492773b2bbc228888067a21afe33ac07954a17dbd64cdeae42c4c69be1
regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb
@@ -503,9 +828,12 @@ CHECKSUMS
rubocop-rspec (3.10.2) sha256=0b3e2ecc592cd10ecbf0095bb58d1e357905276e069643523cc19eb7495f65e2
rubocop-ruby3_2 (3.0.7) sha256=f53dd6d286fb05186214fc6ec116783e7f837030918e8931c05de773e98f8466
rubocop-thread_safety (0.7.3) sha256=067cdd52fbf5deffc18995437e45b5194236eaff4f71de3375a1f6052e48f431
+ ruby-merge (7.1.0)
ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
ruby_engine (2.0.3) sha256=ca2ae7def8cfcdc2bfb6a186d36d5d59c8b403245dc0256c3802b767fa278aaa
ruby_version (1.0.3) sha256=5930f9950746b7e6c973184398ee364ee7440b170fef7922b9f5cdf317f1ccb5
+ rust-merge (7.1.0)
+ service_actor (3.9.4) sha256=e63b523630b9a7e62959b2a90113b08d2565b5de9c148557b281ef847c9539ce
silent_stream (1.0.12) sha256=377c43aa10033fe90c33b39ea8cd97d79f2d1c4856df598efc56f3091f3ae782
simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5
simplecov-cobertura (3.2.0) sha256=70d702658677fcb20e5aceb6915ccf8bc62ff2ccd38b62b3ad5c9db5c0888740
@@ -514,6 +842,7 @@ CHECKSUMS
simplecov-lcov (0.9.0) sha256=7a77a31e200a595ed4b0249493056efd0c920601f53d2ef135ca34ee796346cd
simplecov-rcov (0.3.7) sha256=372f50bf6df6b6350b7d0c840f2f8bdabe021861a43c26877b747c9ac96139fc
simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428
+ smorg-rb (7.1.0)
sorbet-runtime (0.6.13342) sha256=dbeb9892597f593ed2b29e38018912787f6c4e0c4b736d8af0d6bd3c63bde3c3
standard (1.56.0) sha256=ae2af4d9669589162ac69ed5ef59dcf9f346d4afc81f7e62b84339310dfcb787
standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b
@@ -527,21 +856,27 @@ CHECKSUMS
timecop (0.9.11) sha256=41284dc6e5041f2184f781ace766f942108c842f8d8c1386a26e6343decc7542
timecop-rspec (1.0.3) sha256=005f14841bb606dcaefb060e321b5388e2e59537742bee8b3a9a9a40e598fab9
token-resolver (2.0.4) sha256=33b926958f504525bba3ed511ab66fbcbf8ef30390815e931436b30f27ffcad0
+ toml (0.3.0) sha256=0a91d0f76a9036e84e44f95693b12f58d358c1df3ac8e3b5271f2056ecc6e4b9
+ toml-merge (7.1.0)
+ toml-rb (4.2.0) sha256=10a48c91613e20cf63483a7a776767dfb3cd7d70e9327c0237443da601e13776
tree_haver (7.1.0)
tree_sitter_language_pack (1.12.5)
tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f
- turbo_tests2 (3.1.14) sha256=cc29d5b36bdbba67a83eee09a9546880d0926edfbbe50d99633fc0b5763ee94c
+ turbo_tests2 (3.2.0) sha256=8b35421548399d1923567b177970f42671c65695b93cdd134d78fbcbab85dff0
+ typescript-merge (7.1.0)
unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42
unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f
version_gem (1.1.14) sha256=6b7306c7e9416d06067561981ab3444e2cecb844f26cc325ae3c27b44cf85613
yaml-converter (0.2.3) sha256=d35e69e547610d9e347672cc277fcb7d71dff3c53a942e66f82b1c64022ada72
+ yaml-merge (7.1.0)
yard (0.9.45) sha256=52e211493f7cb8a3ebf7e104a25a1e73937a3103092545d34cb88fafebb3dc51
yard-fence (0.9.6) sha256=3d1dbf4e3df462ac78b8bd2e01cf740a2de20168387c929aca31a0bcee490659
yard-junk (0.1.0) sha256=e85fe2ec1afa47313decd333447b53458cb1ed49b510b70015fdc3041a94bcdd
yard-relative_markdown_links (0.6.0) sha256=3e5ffa85cbad9bac70bee5421774b190fb25d3bdf489323a5b3534f647d1a70e
- yard-timekeeper (0.2.3) sha256=849a3e74a0484b1e0b5209cf86823e418b3091e21f4f143c141d38e1cc262034
+ yard-timekeeper (0.2.4) sha256=62f8d001d737c6e2ac688e7b37386f958dceb0f6aff9c909575e1bec8d20775a
yard-yaml (0.2.3) sha256=fe5fef18819e1cbd05bb8f1b9e1baad6bf70c28125eb75b57bbf6397b0831812
zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12
+ zip-merge (7.1.0)
zlib (3.2.3) sha256=5bd316698b32f31a64ab910a8b6c282442ca1626a81bbd6a1674e8522e319c20
BUNDLED WITH
diff --git a/gems/ast-merge/README.md b/gems/ast-merge/README.md
index b3c8f629b..bf0c8c062 100644
--- a/gems/ast-merge/README.md
+++ b/gems/ast-merge/README.md
@@ -50,13 +50,43 @@ Ast::Merge builds on tree\_haver to provide:
- **Region Detection**: `RegionDetectorBase`, `FencedCodeBlockDetector` for text-based analysis
- **RSpec Shared Examples**: Test helpers for implementing new merge gems
+### Merge Gem Backend Patterns
+
+Every merge gem in this family must enter parsing through `tree_haver`. Do not add direct parser fallbacks in merge gems. If a requested backend or grammar is unavailable, fail closed with an unsupported feature or parse diagnostic instead of switching to another parser outside `tree_haver`.
+
+The current merge gems fit three backend patterns:
+
+- **Provider-only merge gems** register a concrete TreeHaver backend and use that backend exclusively. Use this for gems whose purpose is to expose a specific parser provider, such as `prism-merge`, `psych-merge`, `citrus-toml-merge`, and `parslet-toml-merge`.
+- **Hybrid provider plus TSLP merge gems** register their provider backend, and may also register a TSLP/tree-sitter grammar mapping for the same language when both surfaces are intended and tested. `rbs-merge` is the model for this category.
+- **Substrate mapping merge gems** do not own a parser. They register the format grammar with `TreeHaver::GrammarFinder` and use the normal `TreeHaver.parser_for(:format)` API for analysis and merge behavior. `json-merge`, `toml-merge`, `yaml-merge`, and `ruby-merge` follow this pattern.
+
+Backend fallback inside `tree_haver` is allowed when it is explicit TreeHaver backend selection. Backend fallback outside `tree_haver` is not allowed, because it bypasses owner identity, backend diagnostics, parser capability reporting, and shared merge-stack behavior.
+
### Creating a New Merge Gem
+Pick the merge-gem shape before writing parser code:
+
+- Use a substrate mapping gem when the format can use an existing TreeHaver grammar/backend. Register the grammar, parse through `TreeHaver.parser_for`, and keep merge behavior in the substrate.
+- Use a provider-only gem when the gem exists to expose one concrete parser backend. Register that backend with `TreeHaver.register_language`, then delegate shared language or format behavior back to the substrate gem.
+- Use a hybrid provider gem only when both the native provider and TSLP/tree-sitter path are intentional, tested TreeHaver backends.
+
+Merge gems should not call parser libraries directly during merge analysis. Direct parser calls belong inside TreeHaver backend adapters.
+
```ruby
+require "tree_haver"
require "ast/merge"
module MyFormat
module Merge
+ BACKEND_REFERENCE = TreeHaver::BackendReference.new(
+ id: "kreuzberg-language-pack",
+ family: "tree-sitter"
+ ).freeze
+
+ def self.register_backend!
+ TreeHaver::GrammarFinder.new(:my_format).register!
+ end
+
# Inherit from base classes and pass **options for forward compatibility
class SmartMerger < Ast::Merge::SmartMergerBase
@@ -90,7 +120,9 @@ module MyFormat
@source = source
@freeze_token = freeze_token
@signature_generator = signature_generator
- # Process source...
+ Merge.register_backend!
+ @tree = TreeHaver.parser_for(:my_format).parse(source)
+ # Project TreeHaver nodes into merge ownership records.
end
def compute_node_signature(node)
diff --git a/gems/ast-merge/gemfiles/modular/templating.gemfile b/gems/ast-merge/gemfiles/modular/templating.gemfile
index 0d1c9bcf4..e3c24e6b7 100644
--- a/gems/ast-merge/gemfiles/modular/templating.gemfile
+++ b/gems/ast-merge/gemfiles/modular/templating.gemfile
@@ -1,9 +1,9 @@
# frozen_string_literal: true
-smorg_remote = ENV.fetch('SMORG_RB_DEV', 'false').casecmp('false').zero?
+structuredmerge_remote = ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false').zero?
kettle_remote = ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero?
-if smorg_remote
+if structuredmerge_remote
# Merge recipes and parser dependencies for released installs.
gem 'kettle-jem', '>= 7.0'
end
@@ -13,10 +13,10 @@ if kettle_remote
gem 'kettle-drift', '~> 1.0', '>= 1.0.5', require: false
end
-# Set SMORG_RB_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies.
+# Set STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies.
# When false (default / CI), released kettle-jem brings merge gems and parser dependencies.
# Local path overrides bring the same dependencies from sibling gemspecs.
#
# Set KETTLE_RB_DEV=/path/to/kettle-rb for local development with Kettle plugin gems.
# When false (default / CI), released Kettle plugin gems are used.
-eval_gemfile 'templating_local.gemfile' unless smorg_remote && kettle_remote
+eval_gemfile 'templating_local.gemfile' unless structuredmerge_remote && kettle_remote
diff --git a/gems/ast-merge/gemfiles/modular/templating_local.gemfile b/gems/ast-merge/gemfiles/modular/templating_local.gemfile
index 1cca924a0..bf5147854 100644
--- a/gems/ast-merge/gemfiles/modular/templating_local.gemfile
+++ b/gems/ast-merge/gemfiles/modular/templating_local.gemfile
@@ -1,12 +1,12 @@
# frozen_string_literal: true
# Local path overrides for templating development.
-# Loaded by the associated non-local gemfile when SMORG_RB_DEV or KETTLE_RB_DEV
+# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_RB_DEV
# is not "false".
require 'nomono/bundler' unless defined?(Nomono)
-smorg_rb_local_gems = %w[
+structuredmerge_local_gems = %w[
tree_haver
ast-merge
ast-merge-git
@@ -43,7 +43,7 @@ kettle_rb_local_gems = %w[
kettle-dev kettle-test kettle-soup-cover kettle-drift
]
declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name)
-smorg_rb_local_gems_to_eval = smorg_rb_local_gems - %w[ast-merge] - declared_gems
+structuredmerge_local_gems_to_eval = structuredmerge_local_gems - %w[ast-merge] - declared_gems
kettle_rb_local_gems_to_eval = kettle_rb_local_gems - %w[ast-merge] - declared_gems
tslp_dev = ENV.fetch('TSLP_DEV', nil)
@@ -52,14 +52,14 @@ tslp_dev = ENV.fetch('TSLP_DEV', nil)
platform :mri do
gem 'tree_sitter_language_pack', path: tslp_dev unless tslp_dev.to_s.empty?
- if ENV.fetch('SMORG_RB_DEV', 'false').casecmp('false') != 0
+ if ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false') != 0
eval_nomono_gems(
- gems: smorg_rb_local_gems_to_eval,
- prefix: 'SMORG_RB',
- path_env: 'SMORG_RB_DEV',
+ gems: structuredmerge_local_gems_to_eval,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
vendored_gems_env: 'VENDORED_GEMS',
vendor_gem_dir_env: 'VENDOR_GEM_DIR',
- debug_env: 'SMORG_RB_DEBUG'
+ debug_env: 'STRUCTUREDMERGE_DEBUG'
)
end
diff --git a/gems/ast-merge/lib/ast/merge/file_aligner_base.rb b/gems/ast-merge/lib/ast/merge/file_aligner_base.rb
index 4d5ced880..f77d2f744 100644
--- a/gems/ast-merge/lib/ast/merge/file_aligner_base.rb
+++ b/gems/ast-merge/lib/ast/merge/file_aligner_base.rb
@@ -42,6 +42,7 @@ def align
template_indices.zip(dest_indices).each do |t_idx, d_idx|
next unless t_idx && d_idx
+ next if matched_template.include?(t_idx) || matched_dest.include?(d_idx)
alignment << build_match_entry(
signature: sig,
@@ -128,12 +129,30 @@ def build_signature_map(statements, analysis)
statements.each_with_index do |statement, idx|
signature = signature_for(analysis, idx)
map[signature] << idx if signature
+ content_signature = content_identity_signature(statement)
+ map[content_signature] << idx if content_signature && content_signature != signature
add_signature_aliases(map, statement, idx, analysis)
end
map
end
+ def content_identity_signature(statement)
+ content = statement_value(statement, :normalized_content) || statement_value(statement, 'normalized_content')
+ content = content.to_s
+ return if content.empty?
+
+ [:content_identity, content]
+ end
+
+ def statement_value(statement, key)
+ if statement.respond_to?(key)
+ statement.public_send(key)
+ elsif statement.respond_to?(:[])
+ statement[key]
+ end
+ end
+
def build_match_entry(signature:, template_index:, dest_index:, template_statement:, dest_statement:)
{
:type => :match,
diff --git a/gems/ast-merge/lib/ast/merge/rspec.rb b/gems/ast-merge/lib/ast/merge/rspec.rb
index bc8756c18..de7489ee7 100644
--- a/gems/ast-merge/lib/ast/merge/rspec.rb
+++ b/gems/ast-merge/lib/ast/merge/rspec.rb
@@ -31,5 +31,12 @@
# Load Ast::Merge dependency tags (provides merge gem tags like :markly_merge, :prism_merge, etc.)
require_relative 'rspec/dependency_tags'
+# Load conformance fixture helpers for shared fixture harnesses
+require_relative 'rspec/conformance_fixtures'
+
# Load Ast::Merge shared examples (for testing *-merge implementations)
require_relative 'rspec/shared_examples'
+
+RSpec.configure do |config|
+ config.include Ast::Merge::RSpec::ConformanceFixtures
+end
diff --git a/gems/ast-merge/lib/ast/merge/rspec/README.md b/gems/ast-merge/lib/ast/merge/rspec/README.md
index 48c6a98de..343430da5 100644
--- a/gems/ast-merge/lib/ast/merge/rspec/README.md
+++ b/gems/ast-merge/lib/ast/merge/rspec/README.md
@@ -16,6 +16,7 @@ That loads:
- TreeHaver backend dependency tags
- Ast::Merge merge-gem dependency tags
+- Shared conformance fixture helpers
- Ast::Merge shared examples
### Split loading for `ast-merge` itself or registration-heavy suites
@@ -74,6 +75,27 @@ end
TreeHaver backend tags are loaded alongside these helpers; see the TreeHaver RSpec docs for backend-specific tags.
+## Shared conformance fixtures
+
+`Ast::Merge::RSpec::ConformanceFixtures` is spec-harness support for merge gems that import shared fixtures from the sibling `fixtures` repository.
+
+Use it to document implementation gaps without hiding imported shared fixture cases:
+
+```ruby
+support = support_for_conformance_fixture(
+ "delegated_child_operations",
+ pending_roles: {
+ delegated_child_operations: {
+ reason: "parser-backed child delegation is not implemented yet",
+ },
+ },
+)
+
+apply_conformance_fixture_support!(support)
+```
+
+`pending` support calls RSpec `pending`, so the example fails as fixed once it unexpectedly passes. `unsupported` and `skipped` support call RSpec `skip`.
+
## MergeGemRegistry
`Ast::Merge::RSpec::MergeGemRegistry` tracks loaded and bootstrap-declared `*-merge` gems and exposes availability checks for dependency tags.
diff --git a/gems/ast-merge/lib/ast/merge/rspec/conformance_fixtures.rb b/gems/ast-merge/lib/ast/merge/rspec/conformance_fixtures.rb
new file mode 100644
index 000000000..4fb6da375
--- /dev/null
+++ b/gems/ast-merge/lib/ast/merge/rspec/conformance_fixtures.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+module Ast
+ module Merge
+ module RSpec
+ module ConformanceFixtures
+ module_function
+
+ def normalize_conformance_fixture_support(value = nil, default_status: nil, **keywords)
+ value = keywords unless keywords.empty?
+
+ case value
+ when nil, false
+ nil
+ when true
+ { status: (default_status || 'pending').to_s }
+ when String, Symbol
+ { status: (default_status || value).to_s }
+ when Hash
+ support = value[:support] || value['support'] || value
+ return nil if support == false
+
+ status = support[:status] || support['status'] || support[:state] || support['state']
+ status ||= 'unsupported' if support[:unsupported] || support['unsupported']
+ status ||= 'pending' if support[:pending] || support['pending']
+ status ||= default_status
+ return nil unless %w[pending unsupported skipped].include?(status.to_s)
+
+ metadata = { status: status.to_s }
+ reason = support[:reason] || support['reason'] ||
+ support[:message] || support['message'] ||
+ support[:unsupported_reason] || support['unsupported_reason'] ||
+ support[:pending_reason] || support['pending_reason']
+ metadata[:reason] = reason if reason
+ metadata[:category] = support[:category] || support['category'] if support[:category] || support['category']
+ metadata
+ end
+ end
+
+ def support_for_conformance_fixture(role, pending_roles: nil, unsupported_roles: nil, fixture: nil)
+ role_support(pending_roles, role, default_status: 'pending') ||
+ role_support(unsupported_roles, role, default_status: 'unsupported') ||
+ normalize_conformance_fixture_support(fixture)
+ end
+
+ def apply_conformance_fixture_support!(support)
+ metadata = normalize_conformance_fixture_support(support)
+ return unless metadata
+
+ message = metadata[:reason] || "conformance fixture marked #{metadata[:status]}"
+ metadata[:status] == 'pending' ? pending(message) : skip(message)
+ end
+
+ def role_support(roles, role, default_status:)
+ value =
+ if roles.is_a?(Array)
+ roles.map(&:to_s).include?(role.to_s) || nil
+ elsif roles
+ roles[role.to_sym] || roles[role.to_s]
+ end
+ normalize_conformance_fixture_support(value, default_status: default_status)
+ end
+ private_class_method :role_support
+ end
+ end
+ end
+end
diff --git a/gems/ast-merge/lib/ast/merge/rspec/shared_examples.rb b/gems/ast-merge/lib/ast/merge/rspec/shared_examples.rb
index 13b1ed6e9..e1b4d0aa2 100644
--- a/gems/ast-merge/lib/ast/merge/rspec/shared_examples.rb
+++ b/gems/ast-merge/lib/ast/merge/rspec/shared_examples.rb
@@ -29,6 +29,7 @@
# - "Ast::Merge::UnresolvedReviewStateTransportContract" - validates persisted unresolved review replay and JSON-safe transport
# - "Ast::Merge::UnresolvedRuntimeDebugContract" - validates unresolved review state in debug payloads
# - "Ast::Merge::UnresolvedRuntimeContract" - validates reviewable unresolved runtime payloads
+# - "Ast::Merge::TreeHaverBackendContract" - validates advertised backend refs have concrete TreeHaver parsers
# - "a reproducible merge" - validates merge scenarios with fixtures and idempotency
# - "a reproducible partial merge" - validates partial-merge scenarios with idempotency
@@ -55,3 +56,4 @@
require_relative 'shared_examples/unresolved_review_state_transport_contract'
require_relative 'shared_examples/unresolved_runtime_debug_contract'
require_relative 'shared_examples/unresolved_runtime_contract'
+require_relative 'shared_examples/tree_haver_backend_contract'
diff --git a/gems/ast-merge/lib/ast/merge/rspec/shared_examples/tree_haver_backend_contract.rb b/gems/ast-merge/lib/ast/merge/rspec/shared_examples/tree_haver_backend_contract.rb
new file mode 100644
index 000000000..64ceb5470
--- /dev/null
+++ b/gems/ast-merge/lib/ast/merge/rspec/shared_examples/tree_haver_backend_contract.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'Ast::Merge::TreeHaverBackendContract' do |language:, backend_id:, source:|
+ it "registers #{backend_id} as a concrete TreeHaver backend for #{language}" do
+ backend_ref = TreeHaver::BackendRegistry.fetch(backend_id)
+ registrations = TreeHaver.registered_languages(language)
+
+ expect(backend_ref).not_to be_nil
+ expect(registrations).not_to be_empty
+
+ tree = TreeHaver.with_backend(backend_id) do
+ TreeHaver.parser_for(language).parse(source)
+ end
+
+ expect(tree).to respond_to(:root_node)
+ expect(tree.root_node).not_to be_nil
+ expect(tree.root_node.type.to_s).not_to be_empty
+ end
+end
diff --git a/gems/ast-merge/spec/ast/merge/file_aligner_base_spec.rb b/gems/ast-merge/spec/ast/merge/file_aligner_base_spec.rb
index ad352419f..6e4c83a22 100644
--- a/gems/ast-merge/spec/ast/merge/file_aligner_base_spec.rb
+++ b/gems/ast-merge/spec/ast/merge/file_aligner_base_spec.rb
@@ -14,6 +14,15 @@ def generate_signature(node)
node[:signature]
end
end)
+ stub_const('FixtureAnalysis', Struct.new(:statements) do
+ def signature_at(index)
+ statements.fetch(index).fetch(:primary_signature)
+ end
+
+ def generate_signature(node)
+ node.fetch(:primary_signature)
+ end
+ end)
stub_const('TestAligner', Class.new(described_class) do
attr_reader :logged_alignment
@@ -131,6 +140,57 @@ def add_signature_aliases(map, statement, index, _analysis)
expect(result.count { |entry| entry[:type] == :template_only }).to eq(1)
end
+ it 'does not duplicate matches through content aliases after primary signatures match' do
+ template_statement = { name: :template, normalized_content: 'same' }
+ dest_statement = { name: :dest, normalized_content: 'same' }
+ template_analysis = Analysis.new([template_statement], { 0 => [:primary] })
+ dest_analysis = Analysis.new([dest_statement], { 0 => [:primary] })
+
+ result = BaseAligner.new(template_analysis, dest_analysis).align
+
+ expect(result).to eq([
+ {
+ type: :match,
+ template_index: 0,
+ dest_index: 0,
+ signature: [:primary],
+ template_node: template_statement,
+ dest_node: dest_statement
+ }
+ ])
+ end
+
+ it 'matches identical content when opaque primary signatures differ by source position' do
+ fixture_path = Pathname(__dir__).join(
+ '..',
+ '..',
+ '..',
+ '..',
+ '..',
+ '..',
+ 'fixtures',
+ 'diagnostics',
+ 'slice-904-content-identity-positional-signature',
+ 'content-identity-positional-signature.json'
+ ).expand_path
+ fixture = Ast::Merge.normalize_value(JSON.parse(fixture_path.read))
+ template_analysis = FixtureAnalysis.new(fixture.dig(:matching, :template_nodes))
+ dest_analysis = FixtureAnalysis.new(fixture.dig(:matching, :destination_nodes))
+
+ result = BaseAligner.new(template_analysis, dest_analysis).align
+
+ expect(result.count { |entry| entry[:type] == :match }).to eq(fixture.dig(:expected, :match_count))
+ expect(result.count { |entry| entry[:type] == :template_only }).to eq(
+ fixture.dig(:expected, :template_only_count)
+ )
+ expect(result.count { |entry| entry[:type] == :dest_only }).to eq(fixture.dig(:expected, :dest_only_count))
+ match = result.find { |entry| entry[:type] == :match }
+ expected_signature = fixture.dig(:expected, :first_match_signature)
+ expect(match[:signature]).to eq([expected_signature.first.to_sym, *expected_signature.drop(1)])
+ expect(match[:template_index]).to eq(fixture.dig(:expected, :first_template_index))
+ expect(match[:dest_index]).to eq(fixture.dig(:expected, :first_dest_index))
+ end
+
it 'supports optional fuzzy refinement for otherwise unmatched statements' do
template_statement = { name: :template_table }
dest_statement = { name: :dest_table }
diff --git a/gems/ast-merge/spec/ast/merge/rspec/tree_haver_backend_contract_spec.rb b/gems/ast-merge/spec/ast/merge/rspec/tree_haver_backend_contract_spec.rb
new file mode 100644
index 000000000..f5b651824
--- /dev/null
+++ b/gems/ast-merge/spec/ast/merge/rspec/tree_haver_backend_contract_spec.rb
@@ -0,0 +1,52 @@
+# frozen_string_literal: true
+
+require_relative '../../../spec_helper'
+
+require 'bash/merge'
+require 'commonmarker/merge'
+require 'go/merge'
+require 'json/merge'
+require 'kramdown/merge'
+require 'markly/merge'
+require 'prism/merge'
+require 'psych/merge'
+require 'rbs/merge'
+require 'ruby/merge'
+require 'rust/merge'
+require 'toml/merge'
+require 'typescript/merge'
+require 'yaml/merge'
+
+RSpec.describe 'TreeHaver backend contracts' do
+ cases = [
+ ['bash-merge', Bash::Merge, :available_bash_backends, :bash, "echo hello\n"],
+ ['commonmarker-merge', Commonmarker::Merge, :available_markdown_backends, :markdown, "# Title\n"],
+ ['go-merge', Go::Merge, :available_go_backends, :go, "package main\n"],
+ ['json-merge', Json::Merge, :available_json_backends, :json, "{\"a\":1}\n"],
+ ['kramdown-merge', Kramdown::Merge, :available_markdown_backends, :markdown, "# Title\n"],
+ ['markly-merge', Markly::Merge, :available_markdown_backends, :markdown, "# Title\n"],
+ ['prism-merge', Prism::Merge, :available_ruby_backends, :ruby, "def a; end\n"],
+ ['psych-merge', Psych::Merge, :available_yaml_backends, :yaml, "a: 1\n"],
+ ['rbs-merge', Rbs::Merge, :available_rbs_backends, :rbs, "class A\nend\n"],
+ ['ruby-merge', Ruby::Merge, :available_ruby_backends, :ruby, "def a; end\n"],
+ ['rust-merge', Rust::Merge, :available_rust_backends, :rust, "fn main() {}\n"],
+ ['toml-merge', Toml::Merge, :available_toml_backends, :toml, "a = 1\n"],
+ ['typescript-merge', TypeScript::Merge, :available_type_script_backends, :typescript, "const a = 1;\n"],
+ ['yaml-merge', Yaml::Merge, :available_yaml_backends, :yaml, "a: 1\n"]
+ ]
+
+ cases.each do |gem_name, merge_module, backend_method, language, source|
+ describe gem_name do
+ merge_module.public_send(:register_backend!) if merge_module.respond_to?(:register_backend!)
+
+ merge_module.public_send(backend_method).each do |backend_ref|
+ include_examples(
+ 'Ast::Merge::TreeHaverBackendContract',
+ language: language,
+ backend_id: backend_ref.id,
+ source: source
+ )
+ end
+ end
+ end
+end
diff --git a/gems/ast-merge/spec/ast/merge_rspec_conformance_fixtures_spec.rb b/gems/ast-merge/spec/ast/merge_rspec_conformance_fixtures_spec.rb
new file mode 100644
index 000000000..fcb519025
--- /dev/null
+++ b/gems/ast-merge/spec/ast/merge_rspec_conformance_fixtures_spec.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+require 'ast/merge/rspec/conformance_fixtures'
+
+RSpec.describe Ast::Merge::RSpec::ConformanceFixtures do
+ describe '.normalize_conformance_fixture_support' do
+ it 'normalizes pending fixture metadata' do
+ expect(
+ described_class.normalize_conformance_fixture_support(
+ pending: true,
+ pending_reason: 'backend lacks delegated child operation records'
+ )
+ ).to eq(
+ status: 'pending',
+ reason: 'backend lacks delegated child operation records'
+ )
+ end
+
+ it 'normalizes unsupported fixture metadata' do
+ expect(
+ described_class.normalize_conformance_fixture_support(
+ unsupported: true,
+ unsupported_reason: 'TSLP does not expose this node class yet',
+ category: 'unsupported_parser_capability'
+ )
+ ).to eq(
+ status: 'unsupported',
+ reason: 'TSLP does not expose this node class yet',
+ category: 'unsupported_parser_capability'
+ )
+ end
+
+ it 'returns nil for supported fixtures' do
+ expect(described_class.normalize_conformance_fixture_support(nil)).to be_nil
+ expect(described_class.normalize_conformance_fixture_support(false)).to be_nil
+ expect(described_class.normalize_conformance_fixture_support(support: false)).to be_nil
+ end
+ end
+
+ describe '.support_for_conformance_fixture' do
+ it 'selects role-level pending support before fixture metadata' do
+ support = described_class.support_for_conformance_fixture(
+ 'delegated_child_operations',
+ pending_roles: {
+ delegated_child_operations: {
+ reason: 'parser-backed child delegation is not implemented yet'
+ }
+ },
+ fixture: { unsupported: true }
+ )
+
+ expect(support).to eq(
+ status: 'pending',
+ reason: 'parser-backed child delegation is not implemented yet'
+ )
+ end
+
+ it 'selects role-level unsupported support' do
+ support = described_class.support_for_conformance_fixture(
+ 'discovered_surfaces',
+ unsupported_roles: ['discovered_surfaces']
+ )
+
+ expect(support).to eq(status: 'unsupported')
+ end
+ end
+end
diff --git a/gems/ast-template/.gitattributes b/gems/ast-template/.gitattributes
index 0ac65aaa7..35a3c7359 100644
--- a/gems/ast-template/.gitattributes
+++ b/gems/ast-template/.gitattributes
@@ -1,5 +1,5 @@
# <> do not edit below this line
-*.rb diff=smorg-ruby
+*.rb diff=smorg-rb
*.go diff=smorg-go
*.rs diff=smorg-rs
# <>
diff --git a/gems/ast-template/.kettle-drift.lock b/gems/ast-template/.kettle-drift.lock
index 1dad17e1d..aa01ca527 100644
--- a/gems/ast-template/.kettle-drift.lock
+++ b/gems/ast-template/.kettle-drift.lock
@@ -4,7 +4,13 @@
"file": "Gemfile",
"lines": [
79,
- 119
+ 119,
+ 159,
+ 199,
+ 239,
+ 279,
+ 319,
+ 359
]
}
],
@@ -13,7 +19,13 @@
"file": "Gemfile",
"lines": [
90,
- 130
+ 130,
+ 170,
+ 210,
+ 250,
+ 290,
+ 330,
+ 370
]
}
],
@@ -22,7 +34,13 @@
"file": "Gemfile",
"lines": [
80,
- 120
+ 120,
+ 160,
+ 200,
+ 240,
+ 280,
+ 320,
+ 360
]
}
],
@@ -31,7 +49,13 @@
"file": "Gemfile",
"lines": [
92,
- 132
+ 132,
+ 172,
+ 212,
+ 252,
+ 292,
+ 332,
+ 372
]
}
],
@@ -40,7 +64,13 @@
"file": "Gemfile",
"lines": [
95,
- 135
+ 135,
+ 175,
+ 215,
+ 255,
+ 295,
+ 335,
+ 375
]
}
],
@@ -49,7 +79,13 @@
"file": "Gemfile",
"lines": [
81,
- 121
+ 121,
+ 161,
+ 201,
+ 241,
+ 281,
+ 321,
+ 361
]
}
],
@@ -59,7 +95,13 @@
"lines": [
59,
99,
- 139
+ 139,
+ 179,
+ 219,
+ 259,
+ 299,
+ 339,
+ 379
]
}
],
@@ -68,7 +110,13 @@
"file": "Gemfile",
"lines": [
100,
- 140
+ 140,
+ 180,
+ 220,
+ 260,
+ 300,
+ 340,
+ 380
]
}
],
@@ -78,7 +126,13 @@
"lines": [
42,
86,
- 126
+ 126,
+ 166,
+ 206,
+ 246,
+ 286,
+ 326,
+ 366
]
}
],
@@ -87,7 +141,13 @@
"file": "Gemfile",
"lines": [
109,
- 149
+ 149,
+ 189,
+ 229,
+ 269,
+ 309,
+ 349,
+ 389
]
}
],
@@ -97,7 +157,13 @@
"lines": [
34,
78,
- 118
+ 118,
+ 158,
+ 198,
+ 238,
+ 278,
+ 318,
+ 358
]
}
],
@@ -107,7 +173,13 @@
"lines": [
68,
108,
- 148
+ 148,
+ 188,
+ 228,
+ 268,
+ 308,
+ 348,
+ 388
]
}
],
@@ -116,7 +188,13 @@
"file": "Gemfile",
"lines": [
84,
- 124
+ 124,
+ 164,
+ 204,
+ 244,
+ 284,
+ 324,
+ 364
]
}
],
@@ -126,7 +204,13 @@
"lines": [
47,
91,
- 131
+ 131,
+ 171,
+ 211,
+ 251,
+ 291,
+ 331,
+ 371
]
}
],
@@ -136,7 +220,13 @@
"lines": [
43,
87,
- 127
+ 127,
+ 167,
+ 207,
+ 247,
+ 287,
+ 327,
+ 367
]
}
],
@@ -145,7 +235,13 @@
"file": "Gemfile",
"lines": [
85,
- 125
+ 125,
+ 165,
+ 205,
+ 245,
+ 285,
+ 325,
+ 365
]
}
],
@@ -154,7 +250,13 @@
"file": "Gemfile",
"lines": [
102,
- 142
+ 142,
+ 182,
+ 222,
+ 262,
+ 302,
+ 342,
+ 382
]
}
],
@@ -163,7 +265,13 @@
"file": "Gemfile",
"lines": [
101,
- 141
+ 141,
+ 181,
+ 221,
+ 261,
+ 301,
+ 341,
+ 381
]
}
],
@@ -172,7 +280,13 @@
"file": "Gemfile",
"lines": [
96,
- 136
+ 136,
+ 176,
+ 216,
+ 256,
+ 296,
+ 336,
+ 376
]
}
],
@@ -181,7 +295,13 @@
"file": "Gemfile",
"lines": [
105,
- 145
+ 145,
+ 185,
+ 225,
+ 265,
+ 305,
+ 345,
+ 385
]
}
],
diff --git a/gems/ast-template/Gemfile b/gems/ast-template/Gemfile
index e75f45831..3c92e5d7c 100644
--- a/gems/ast-template/Gemfile
+++ b/gems/ast-template/Gemfile
@@ -151,7 +151,247 @@ if direct_sibling_gems.any? &&
end
end
-# Use the StructuredMerge TLSP branch until upstream ships Ruby 4-compatible gem metadata.
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+# Use the StructuredMerge TSLP branch until upstream ships Ruby 4-compatible gem metadata.
tslp_dev = ENV.fetch('TSLP_DEV', nil)
tslp_declared_by_templating =
ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? && !tslp_dev.to_s.empty?
@@ -160,7 +400,7 @@ unless tslp_declared_by_templating
gem(
'tree_sitter_language_pack',
git: 'https://github.com/structuredmerge/tree-sitter-language-pack.git',
- branch: 'fix/ruby-4-installs',
+ branch: 'fix/ruby-parser-api-methods',
glob: 'packages/ruby/*.gemspec'
)
else
@@ -168,7 +408,7 @@ unless tslp_declared_by_templating
end
end
-# Templating (env-switched: SMORG_RB_DEV=/path/to/structuredmerge/ruby/gems for local paths)
+# Templating (env-switched: STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local paths)
eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?
# Debugging
diff --git a/gems/ast-template/Gemfile.lock b/gems/ast-template/Gemfile.lock
index 40f3e46bb..b17738f92 100644
--- a/gems/ast-template/Gemfile.lock
+++ b/gems/ast-template/Gemfile.lock
@@ -1,13 +1,3 @@
-GIT
- remote: https://github.com/structuredmerge/tree-sitter-language-pack.git
- revision: dcc959b12d02d6e379abf1c8ac536a852d1b8416
- branch: fix/ruby-4-installs
- glob: packages/ruby/*.gemspec
- specs:
- tree_sitter_language_pack (1.12.5)
- rb_sys (>= 0.9, < 0.9.128)
- sorbet-runtime (~> 0.5)
-
PATH
remote: .
specs:
@@ -15,22 +5,284 @@ PATH
ast-merge (= 7.1.0)
version_gem (~> 1.1, >= 1.1.9)
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-markdown-markly
+ specs:
+ ast-crispr-markdown-markly (7.1.0)
+ ast-crispr (= 7.1.0)
+ markly-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-ruby-prism
+ specs:
+ ast-crispr-ruby-prism (7.1.0)
+ ast-crispr (= 7.1.0)
+ prism-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr
+ specs:
+ ast-crispr (7.1.0)
+ ast-merge (= 7.1.0)
+ service_actor (~> 3.9)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge-git
+ specs:
+ ast-merge-git (7.1.0)
+ ast-merge (= 7.1.0)
+ json-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge
+ specs:
+ ast-merge (7.1.0)
+ benchmark
+ token-resolver (~> 2.0, >= 2.0.4)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/bash-merge
+ specs:
+ bash-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.14)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/binary-merge
+ specs:
+ binary-merge (7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/citrus-toml-merge
+ specs:
+ citrus-toml-merge (7.1.0)
+ toml-merge (= 7.1.0)
+ toml-rb (~> 4.1)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/commonmarker-merge
+ specs:
+ commonmarker-merge (7.1.0)
+ commonmarker (~> 2.2)
+ markdown-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/dotenv-merge
+ specs:
+ dotenv-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.14)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/go-merge
+ specs:
+ go-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/json-merge
+ specs:
+ json-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/kettle-jem
+ specs:
+ kettle-jem (7.1.0)
+ addressable (>= 2.8, < 3)
+ ast-crispr-markdown-markly (= 7.1.0)
+ ast-crispr-ruby-prism (= 7.1.0)
+ ast-merge (= 7.1.0)
+ bash-merge (= 7.1.0)
+ citrus-toml-merge (= 7.1.0)
+ commonmarker-merge (= 7.1.0)
+ dotenv-merge (= 7.1.0)
+ json-merge (= 7.1.0)
+ kettle-dev (~> 2.3, >= 2.3.5)
+ kettle-rb (~> 0.1, >= 0.1.4)
+ kramdown-merge (= 7.1.0)
+ markdown-merge (= 7.1.0)
+ markly-merge (= 7.1.0)
+ prism-merge (= 7.1.0)
+ psych-merge (= 7.1.0)
+ rbs (>= 3.10)
+ rbs-merge (= 7.1.0)
+ ruby-merge (= 7.1.0)
+ token-resolver (~> 2.0, >= 2.0.4)
+ toml-merge (= 7.1.0)
+ toml-rb (~> 4.2)
+ tree_haver (= 7.1.0)
+ yaml-merge (= 7.1.0)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/kramdown-merge
+ specs:
+ kramdown-merge (7.1.0)
+ kramdown (~> 2.5)
+ markdown-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/markdown-merge
+ specs:
+ markdown-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/markly-merge
+ specs:
+ markly-merge (7.1.0)
+ markdown-merge (= 7.1.0)
+ markly (~> 0.9)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/parslet-toml-merge
+ specs:
+ parslet-toml-merge (7.1.0)
+ toml (~> 0.3)
+ toml-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/plain-merge
+ specs:
+ plain-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/prism-merge
+ specs:
+ prism-merge (7.1.0)
+ prism (~> 1.6)
+ ruby-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/psych-merge
+ specs:
+ psych-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+ yaml-merge (= 7.1.0)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/rbs-merge
+ specs:
+ rbs-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ rbs (>= 3.10)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.14)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ruby-merge
+ specs:
+ ruby-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/rust-merge
+ specs:
+ rust-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/smorg-rb
+ specs:
+ smorg-rb (7.1.0)
+ ast-merge (= 7.1.0)
+ ast-merge-git (= 7.1.0)
+ go-merge (= 7.1.0)
+ json-merge (= 7.1.0)
+ kettle-jem (= 7.1.0)
+ markly-merge (= 7.1.0)
+ plain-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/toml-merge
+ specs:
+ toml-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/tree_haver
+ specs:
+ tree_haver (7.1.0)
+ citrus (~> 3.0)
+ parslet (~> 2.0)
+ tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/typescript-merge
+ specs:
+ typescript-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/yaml-merge
+ specs:
+ yaml-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/zip-merge
+ specs:
+ zip-merge (7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /var/home/pboling/src/my/structuredmerge/vendor/tree-sitter-language-pack/packages/ruby
+ specs:
+ tree_sitter_language_pack (1.12.5)
+ rb_sys (>= 0.9, < 0.9.128)
+ sorbet-runtime (~> 0.5)
+
GEM
remote: https://gem.coop/
specs:
addressable (2.9.0)
public_suffix (>= 2.0.2, < 8.0)
ansi (1.6.0)
- appraisal2 (3.1.4)
+ appraisal2 (3.2.0)
bundler (>= 1.17.3)
rake (>= 10)
thor (>= 0.14)
ast (2.4.3)
- ast-merge (7.1.0)
- benchmark
- token-resolver (~> 2.0, >= 2.0.4)
- tree_haver (= 7.1.0)
- version_gem (~> 1.1, >= 1.1.9)
backports (3.25.3)
benchmark (0.5.0)
bigdecimal (4.1.2)
@@ -39,6 +291,12 @@ GEM
thor (~> 1.0)
citrus (3.0.2)
cmdparse (3.0.7)
+ commonmarker (2.9.0-aarch64-linux)
+ commonmarker (2.9.0-aarch64-linux-musl)
+ commonmarker (2.9.0-arm64-darwin)
+ commonmarker (2.9.0-x86_64-darwin)
+ commonmarker (2.9.0-x86_64-linux)
+ commonmarker (2.9.0-x86_64-linux-musl)
concurrent-ruby (1.3.7)
date (3.5.1)
debug (1.11.1)
@@ -97,11 +355,13 @@ GEM
rdoc (>= 4.0.0)
reline (>= 0.4.2)
json (2.21.1)
- kettle-dev (2.3.6)
+ kettle-dev (2.3.7)
emoji_regex (>= 15.0)
kettle-rb (~> 0.1, >= 0.1.2)
kettle-test (~> 2.0, >= 2.0.4)
ruby-progressbar (~> 1.13)
+ kettle-drift (1.0.5)
+ version_gem (~> 1.1, >= 1.1.13)
kettle-rb (0.1.4)
kettle-soup-cover (1.1.3)
simplecov (~> 0.22)
@@ -130,6 +390,7 @@ GEM
language_server-protocol (3.17.0.6)
lint_roller (1.1.0)
logger (1.7.0)
+ markly (0.16.0)
mutex_m (0.3.0)
nokogiri (1.19.4-aarch64-linux-gnu)
racc (~> 1.4)
@@ -269,6 +530,8 @@ GEM
ruby-progressbar (1.13.0)
ruby_engine (2.0.3)
ruby_version (1.0.3)
+ service_actor (3.9.4)
+ zeitwerk (>= 1.0)
silent_stream (1.0.12)
logger (~> 1.2)
version_gem (>= 1.1.8, < 3)
@@ -321,13 +584,13 @@ GEM
token-resolver (2.0.4)
parslet (~> 2.0)
version_gem (~> 1.1, >= 1.1.13)
- tree_haver (7.1.0)
- citrus (~> 3.0)
- parslet (~> 2.0)
- tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0)
- version_gem (~> 1.1, >= 1.1.9)
+ toml (0.3.0)
+ parslet (>= 1.8.0, < 3.0.0)
+ toml-rb (4.2.0)
+ citrus (~> 3.0, > 3.0)
+ racc (~> 1.7)
tsort (0.2.0)
- turbo_tests2 (3.1.14)
+ turbo_tests2 (3.2.0)
parallel_tests (>= 3.3.0, < 6)
rspec (>= 3.10)
version_gem (~> 1.1, >= 1.1.14)
@@ -352,7 +615,7 @@ GEM
yard
yard-relative_markdown_links (0.6.0)
nokogiri (>= 1.14.3, < 2)
- yard-timekeeper (0.2.3)
+ yard-timekeeper (0.2.4)
version_gem (~> 1.1, >= 1.1.13)
yard-yaml (0.2.3)
version_gem (~> 1.1, >= 1.1.13)
@@ -372,23 +635,45 @@ PLATFORMS
DEPENDENCIES
addressable (>= 2.8, < 3)
appraisal2 (~> 3.0, >= 3.0.6)
+ ast-crispr!
+ ast-crispr-markdown-markly!
+ ast-crispr-ruby-prism!
+ ast-merge!
+ ast-merge-git!
ast-template!
+ bash-merge!
benchmark (~> 0.5, >= 0.5.0)
+ binary-merge!
bundler-audit (~> 0.9.3)
+ citrus-toml-merge!
+ commonmarker-merge!
debug (>= 1.1)
+ dotenv-merge!
erb (~> 6.0, >= 6.0.4)
gem_bench (~> 2.0, >= 2.0.5)
gitmoji-regex (~> 2.0, >= 2.0.0)
+ go-merge!
irb (~> 1.17)
+ json-merge!
kettle-dev (~> 2.0, >= 2.2.25)
+ kettle-drift (~> 1.0, >= 1.0.5)
+ kettle-jem!
kettle-soup-cover (~> 1.0, >= 1.1.3)
kettle-test (~> 2.0, >= 2.0.9)
kramdown (~> 2.5, >= 2.5.1)
+ kramdown-merge!
kramdown-parser-gfm (~> 1.1)
+ markdown-merge!
+ markly-merge!
mutex_m (~> 0.2)
nomono (~> 1.0, >= 1.0.8)
+ parslet-toml-merge!
+ plain-merge!
+ prism-merge!
+ psych-merge!
rake (~> 13.0)
rbs (>= 3.0)
+ rbs-merge!
rdoc (~> 6.11)
reek (~> 6.5)
require_bench (~> 1.0, >= 1.0.4)
@@ -397,32 +682,54 @@ DEPENDENCIES
rubocop-packaging (~> 0.6, >= 0.6.0)
rubocop-rspec (~> 3.6)
rubocop-ruby3_2 (~> 3.0.0)
+ ruby-merge!
ruby-progressbar (~> 1.13)
+ rust-merge!
+ smorg-rb!
standard (>= 1.50)
stone_checksums (~> 1.0, >= 1.0.3)
stringio (>= 3.0)
+ toml-merge!
+ tree_haver!
tree_sitter_language_pack!
+ typescript-merge!
yaml-converter (~> 0.1)
+ yaml-merge!
yard (~> 0.9, >= 0.9.44)
yard-fence (~> 0.9, >= 0.9.1)
yard-junk (~> 0.1, >= 0.1.0)
yard-relative_markdown_links (~> 0.6)
yard-timekeeper (~> 0.1)
yard-yaml (~> 0.1, >= 0.1.2)
+ zip-merge!
CHECKSUMS
addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af
ansi (1.6.0) sha256=ac9ea0c0ea8d32fb4e271348e609963ac78882f34b73836c2a02b3622e666658
- appraisal2 (3.1.4) sha256=f88c27e600adf4bd5bf06c0ab0afd1de6ce4361497760ce35e86e782036286f4
+ appraisal2 (3.2.0) sha256=ccd0b767ac4060cd7af6d16747459b6990f49c39c7b4fb1f7d1146b1e97c492f
ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
+ ast-crispr (7.1.0)
+ ast-crispr-markdown-markly (7.1.0)
+ ast-crispr-ruby-prism (7.1.0)
ast-merge (7.1.0)
+ ast-merge-git (7.1.0)
ast-template (7.1.0)
backports (3.25.3) sha256=94298d32dc3c40ca15633b54e282780b49e2db0c045f602ea1907e4f63a17235
+ bash-merge (7.1.0)
benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c
bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd
+ binary-merge (7.1.0)
bundler-audit (0.9.3) sha256=81c8766c71e47d0d28a0f98c7eed028539f21a6ea3cd8f685eb6f42333c9b4e9
citrus (3.0.2) sha256=4ec2412fc389ad186735f4baee1460f7900a8e130ffe3f216b30d4f9c684f650
+ citrus-toml-merge (7.1.0)
cmdparse (3.0.7) sha256=f7c5cace10bec6abf853370ae095e4b97a84ed9d847b3fb38f41cc4fbc950739
+ commonmarker (2.9.0-aarch64-linux) sha256=e2b4aadb9a2cfa4e206582641ce3a49465549ac1ed4c289fdd63b78d8f24579c
+ commonmarker (2.9.0-aarch64-linux-musl) sha256=1cf4d2821f2a7e64945f1ed7c4eeced586fdb27ea7fe7337788802cf8f57cfca
+ commonmarker (2.9.0-arm64-darwin) sha256=1748dbfa4f5813b0d2a14bb4bbfa65a4ec293aa1c825016d60029ee0e132b046
+ commonmarker (2.9.0-x86_64-darwin) sha256=0a9914ccfd2f5d2a59c7bd0dda4fe90eb084cf513b477e499008e09ec9d6edd6
+ commonmarker (2.9.0-x86_64-linux) sha256=8cfe92970eef585a19ddf6613224b91cab64d6029834661bda801f877c9c7f43
+ commonmarker (2.9.0-x86_64-linux-musl) sha256=293921398b839f79ceaf55010e061357e34f053822c3b003cd0be6686176335e
+ commonmarker-merge (7.1.0)
concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0
date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0
debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6
@@ -430,6 +737,7 @@ CHECKSUMS
diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962
diffy (3.4.4) sha256=79384ab5ca82d0e115b2771f0961e27c164c456074bd2ec46b637ebf7b6e47e3
docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e
+ dotenv-merge (7.1.0)
dry-configurable (1.4.0) sha256=e35d1b5f3c081753ef361f564919db79000f32cfa6f20ee3a3ba5921b41b73ce
dry-core (1.2.0) sha256=0cc5a7da88df397f153947eeeae42e876e999c1e30900f3c536fb173854e96a1
dry-inflector (1.3.1) sha256=7fb0c2bb04f67638f25c52e7ba39ab435d922a3a5c3cd196120f63accb682dcc
@@ -442,19 +750,27 @@ CHECKSUMS
gem_bench (2.0.5) sha256=0dc0fb44a5a5eb7b2f5c1c68a5b0164d72007132822c012bac3abe976b199ead
geom2d (0.4.1) sha256=ea0998ea90c4f2752e24fe13d85a4f89bee689d151316140ebcc6369bf634ed9
gitmoji-regex (2.0.4) sha256=01410d3217940bd0e7b2299ec805245afe8d0f06a5d6d38f623d63a63c0ac34f
+ go-merge (7.1.0)
hexapdf (1.9.1) sha256=2d1f6a3622e6bc2a70a707d4c3f3fa44f5552ecd9d899f6283abb07398a84884
io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc
irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3
json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583
- kettle-dev (2.3.6) sha256=955b01e8aca46438365332d1b4413f22cb58dabfeab5cba04d71237c53cc70ae
+ json-merge (7.1.0)
+ kettle-dev (2.3.7) sha256=eb370113cd030d03cbe2d33b31c99858951017e5ad21a17e9ed89dc3770028ee
+ kettle-drift (1.0.5) sha256=07094e80140a049164142820bdd327c30fcd855bb00697a0a430600a2b5144a2
+ kettle-jem (7.1.0)
kettle-rb (0.1.4) sha256=9cef7ce4f7021666b7222292f29051e51eaf042e8a5db11f3f4dd72f74243fc1
kettle-soup-cover (1.1.3) sha256=a373827da22a7131d093afd32945e5b7d7a10a01ebfdded8fd2cb8230d69c8ad
kettle-test (2.0.11) sha256=c710c90f7ab79d51f9452f0c09f5f90657e7a893f63583855c164d0b1b107ab2
kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa
+ kramdown-merge (7.1.0)
kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729
language_server-protocol (3.17.0.6) sha256=5ef2c0c138f8267e1bc631d3328347d354f96724b0af22f2c79516120443b7f0
lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87
logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
+ markdown-merge (7.1.0)
+ markly (0.16.0) sha256=6f70d79e385b1efc9e171f74c81628826259039fe6c778e03c3924c71dac5511
+ markly-merge (7.1.0)
mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751
nokogiri (1.19.4-aarch64-linux-gnu) sha256=1269fb644a6de405057a53dd5c762b1209b43ca7424f839454d3dbc677c31a8f
nokogiri (1.19.4-aarch64-linux-musl) sha256=35c65b9ce72b3bb03207bdbe7067915019dc18c1b9b59139684bd6690fdd01af
@@ -469,10 +785,14 @@ CHECKSUMS
parallel_tests (5.7.0) sha256=3f1762c46ca2c223b8af8ef877217f9d76974e191bfa934f2580b58bcf1d005c
parser (3.3.12.0) sha256=21a6d7f755d5a24dfbdc6e6b772e4e879a52e7631a88bc5a3a134606052c9828
parslet (2.0.0) sha256=d45130695d39b43d7e6a91f4d2ec66b388a8d822bae38de9b4de9a5fbde1f606
+ parslet-toml-merge (7.1.0)
+ plain-merge (7.1.0)
pp (0.6.4) sha256=dfcb0fce700c41456265922884f9fe195d7fbb0674a3578e6c0f69588e82b570
prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193
prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85
+ prism-merge (7.1.0)
psych (5.4.0) sha256=14f72d69a611af663d7d70e4a7b67d9eb1f3ae9f8d916b478961d5a0075ba5b7
+ psych-merge (7.1.0)
public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623
racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
@@ -480,6 +800,7 @@ CHECKSUMS
rake-compiler-dock (1.12.0) sha256=f13205c2738f3d2053afcd03491a9e4541b22a59a0bfc53fc8bc883bd8188023
rb_sys (0.9.127) sha256=e9f90df3bb0577472d26d96127d5b5774b98f44de881e7d36aeefd28d6337847
rbs (4.0.3) sha256=5a7bf70e2628549d9a1f44eae447b2cfe55968a9c60cfff52693a4bdcc020e14
+ rbs-merge (7.1.0)
rdoc (6.17.0) sha256=0f50d4e568fc98195f9bb155a9e8dff6c7feabfb515fb22ef6df1d12ad5a02b7
reek (6.5.0) sha256=d26d3a492773b2bbc228888067a21afe33ac07954a17dbd64cdeae42c4c69be1
regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb
@@ -507,9 +828,12 @@ CHECKSUMS
rubocop-rspec (3.10.2) sha256=0b3e2ecc592cd10ecbf0095bb58d1e357905276e069643523cc19eb7495f65e2
rubocop-ruby3_2 (3.0.7) sha256=f53dd6d286fb05186214fc6ec116783e7f837030918e8931c05de773e98f8466
rubocop-thread_safety (0.7.3) sha256=067cdd52fbf5deffc18995437e45b5194236eaff4f71de3375a1f6052e48f431
+ ruby-merge (7.1.0)
ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
ruby_engine (2.0.3) sha256=ca2ae7def8cfcdc2bfb6a186d36d5d59c8b403245dc0256c3802b767fa278aaa
ruby_version (1.0.3) sha256=5930f9950746b7e6c973184398ee364ee7440b170fef7922b9f5cdf317f1ccb5
+ rust-merge (7.1.0)
+ service_actor (3.9.4) sha256=e63b523630b9a7e62959b2a90113b08d2565b5de9c148557b281ef847c9539ce
silent_stream (1.0.12) sha256=377c43aa10033fe90c33b39ea8cd97d79f2d1c4856df598efc56f3091f3ae782
simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5
simplecov-cobertura (3.2.0) sha256=70d702658677fcb20e5aceb6915ccf8bc62ff2ccd38b62b3ad5c9db5c0888740
@@ -518,6 +842,7 @@ CHECKSUMS
simplecov-lcov (0.9.0) sha256=7a77a31e200a595ed4b0249493056efd0c920601f53d2ef135ca34ee796346cd
simplecov-rcov (0.3.7) sha256=372f50bf6df6b6350b7d0c840f2f8bdabe021861a43c26877b747c9ac96139fc
simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428
+ smorg-rb (7.1.0)
sorbet-runtime (0.6.13342) sha256=dbeb9892597f593ed2b29e38018912787f6c4e0c4b736d8af0d6bd3c63bde3c3
standard (1.56.0) sha256=ae2af4d9669589162ac69ed5ef59dcf9f346d4afc81f7e62b84339310dfcb787
standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b
@@ -531,21 +856,27 @@ CHECKSUMS
timecop (0.9.11) sha256=41284dc6e5041f2184f781ace766f942108c842f8d8c1386a26e6343decc7542
timecop-rspec (1.0.3) sha256=005f14841bb606dcaefb060e321b5388e2e59537742bee8b3a9a9a40e598fab9
token-resolver (2.0.4) sha256=33b926958f504525bba3ed511ab66fbcbf8ef30390815e931436b30f27ffcad0
+ toml (0.3.0) sha256=0a91d0f76a9036e84e44f95693b12f58d358c1df3ac8e3b5271f2056ecc6e4b9
+ toml-merge (7.1.0)
+ toml-rb (4.2.0) sha256=10a48c91613e20cf63483a7a776767dfb3cd7d70e9327c0237443da601e13776
tree_haver (7.1.0)
tree_sitter_language_pack (1.12.5)
tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f
- turbo_tests2 (3.1.14) sha256=cc29d5b36bdbba67a83eee09a9546880d0926edfbbe50d99633fc0b5763ee94c
+ turbo_tests2 (3.2.0) sha256=8b35421548399d1923567b177970f42671c65695b93cdd134d78fbcbab85dff0
+ typescript-merge (7.1.0)
unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42
unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f
version_gem (1.1.14) sha256=6b7306c7e9416d06067561981ab3444e2cecb844f26cc325ae3c27b44cf85613
yaml-converter (0.2.3) sha256=d35e69e547610d9e347672cc277fcb7d71dff3c53a942e66f82b1c64022ada72
+ yaml-merge (7.1.0)
yard (0.9.45) sha256=52e211493f7cb8a3ebf7e104a25a1e73937a3103092545d34cb88fafebb3dc51
yard-fence (0.9.6) sha256=3d1dbf4e3df462ac78b8bd2e01cf740a2de20168387c929aca31a0bcee490659
yard-junk (0.1.0) sha256=e85fe2ec1afa47313decd333447b53458cb1ed49b510b70015fdc3041a94bcdd
yard-relative_markdown_links (0.6.0) sha256=3e5ffa85cbad9bac70bee5421774b190fb25d3bdf489323a5b3534f647d1a70e
- yard-timekeeper (0.2.3) sha256=849a3e74a0484b1e0b5209cf86823e418b3091e21f4f143c141d38e1cc262034
+ yard-timekeeper (0.2.4) sha256=62f8d001d737c6e2ac688e7b37386f958dceb0f6aff9c909575e1bec8d20775a
yard-yaml (0.2.3) sha256=fe5fef18819e1cbd05bb8f1b9e1baad6bf70c28125eb75b57bbf6397b0831812
zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12
+ zip-merge (7.1.0)
zlib (3.2.3) sha256=5bd316698b32f31a64ab910a8b6c282442ca1626a81bbd6a1674e8522e319c20
BUNDLED WITH
diff --git a/gems/ast-template/gemfiles/modular/templating.gemfile b/gems/ast-template/gemfiles/modular/templating.gemfile
index 0d1c9bcf4..e3c24e6b7 100644
--- a/gems/ast-template/gemfiles/modular/templating.gemfile
+++ b/gems/ast-template/gemfiles/modular/templating.gemfile
@@ -1,9 +1,9 @@
# frozen_string_literal: true
-smorg_remote = ENV.fetch('SMORG_RB_DEV', 'false').casecmp('false').zero?
+structuredmerge_remote = ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false').zero?
kettle_remote = ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero?
-if smorg_remote
+if structuredmerge_remote
# Merge recipes and parser dependencies for released installs.
gem 'kettle-jem', '>= 7.0'
end
@@ -13,10 +13,10 @@ if kettle_remote
gem 'kettle-drift', '~> 1.0', '>= 1.0.5', require: false
end
-# Set SMORG_RB_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies.
+# Set STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies.
# When false (default / CI), released kettle-jem brings merge gems and parser dependencies.
# Local path overrides bring the same dependencies from sibling gemspecs.
#
# Set KETTLE_RB_DEV=/path/to/kettle-rb for local development with Kettle plugin gems.
# When false (default / CI), released Kettle plugin gems are used.
-eval_gemfile 'templating_local.gemfile' unless smorg_remote && kettle_remote
+eval_gemfile 'templating_local.gemfile' unless structuredmerge_remote && kettle_remote
diff --git a/gems/ast-template/gemfiles/modular/templating_local.gemfile b/gems/ast-template/gemfiles/modular/templating_local.gemfile
index af6071632..6eb9ac7ae 100644
--- a/gems/ast-template/gemfiles/modular/templating_local.gemfile
+++ b/gems/ast-template/gemfiles/modular/templating_local.gemfile
@@ -1,12 +1,12 @@
# frozen_string_literal: true
# Local path overrides for templating development.
-# Loaded by the associated non-local gemfile when SMORG_RB_DEV or KETTLE_RB_DEV
+# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_RB_DEV
# is not "false".
require 'nomono/bundler' unless defined?(Nomono)
-smorg_rb_local_gems = %w[
+structuredmerge_local_gems = %w[
tree_haver
ast-merge
ast-merge-git
@@ -43,7 +43,7 @@ kettle_rb_local_gems = %w[
kettle-dev kettle-test kettle-soup-cover kettle-drift
]
declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name)
-smorg_rb_local_gems_to_eval = smorg_rb_local_gems - %w[ast-template] - declared_gems
+structuredmerge_local_gems_to_eval = structuredmerge_local_gems - %w[ast-template] - declared_gems
kettle_rb_local_gems_to_eval = kettle_rb_local_gems - %w[ast-template] - declared_gems
tslp_dev = ENV.fetch('TSLP_DEV', nil)
@@ -52,14 +52,14 @@ tslp_dev = ENV.fetch('TSLP_DEV', nil)
platform :mri do
gem 'tree_sitter_language_pack', path: tslp_dev unless tslp_dev.to_s.empty?
- if ENV.fetch('SMORG_RB_DEV', 'false').casecmp('false') != 0
+ if ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false') != 0
eval_nomono_gems(
- gems: smorg_rb_local_gems_to_eval,
- prefix: 'SMORG_RB',
- path_env: 'SMORG_RB_DEV',
+ gems: structuredmerge_local_gems_to_eval,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
vendored_gems_env: 'VENDORED_GEMS',
vendor_gem_dir_env: 'VENDOR_GEM_DIR',
- debug_env: 'SMORG_RB_DEBUG'
+ debug_env: 'STRUCTUREDMERGE_DEBUG'
)
end
diff --git a/gems/bash-merge/.gitattributes b/gems/bash-merge/.gitattributes
index 0ac65aaa7..35a3c7359 100644
--- a/gems/bash-merge/.gitattributes
+++ b/gems/bash-merge/.gitattributes
@@ -1,5 +1,5 @@
# <> do not edit below this line
-*.rb diff=smorg-ruby
+*.rb diff=smorg-rb
*.go diff=smorg-go
*.rs diff=smorg-rs
# <>
diff --git a/gems/bash-merge/.kettle-drift.lock b/gems/bash-merge/.kettle-drift.lock
index 9295a3562..09df60df7 100644
--- a/gems/bash-merge/.kettle-drift.lock
+++ b/gems/bash-merge/.kettle-drift.lock
@@ -4,7 +4,13 @@
"file": "Gemfile",
"lines": [
80,
- 120
+ 120,
+ 160,
+ 200,
+ 240,
+ 280,
+ 320,
+ 360
]
}
],
@@ -13,7 +19,13 @@
"file": "Gemfile",
"lines": [
91,
- 131
+ 131,
+ 171,
+ 211,
+ 251,
+ 291,
+ 331,
+ 371
]
}
],
@@ -22,7 +34,13 @@
"file": "Gemfile",
"lines": [
81,
- 121
+ 121,
+ 161,
+ 201,
+ 241,
+ 281,
+ 321,
+ 361
]
}
],
@@ -31,7 +49,13 @@
"file": "Gemfile",
"lines": [
93,
- 133
+ 133,
+ 173,
+ 213,
+ 253,
+ 293,
+ 333,
+ 373
]
}
],
@@ -40,7 +64,13 @@
"file": "Gemfile",
"lines": [
96,
- 136
+ 136,
+ 176,
+ 216,
+ 256,
+ 296,
+ 336,
+ 376
]
}
],
@@ -49,7 +79,13 @@
"file": "Gemfile",
"lines": [
82,
- 122
+ 122,
+ 162,
+ 202,
+ 242,
+ 282,
+ 322,
+ 362
]
}
],
@@ -59,7 +95,13 @@
"lines": [
60,
100,
- 140
+ 140,
+ 180,
+ 220,
+ 260,
+ 300,
+ 340,
+ 380
]
}
],
@@ -68,7 +110,13 @@
"file": "Gemfile",
"lines": [
101,
- 141
+ 141,
+ 181,
+ 221,
+ 261,
+ 301,
+ 341,
+ 381
]
}
],
@@ -78,7 +126,13 @@
"lines": [
43,
87,
- 127
+ 127,
+ 167,
+ 207,
+ 247,
+ 287,
+ 327,
+ 367
]
}
],
@@ -87,7 +141,13 @@
"file": "Gemfile",
"lines": [
110,
- 150
+ 150,
+ 190,
+ 230,
+ 270,
+ 310,
+ 350,
+ 390
]
}
],
@@ -97,7 +157,13 @@
"lines": [
35,
79,
- 119
+ 119,
+ 159,
+ 199,
+ 239,
+ 279,
+ 319,
+ 359
]
}
],
@@ -107,7 +173,13 @@
"lines": [
69,
109,
- 149
+ 149,
+ 189,
+ 229,
+ 269,
+ 309,
+ 349,
+ 389
]
}
],
@@ -116,7 +188,13 @@
"file": "Gemfile",
"lines": [
85,
- 125
+ 125,
+ 165,
+ 205,
+ 245,
+ 285,
+ 325,
+ 365
]
}
],
@@ -126,7 +204,13 @@
"lines": [
48,
92,
- 132
+ 132,
+ 172,
+ 212,
+ 252,
+ 292,
+ 332,
+ 372
]
}
],
@@ -136,7 +220,13 @@
"lines": [
44,
88,
- 128
+ 128,
+ 168,
+ 208,
+ 248,
+ 288,
+ 328,
+ 368
]
}
],
@@ -145,7 +235,13 @@
"file": "Gemfile",
"lines": [
86,
- 126
+ 126,
+ 166,
+ 206,
+ 246,
+ 286,
+ 326,
+ 366
]
}
],
@@ -154,7 +250,13 @@
"file": "Gemfile",
"lines": [
103,
- 143
+ 143,
+ 183,
+ 223,
+ 263,
+ 303,
+ 343,
+ 383
]
}
],
@@ -163,7 +265,13 @@
"file": "Gemfile",
"lines": [
102,
- 142
+ 142,
+ 182,
+ 222,
+ 262,
+ 302,
+ 342,
+ 382
]
}
],
@@ -172,7 +280,13 @@
"file": "Gemfile",
"lines": [
97,
- 137
+ 137,
+ 177,
+ 217,
+ 257,
+ 297,
+ 337,
+ 377
]
}
],
@@ -181,7 +295,13 @@
"file": "Gemfile",
"lines": [
106,
- 146
+ 146,
+ 186,
+ 226,
+ 266,
+ 306,
+ 346,
+ 386
]
}
],
diff --git a/gems/bash-merge/.rubocop_gradual.lock b/gems/bash-merge/.rubocop_gradual.lock
index 2a372fefe..69ee17f8e 100644
--- a/gems/bash-merge/.rubocop_gradual.lock
+++ b/gems/bash-merge/.rubocop_gradual.lock
@@ -8,9 +8,8 @@
[163, 121, 22, "Layout/LineLength: Line is too long. [142/120]", 1367093088],
[166, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 3881946477]
],
- "bash-merge.gemspec:1627975125": [
+ "bash-merge.gemspec:4057981445": [
[118, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 2821357214],
- [120, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 2105564149],
[126, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 981994949]
],
"gemfiles/modular/benchmark/r4/v0.5.gemfile:3644720371": [
@@ -81,6 +80,9 @@
"lib/bash-merge.rb:2115710001": [
[1, 1, 0, "Naming/FileName: The name of this source file (`bash-merge.rb`) should use snake_case.", 5381]
],
+ "lib/bash/merge.rb:4206734161": [
+ [160, 7, 615, "Metrics/MethodLength: Method has too many lines. [13/10]", 1174626529]
+ ],
"lib/bash/merge/comment_tracker.rb:2891158123": [
[54, 7, 773, "Metrics/MethodLength: Method has too many lines. [25/10]", 729186432]
],
@@ -202,9 +204,9 @@
[266, 3, 1249, "Metrics/BlockLength: Block has too many lines. [37/25]", 546398620],
[316, 3, 1101, "Metrics/BlockLength: Block has too many lines. [26/25]", 3599684932]
],
- "spec/bash/merge_spec.rb:3012823876": [
- [5, 1, 4323, "Metrics/BlockLength: Block has too many lines. [109/25]", 2384192474],
- [86, 3, 1146, "Metrics/BlockLength: Block has too many lines. [26/25]", 3618532423]
+ "spec/bash/merge_spec.rb:4280322597": [
+ [5, 1, 4187, "Metrics/BlockLength: Block has too many lines. [108/25]", 2384192474],
+ [85, 3, 1146, "Metrics/BlockLength: Block has too many lines. [26/25]", 3618532423]
],
"spec/support/shared_examples/file_analysis_examples.rb:3893834393": [
[8, 1, 1573, "Metrics/BlockLength: Block has too many lines. [36/25]", 1729754427],
diff --git a/gems/bash-merge/Gemfile b/gems/bash-merge/Gemfile
index 9674a0f1f..7e465932f 100644
--- a/gems/bash-merge/Gemfile
+++ b/gems/bash-merge/Gemfile
@@ -152,7 +152,247 @@ if direct_sibling_gems.any? &&
end
end
-# Use the StructuredMerge TLSP branch until upstream ships Ruby 4-compatible gem metadata.
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+# Use the StructuredMerge TSLP branch until upstream ships Ruby 4-compatible gem metadata.
tslp_dev = ENV.fetch('TSLP_DEV', nil)
tslp_declared_by_templating =
ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? && !tslp_dev.to_s.empty?
@@ -161,7 +401,7 @@ unless tslp_declared_by_templating
gem(
'tree_sitter_language_pack',
git: 'https://github.com/structuredmerge/tree-sitter-language-pack.git',
- branch: 'fix/ruby-4-installs',
+ branch: 'fix/ruby-parser-api-methods',
glob: 'packages/ruby/*.gemspec'
)
else
@@ -169,7 +409,7 @@ unless tslp_declared_by_templating
end
end
-# Templating (env-switched: SMORG_RB_DEV=/path/to/structuredmerge/ruby/gems for local paths)
+# Templating (env-switched: STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local paths)
eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?
# Debugging
diff --git a/gems/bash-merge/Gemfile.lock b/gems/bash-merge/Gemfile.lock
index ebf32b156..c7941d078 100644
--- a/gems/bash-merge/Gemfile.lock
+++ b/gems/bash-merge/Gemfile.lock
@@ -1,13 +1,3 @@
-GIT
- remote: https://github.com/structuredmerge/tree-sitter-language-pack.git
- revision: dcc959b12d02d6e379abf1c8ac536a852d1b8416
- branch: fix/ruby-4-installs
- glob: packages/ruby/*.gemspec
- specs:
- tree_sitter_language_pack (1.12.5)
- rb_sys (>= 0.9, < 0.9.128)
- sorbet-runtime (~> 0.5)
-
PATH
remote: .
specs:
@@ -16,22 +6,283 @@ PATH
tree_haver (= 7.1.0)
version_gem (~> 1.1, >= 1.1.14)
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-markdown-markly
+ specs:
+ ast-crispr-markdown-markly (7.1.0)
+ ast-crispr (= 7.1.0)
+ markly-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-ruby-prism
+ specs:
+ ast-crispr-ruby-prism (7.1.0)
+ ast-crispr (= 7.1.0)
+ prism-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr
+ specs:
+ ast-crispr (7.1.0)
+ ast-merge (= 7.1.0)
+ service_actor (~> 3.9)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge-git
+ specs:
+ ast-merge-git (7.1.0)
+ ast-merge (= 7.1.0)
+ json-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge
+ specs:
+ ast-merge (7.1.0)
+ benchmark
+ token-resolver (~> 2.0, >= 2.0.4)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-template
+ specs:
+ ast-template (7.1.0)
+ ast-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/binary-merge
+ specs:
+ binary-merge (7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/citrus-toml-merge
+ specs:
+ citrus-toml-merge (7.1.0)
+ toml-merge (= 7.1.0)
+ toml-rb (~> 4.1)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/commonmarker-merge
+ specs:
+ commonmarker-merge (7.1.0)
+ commonmarker (~> 2.2)
+ markdown-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/dotenv-merge
+ specs:
+ dotenv-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.14)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/go-merge
+ specs:
+ go-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/json-merge
+ specs:
+ json-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/kettle-jem
+ specs:
+ kettle-jem (7.1.0)
+ addressable (>= 2.8, < 3)
+ ast-crispr-markdown-markly (= 7.1.0)
+ ast-crispr-ruby-prism (= 7.1.0)
+ ast-merge (= 7.1.0)
+ bash-merge (= 7.1.0)
+ citrus-toml-merge (= 7.1.0)
+ commonmarker-merge (= 7.1.0)
+ dotenv-merge (= 7.1.0)
+ json-merge (= 7.1.0)
+ kettle-dev (~> 2.3, >= 2.3.5)
+ kettle-rb (~> 0.1, >= 0.1.4)
+ kramdown-merge (= 7.1.0)
+ markdown-merge (= 7.1.0)
+ markly-merge (= 7.1.0)
+ prism-merge (= 7.1.0)
+ psych-merge (= 7.1.0)
+ rbs (>= 3.10)
+ rbs-merge (= 7.1.0)
+ ruby-merge (= 7.1.0)
+ token-resolver (~> 2.0, >= 2.0.4)
+ toml-merge (= 7.1.0)
+ toml-rb (~> 4.2)
+ tree_haver (= 7.1.0)
+ yaml-merge (= 7.1.0)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/kramdown-merge
+ specs:
+ kramdown-merge (7.1.0)
+ kramdown (~> 2.5)
+ markdown-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/markdown-merge
+ specs:
+ markdown-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/markly-merge
+ specs:
+ markly-merge (7.1.0)
+ markdown-merge (= 7.1.0)
+ markly (~> 0.9)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/parslet-toml-merge
+ specs:
+ parslet-toml-merge (7.1.0)
+ toml (~> 0.3)
+ toml-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/plain-merge
+ specs:
+ plain-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/prism-merge
+ specs:
+ prism-merge (7.1.0)
+ prism (~> 1.6)
+ ruby-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/psych-merge
+ specs:
+ psych-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+ yaml-merge (= 7.1.0)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/rbs-merge
+ specs:
+ rbs-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ rbs (>= 3.10)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.14)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ruby-merge
+ specs:
+ ruby-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/rust-merge
+ specs:
+ rust-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/smorg-rb
+ specs:
+ smorg-rb (7.1.0)
+ ast-merge (= 7.1.0)
+ ast-merge-git (= 7.1.0)
+ go-merge (= 7.1.0)
+ json-merge (= 7.1.0)
+ kettle-jem (= 7.1.0)
+ markly-merge (= 7.1.0)
+ plain-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/toml-merge
+ specs:
+ toml-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/tree_haver
+ specs:
+ tree_haver (7.1.0)
+ citrus (~> 3.0)
+ parslet (~> 2.0)
+ tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/typescript-merge
+ specs:
+ typescript-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/yaml-merge
+ specs:
+ yaml-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/zip-merge
+ specs:
+ zip-merge (7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /var/home/pboling/src/my/structuredmerge/vendor/tree-sitter-language-pack/packages/ruby
+ specs:
+ tree_sitter_language_pack (1.12.5)
+ rb_sys (>= 0.9, < 0.9.128)
+ sorbet-runtime (~> 0.5)
+
GEM
remote: https://gem.coop/
specs:
addressable (2.9.0)
public_suffix (>= 2.0.2, < 8.0)
ansi (1.6.0)
- appraisal2 (3.1.4)
+ appraisal2 (3.2.0)
bundler (>= 1.17.3)
rake (>= 10)
thor (>= 0.14)
ast (2.4.3)
- ast-merge (7.1.0)
- benchmark
- token-resolver (~> 2.0, >= 2.0.4)
- tree_haver (= 7.1.0)
- version_gem (~> 1.1, >= 1.1.9)
backports (3.25.3)
benchmark (0.5.0)
bigdecimal (4.1.2)
@@ -40,6 +291,12 @@ GEM
thor (~> 1.0)
citrus (3.0.2)
cmdparse (3.0.7)
+ commonmarker (2.9.0-aarch64-linux)
+ commonmarker (2.9.0-aarch64-linux-musl)
+ commonmarker (2.9.0-arm64-darwin)
+ commonmarker (2.9.0-x86_64-darwin)
+ commonmarker (2.9.0-x86_64-linux)
+ commonmarker (2.9.0-x86_64-linux-musl)
concurrent-ruby (1.3.7)
date (3.5.1)
debug (1.11.1)
@@ -98,11 +355,13 @@ GEM
rdoc (>= 4.0.0)
reline (>= 0.4.2)
json (2.21.1)
- kettle-dev (2.3.6)
+ kettle-dev (2.3.7)
emoji_regex (>= 15.0)
kettle-rb (~> 0.1, >= 0.1.2)
kettle-test (~> 2.0, >= 2.0.4)
ruby-progressbar (~> 1.13)
+ kettle-drift (1.0.5)
+ version_gem (~> 1.1, >= 1.1.13)
kettle-rb (0.1.4)
kettle-soup-cover (1.1.3)
simplecov (~> 0.22)
@@ -131,6 +390,7 @@ GEM
language_server-protocol (3.17.0.6)
lint_roller (1.1.0)
logger (1.7.0)
+ markly (0.16.0)
mutex_m (0.3.0)
nokogiri (1.19.4-aarch64-linux-gnu)
racc (~> 1.4)
@@ -270,6 +530,8 @@ GEM
ruby-progressbar (1.13.0)
ruby_engine (2.0.3)
ruby_version (1.0.3)
+ service_actor (3.9.4)
+ zeitwerk (>= 1.0)
silent_stream (1.0.12)
logger (~> 1.2)
version_gem (>= 1.1.8, < 3)
@@ -322,13 +584,13 @@ GEM
token-resolver (2.0.4)
parslet (~> 2.0)
version_gem (~> 1.1, >= 1.1.13)
- tree_haver (7.1.0)
- citrus (~> 3.0)
- parslet (~> 2.0)
- tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0)
- version_gem (~> 1.1, >= 1.1.9)
+ toml (0.3.0)
+ parslet (>= 1.8.0, < 3.0.0)
+ toml-rb (4.2.0)
+ citrus (~> 3.0, > 3.0)
+ racc (~> 1.7)
tsort (0.2.0)
- turbo_tests2 (3.1.14)
+ turbo_tests2 (3.2.0)
parallel_tests (>= 3.3.0, < 6)
rspec (>= 3.10)
version_gem (~> 1.1, >= 1.1.14)
@@ -353,7 +615,7 @@ GEM
yard
yard-relative_markdown_links (0.6.0)
nokogiri (>= 1.14.3, < 2)
- yard-timekeeper (0.2.3)
+ yard-timekeeper (0.2.4)
version_gem (~> 1.1, >= 1.1.13)
yard-yaml (0.2.3)
version_gem (~> 1.1, >= 1.1.13)
@@ -372,24 +634,46 @@ PLATFORMS
DEPENDENCIES
addressable (>= 2.8, < 3)
- appraisal2 (~> 3.1, >= 3.1.4)
+ appraisal2 (~> 3.2, >= 3.2.0)
+ ast-crispr!
+ ast-crispr-markdown-markly!
+ ast-crispr-ruby-prism!
+ ast-merge!
+ ast-merge-git!
+ ast-template!
bash-merge!
benchmark (~> 0.5, >= 0.5.0)
+ binary-merge!
bundler-audit (~> 0.9.3)
+ citrus-toml-merge!
+ commonmarker-merge!
debug (>= 1.1)
+ dotenv-merge!
erb (~> 6.0, >= 6.0.4)
gem_bench (~> 2.0, >= 2.0.5)
gitmoji-regex (~> 2.0, >= 2.0.4)
+ go-merge!
irb (~> 1.17)
- kettle-dev (~> 2.3, >= 2.3.6)
+ json-merge!
+ kettle-dev (~> 2.3, >= 2.3.7)
+ kettle-drift (~> 1.0, >= 1.0.5)
+ kettle-jem!
kettle-soup-cover (~> 1.0, >= 1.1.3)
kettle-test (~> 2.0, >= 2.0.11)
kramdown (~> 2.5, >= 2.5.1)
+ kramdown-merge!
kramdown-parser-gfm (~> 1.1)
+ markdown-merge!
+ markly-merge!
mutex_m (~> 0.2)
nomono (~> 1.0, >= 1.0.8)
+ parslet-toml-merge!
+ plain-merge!
+ prism-merge!
+ psych-merge!
rake (~> 13.0)
rbs (>= 3.0)
+ rbs-merge!
rdoc (~> 6.11)
reek (~> 6.5)
require_bench (~> 1.0, >= 1.0.4)
@@ -398,33 +682,55 @@ DEPENDENCIES
rubocop-packaging (~> 0.6, >= 0.6.0)
rubocop-rspec (~> 3.6)
rubocop-ruby3_2 (~> 3.0.0)
+ ruby-merge!
ruby-progressbar (~> 1.13)
+ rust-merge!
+ smorg-rb!
standard (>= 1.50)
stone_checksums (~> 1.0, >= 1.0.6, >= 1.0.3)
stringio (>= 3.0)
+ toml-merge!
+ tree_haver!
tree_sitter_language_pack!
- turbo_tests2 (~> 3.1, >= 3.1.14)
+ turbo_tests2 (~> 3.2, >= 3.2.0)
+ typescript-merge!
yaml-converter (~> 0.1)
+ yaml-merge!
yard (~> 0.9, >= 0.9.44)
yard-fence (~> 0.9, >= 0.9.1)
yard-junk (~> 0.1, >= 0.1.0)
yard-relative_markdown_links (~> 0.6)
yard-timekeeper (~> 0.1)
yard-yaml (~> 0.1, >= 0.1.2)
+ zip-merge!
CHECKSUMS
addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af
ansi (1.6.0) sha256=ac9ea0c0ea8d32fb4e271348e609963ac78882f34b73836c2a02b3622e666658
- appraisal2 (3.1.4) sha256=f88c27e600adf4bd5bf06c0ab0afd1de6ce4361497760ce35e86e782036286f4
+ appraisal2 (3.2.0) sha256=ccd0b767ac4060cd7af6d16747459b6990f49c39c7b4fb1f7d1146b1e97c492f
ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
+ ast-crispr (7.1.0)
+ ast-crispr-markdown-markly (7.1.0)
+ ast-crispr-ruby-prism (7.1.0)
ast-merge (7.1.0)
+ ast-merge-git (7.1.0)
+ ast-template (7.1.0)
backports (3.25.3) sha256=94298d32dc3c40ca15633b54e282780b49e2db0c045f602ea1907e4f63a17235
bash-merge (7.1.0)
benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c
bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd
+ binary-merge (7.1.0)
bundler-audit (0.9.3) sha256=81c8766c71e47d0d28a0f98c7eed028539f21a6ea3cd8f685eb6f42333c9b4e9
citrus (3.0.2) sha256=4ec2412fc389ad186735f4baee1460f7900a8e130ffe3f216b30d4f9c684f650
+ citrus-toml-merge (7.1.0)
cmdparse (3.0.7) sha256=f7c5cace10bec6abf853370ae095e4b97a84ed9d847b3fb38f41cc4fbc950739
+ commonmarker (2.9.0-aarch64-linux) sha256=e2b4aadb9a2cfa4e206582641ce3a49465549ac1ed4c289fdd63b78d8f24579c
+ commonmarker (2.9.0-aarch64-linux-musl) sha256=1cf4d2821f2a7e64945f1ed7c4eeced586fdb27ea7fe7337788802cf8f57cfca
+ commonmarker (2.9.0-arm64-darwin) sha256=1748dbfa4f5813b0d2a14bb4bbfa65a4ec293aa1c825016d60029ee0e132b046
+ commonmarker (2.9.0-x86_64-darwin) sha256=0a9914ccfd2f5d2a59c7bd0dda4fe90eb084cf513b477e499008e09ec9d6edd6
+ commonmarker (2.9.0-x86_64-linux) sha256=8cfe92970eef585a19ddf6613224b91cab64d6029834661bda801f877c9c7f43
+ commonmarker (2.9.0-x86_64-linux-musl) sha256=293921398b839f79ceaf55010e061357e34f053822c3b003cd0be6686176335e
+ commonmarker-merge (7.1.0)
concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0
date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0
debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6
@@ -432,6 +738,7 @@ CHECKSUMS
diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962
diffy (3.4.4) sha256=79384ab5ca82d0e115b2771f0961e27c164c456074bd2ec46b637ebf7b6e47e3
docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e
+ dotenv-merge (7.1.0)
dry-configurable (1.4.0) sha256=e35d1b5f3c081753ef361f564919db79000f32cfa6f20ee3a3ba5921b41b73ce
dry-core (1.2.0) sha256=0cc5a7da88df397f153947eeeae42e876e999c1e30900f3c536fb173854e96a1
dry-inflector (1.3.1) sha256=7fb0c2bb04f67638f25c52e7ba39ab435d922a3a5c3cd196120f63accb682dcc
@@ -444,19 +751,27 @@ CHECKSUMS
gem_bench (2.0.5) sha256=0dc0fb44a5a5eb7b2f5c1c68a5b0164d72007132822c012bac3abe976b199ead
geom2d (0.4.1) sha256=ea0998ea90c4f2752e24fe13d85a4f89bee689d151316140ebcc6369bf634ed9
gitmoji-regex (2.0.4) sha256=01410d3217940bd0e7b2299ec805245afe8d0f06a5d6d38f623d63a63c0ac34f
+ go-merge (7.1.0)
hexapdf (1.9.1) sha256=2d1f6a3622e6bc2a70a707d4c3f3fa44f5552ecd9d899f6283abb07398a84884
io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc
irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3
json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583
- kettle-dev (2.3.6) sha256=955b01e8aca46438365332d1b4413f22cb58dabfeab5cba04d71237c53cc70ae
+ json-merge (7.1.0)
+ kettle-dev (2.3.7) sha256=eb370113cd030d03cbe2d33b31c99858951017e5ad21a17e9ed89dc3770028ee
+ kettle-drift (1.0.5) sha256=07094e80140a049164142820bdd327c30fcd855bb00697a0a430600a2b5144a2
+ kettle-jem (7.1.0)
kettle-rb (0.1.4) sha256=9cef7ce4f7021666b7222292f29051e51eaf042e8a5db11f3f4dd72f74243fc1
kettle-soup-cover (1.1.3) sha256=a373827da22a7131d093afd32945e5b7d7a10a01ebfdded8fd2cb8230d69c8ad
kettle-test (2.0.11) sha256=c710c90f7ab79d51f9452f0c09f5f90657e7a893f63583855c164d0b1b107ab2
kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa
+ kramdown-merge (7.1.0)
kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729
language_server-protocol (3.17.0.6) sha256=5ef2c0c138f8267e1bc631d3328347d354f96724b0af22f2c79516120443b7f0
lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87
logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
+ markdown-merge (7.1.0)
+ markly (0.16.0) sha256=6f70d79e385b1efc9e171f74c81628826259039fe6c778e03c3924c71dac5511
+ markly-merge (7.1.0)
mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751
nokogiri (1.19.4-aarch64-linux-gnu) sha256=1269fb644a6de405057a53dd5c762b1209b43ca7424f839454d3dbc677c31a8f
nokogiri (1.19.4-aarch64-linux-musl) sha256=35c65b9ce72b3bb03207bdbe7067915019dc18c1b9b59139684bd6690fdd01af
@@ -471,10 +786,14 @@ CHECKSUMS
parallel_tests (5.7.0) sha256=3f1762c46ca2c223b8af8ef877217f9d76974e191bfa934f2580b58bcf1d005c
parser (3.3.12.0) sha256=21a6d7f755d5a24dfbdc6e6b772e4e879a52e7631a88bc5a3a134606052c9828
parslet (2.0.0) sha256=d45130695d39b43d7e6a91f4d2ec66b388a8d822bae38de9b4de9a5fbde1f606
+ parslet-toml-merge (7.1.0)
+ plain-merge (7.1.0)
pp (0.6.4) sha256=dfcb0fce700c41456265922884f9fe195d7fbb0674a3578e6c0f69588e82b570
prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193
prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85
+ prism-merge (7.1.0)
psych (5.4.0) sha256=14f72d69a611af663d7d70e4a7b67d9eb1f3ae9f8d916b478961d5a0075ba5b7
+ psych-merge (7.1.0)
public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623
racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
@@ -482,6 +801,7 @@ CHECKSUMS
rake-compiler-dock (1.12.0) sha256=f13205c2738f3d2053afcd03491a9e4541b22a59a0bfc53fc8bc883bd8188023
rb_sys (0.9.127) sha256=e9f90df3bb0577472d26d96127d5b5774b98f44de881e7d36aeefd28d6337847
rbs (4.0.3) sha256=5a7bf70e2628549d9a1f44eae447b2cfe55968a9c60cfff52693a4bdcc020e14
+ rbs-merge (7.1.0)
rdoc (6.17.0) sha256=0f50d4e568fc98195f9bb155a9e8dff6c7feabfb515fb22ef6df1d12ad5a02b7
reek (6.5.0) sha256=d26d3a492773b2bbc228888067a21afe33ac07954a17dbd64cdeae42c4c69be1
regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb
@@ -509,9 +829,12 @@ CHECKSUMS
rubocop-rspec (3.10.2) sha256=0b3e2ecc592cd10ecbf0095bb58d1e357905276e069643523cc19eb7495f65e2
rubocop-ruby3_2 (3.0.7) sha256=f53dd6d286fb05186214fc6ec116783e7f837030918e8931c05de773e98f8466
rubocop-thread_safety (0.7.3) sha256=067cdd52fbf5deffc18995437e45b5194236eaff4f71de3375a1f6052e48f431
+ ruby-merge (7.1.0)
ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
ruby_engine (2.0.3) sha256=ca2ae7def8cfcdc2bfb6a186d36d5d59c8b403245dc0256c3802b767fa278aaa
ruby_version (1.0.3) sha256=5930f9950746b7e6c973184398ee364ee7440b170fef7922b9f5cdf317f1ccb5
+ rust-merge (7.1.0)
+ service_actor (3.9.4) sha256=e63b523630b9a7e62959b2a90113b08d2565b5de9c148557b281ef847c9539ce
silent_stream (1.0.12) sha256=377c43aa10033fe90c33b39ea8cd97d79f2d1c4856df598efc56f3091f3ae782
simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5
simplecov-cobertura (3.2.0) sha256=70d702658677fcb20e5aceb6915ccf8bc62ff2ccd38b62b3ad5c9db5c0888740
@@ -520,6 +843,7 @@ CHECKSUMS
simplecov-lcov (0.9.0) sha256=7a77a31e200a595ed4b0249493056efd0c920601f53d2ef135ca34ee796346cd
simplecov-rcov (0.3.7) sha256=372f50bf6df6b6350b7d0c840f2f8bdabe021861a43c26877b747c9ac96139fc
simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428
+ smorg-rb (7.1.0)
sorbet-runtime (0.6.13342) sha256=dbeb9892597f593ed2b29e38018912787f6c4e0c4b736d8af0d6bd3c63bde3c3
standard (1.56.0) sha256=ae2af4d9669589162ac69ed5ef59dcf9f346d4afc81f7e62b84339310dfcb787
standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b
@@ -533,21 +857,27 @@ CHECKSUMS
timecop (0.9.11) sha256=41284dc6e5041f2184f781ace766f942108c842f8d8c1386a26e6343decc7542
timecop-rspec (1.0.3) sha256=005f14841bb606dcaefb060e321b5388e2e59537742bee8b3a9a9a40e598fab9
token-resolver (2.0.4) sha256=33b926958f504525bba3ed511ab66fbcbf8ef30390815e931436b30f27ffcad0
+ toml (0.3.0) sha256=0a91d0f76a9036e84e44f95693b12f58d358c1df3ac8e3b5271f2056ecc6e4b9
+ toml-merge (7.1.0)
+ toml-rb (4.2.0) sha256=10a48c91613e20cf63483a7a776767dfb3cd7d70e9327c0237443da601e13776
tree_haver (7.1.0)
tree_sitter_language_pack (1.12.5)
tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f
- turbo_tests2 (3.1.14) sha256=cc29d5b36bdbba67a83eee09a9546880d0926edfbbe50d99633fc0b5763ee94c
+ turbo_tests2 (3.2.0) sha256=8b35421548399d1923567b177970f42671c65695b93cdd134d78fbcbab85dff0
+ typescript-merge (7.1.0)
unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42
unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f
version_gem (1.1.14) sha256=6b7306c7e9416d06067561981ab3444e2cecb844f26cc325ae3c27b44cf85613
yaml-converter (0.2.3) sha256=d35e69e547610d9e347672cc277fcb7d71dff3c53a942e66f82b1c64022ada72
+ yaml-merge (7.1.0)
yard (0.9.45) sha256=52e211493f7cb8a3ebf7e104a25a1e73937a3103092545d34cb88fafebb3dc51
yard-fence (0.9.6) sha256=3d1dbf4e3df462ac78b8bd2e01cf740a2de20168387c929aca31a0bcee490659
yard-junk (0.1.0) sha256=e85fe2ec1afa47313decd333447b53458cb1ed49b510b70015fdc3041a94bcdd
yard-relative_markdown_links (0.6.0) sha256=3e5ffa85cbad9bac70bee5421774b190fb25d3bdf489323a5b3534f647d1a70e
- yard-timekeeper (0.2.3) sha256=849a3e74a0484b1e0b5209cf86823e418b3091e21f4f143c141d38e1cc262034
+ yard-timekeeper (0.2.4) sha256=62f8d001d737c6e2ac688e7b37386f958dceb0f6aff9c909575e1bec8d20775a
yard-yaml (0.2.3) sha256=fe5fef18819e1cbd05bb8f1b9e1baad6bf70c28125eb75b57bbf6397b0831812
zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12
+ zip-merge (7.1.0)
zlib (3.2.3) sha256=5bd316698b32f31a64ab910a8b6c282442ca1626a81bbd6a1674e8522e319c20
BUNDLED WITH
diff --git a/gems/bash-merge/bash-merge.gemspec b/gems/bash-merge/bash-merge.gemspec
index 5ab7f0009..2e634fb4e 100644
--- a/gems/bash-merge/bash-merge.gemspec
+++ b/gems/bash-merge/bash-merge.gemspec
@@ -103,7 +103,7 @@ Gem::Specification.new do |spec|
# and preferably a modular one (see gemfiles/modular/*.gemfile).
# Dev, Test, & Release Tasks
- spec.add_development_dependency('kettle-dev', '~> 2.3', '>= 2.3.6') # ruby >= 4.0.0
+ spec.add_development_dependency('kettle-dev', '~> 2.3', '>= 2.3.7') # ruby >= 4.0.0
# Security
spec.add_development_dependency('bundler-audit', '~> 0.9.3') # ruby >= 2.0.0
@@ -115,9 +115,9 @@ Gem::Specification.new do |spec|
spec.add_development_dependency('require_bench', '~> 1.0', '>= 1.0.4') # ruby >= 2.2.0
# Testing
- spec.add_development_dependency('appraisal2', '~> 3.1', '>= 3.1.4') # ruby >= 1.8.7, for testing against multiple versions of dependencies
- spec.add_development_dependency('kettle-test', '~> 2.0', '>= 2.0.11') # ruby >= 4.0.0
- spec.add_development_dependency('turbo_tests2', '~> 3.1', '>= 3.1.14') # ruby >= 2.4.0, default kettle-test runner
+ spec.add_development_dependency('appraisal2', '~> 3.2', '>= 3.2.0') # ruby >= 1.8.7, for testing against multiple versions of dependencies
+ spec.add_development_dependency('kettle-test', '~> 2.0', '>= 2.0.11') # ruby >= 4.0.0
+ spec.add_development_dependency('turbo_tests2', '~> 3.2', '>= 3.2.0') # ruby >= 2.4.0, default kettle-test runner
# Releasing
spec.add_development_dependency('ruby-progressbar', '~> 1.13') # ruby >= 0
diff --git a/gems/bash-merge/gemfiles/modular/templating.gemfile b/gems/bash-merge/gemfiles/modular/templating.gemfile
index 0d1c9bcf4..e3c24e6b7 100644
--- a/gems/bash-merge/gemfiles/modular/templating.gemfile
+++ b/gems/bash-merge/gemfiles/modular/templating.gemfile
@@ -1,9 +1,9 @@
# frozen_string_literal: true
-smorg_remote = ENV.fetch('SMORG_RB_DEV', 'false').casecmp('false').zero?
+structuredmerge_remote = ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false').zero?
kettle_remote = ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero?
-if smorg_remote
+if structuredmerge_remote
# Merge recipes and parser dependencies for released installs.
gem 'kettle-jem', '>= 7.0'
end
@@ -13,10 +13,10 @@ if kettle_remote
gem 'kettle-drift', '~> 1.0', '>= 1.0.5', require: false
end
-# Set SMORG_RB_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies.
+# Set STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies.
# When false (default / CI), released kettle-jem brings merge gems and parser dependencies.
# Local path overrides bring the same dependencies from sibling gemspecs.
#
# Set KETTLE_RB_DEV=/path/to/kettle-rb for local development with Kettle plugin gems.
# When false (default / CI), released Kettle plugin gems are used.
-eval_gemfile 'templating_local.gemfile' unless smorg_remote && kettle_remote
+eval_gemfile 'templating_local.gemfile' unless structuredmerge_remote && kettle_remote
diff --git a/gems/bash-merge/gemfiles/modular/templating_local.gemfile b/gems/bash-merge/gemfiles/modular/templating_local.gemfile
index e98e7f415..b0ef57bb2 100644
--- a/gems/bash-merge/gemfiles/modular/templating_local.gemfile
+++ b/gems/bash-merge/gemfiles/modular/templating_local.gemfile
@@ -1,12 +1,12 @@
# frozen_string_literal: true
# Local path overrides for templating development.
-# Loaded by the associated non-local gemfile when SMORG_RB_DEV or KETTLE_RB_DEV
+# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_RB_DEV
# is not "false".
require 'nomono/bundler' unless defined?(Nomono)
-smorg_rb_local_gems = %w[
+structuredmerge_local_gems = %w[
tree_haver
ast-merge
ast-merge-git
@@ -43,7 +43,7 @@ kettle_rb_local_gems = %w[
kettle-dev kettle-test kettle-soup-cover kettle-drift
]
declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name)
-smorg_rb_local_gems_to_eval = smorg_rb_local_gems - %w[bash-merge] - declared_gems
+structuredmerge_local_gems_to_eval = structuredmerge_local_gems - %w[bash-merge] - declared_gems
kettle_rb_local_gems_to_eval = kettle_rb_local_gems - %w[bash-merge] - declared_gems
tslp_dev = ENV.fetch('TSLP_DEV', nil)
@@ -52,14 +52,14 @@ tslp_dev = ENV.fetch('TSLP_DEV', nil)
platform :mri do
gem 'tree_sitter_language_pack', path: tslp_dev unless tslp_dev.to_s.empty?
- if ENV.fetch('SMORG_RB_DEV', 'false').casecmp('false') != 0
+ if ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false') != 0
eval_nomono_gems(
- gems: smorg_rb_local_gems_to_eval,
- prefix: 'SMORG_RB',
- path_env: 'SMORG_RB_DEV',
+ gems: structuredmerge_local_gems_to_eval,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
vendored_gems_env: 'VENDORED_GEMS',
vendor_gem_dir_env: 'VENDOR_GEM_DIR',
- debug_env: 'SMORG_RB_DEBUG'
+ debug_env: 'STRUCTUREDMERGE_DEBUG'
)
end
diff --git a/gems/bash-merge/lib/bash/merge.rb b/gems/bash-merge/lib/bash/merge.rb
index 5162a23d1..5589ffdf2 100644
--- a/gems/bash-merge/lib/bash/merge.rb
+++ b/gems/bash-merge/lib/bash/merge.rb
@@ -48,10 +48,10 @@ module Bash
# @see SmartMerger Main entry point for merge operations
# @see FileAnalysis Analyzes Bash structure
module Merge
+ TREE_SITTER_BACKEND = TreeHaver::KREUZBERG_LANGUAGE_PACK_BACKEND
BACKEND_REGISTRY = Struct.new(:registered, :mutex).new(false, Mutex.new)
Availability = Struct.new(
:grammar_path,
- :language_pack_process,
:node_parser,
:diagnostics,
keyword_init: true
@@ -128,6 +128,8 @@ def register_backend!
BACKEND_REGISTRY.mutex.synchronize do
return if BACKEND_REGISTRY.registered
+ TreeHaver::BackendRegistry.register(TREE_SITTER_BACKEND)
+
grammar_finder = TreeHaver::GrammarFinder.new(:bash)
grammar_finder.register! if grammar_finder.available?
@@ -135,12 +137,12 @@ def register_backend!
end
end
- def available?(source: "#!/usr/bin/env bash\necho hello\n")
- availability(source: source).available?
+ def available_bash_backends
+ bash_backend_available_for_analysis?(TREE_SITTER_BACKEND.id) ? [TREE_SITTER_BACKEND] : []
end
- def language_pack_process_available?(source: "#!/usr/bin/env bash\necho hello\n")
- availability(source: source).language_pack_process == true
+ def available?(source: "#!/usr/bin/env bash\necho hello\n")
+ availability(source: source).available?
end
def availability(source: "#!/usr/bin/env bash\necho hello\n")
@@ -148,7 +150,6 @@ def availability(source: "#!/usr/bin/env bash\necho hello\n")
grammar_path = bash_grammar_path(diagnostics)
Availability.new(
grammar_path: grammar_path,
- language_pack_process: language_pack_process_available_for?(source, diagnostics),
node_parser: node_parser_available_for?(source, grammar_path, diagnostics),
diagnostics: diagnostics
)
@@ -163,20 +164,12 @@ def bash_grammar_path(diagnostics)
nil
end
- def language_pack_process_available_for?(source, diagnostics)
- result = TreeHaver.process_with_language_pack(
- TreeHaver::ProcessRequest.new(source: source, language: 'bash')
- )
- ok = result[:ok] == true
- diagnostics.concat(Array(result[:diagnostics])) unless ok
- ok
- rescue StandardError => e
- diagnostics << { kind: 'bash_language_pack_unavailable', message: e.message }
- false
- end
-
def node_parser_available_for?(source, grammar_path, diagnostics)
- parser = TreeHaver.parser_for(:bash, library_path: grammar_path)
+ parser = if grammar_path
+ TreeHaver.parser_for(:bash, library_path: grammar_path)
+ else
+ TreeHaver.parser_for(:bash)
+ end
tree = parser.parse(source)
!tree.nil? && !tree.root_node.nil?
rescue TreeHaver::Error => e
@@ -186,6 +179,14 @@ def node_parser_available_for?(source, grammar_path, diagnostics)
diagnostics << { kind: 'bash_node_parser_unavailable', message: e.message }
false
end
+
+ def bash_backend_available_for_analysis?(backend_id)
+ register_backend!
+ return false unless backend_id.to_s == TREE_SITTER_BACKEND.id
+
+ registrations = TreeHaver.registered_languages(:bash)
+ registrations.key?(:tree_sitter) || registrations.key?(:tslp)
+ end
end
end
end
diff --git a/gems/bash-merge/spec/bash/merge_spec.rb b/gems/bash-merge/spec/bash/merge_spec.rb
index 1807f3d59..9d75d2002 100644
--- a/gems/bash-merge/spec/bash/merge_spec.rb
+++ b/gems/bash-merge/spec/bash/merge_spec.rb
@@ -71,13 +71,18 @@
expect(registrations).to be_a(Hash)
end
+
+ it 'exposes the registered TreeHaver language-pack backend' do
+ expect(described_class.available_bash_backends.map(&:to_h)).to eq(
+ [{ id: 'kreuzberg-language-pack', family: 'tree-sitter' }]
+ )
+ end
end
describe '.availability' do
- it 'reports language-pack processing separately from node parser availability' do
+ it 'reports TreeHaver node parser availability' do
availability = described_class.availability
- expect(availability.language_pack_process).to eq(described_class.language_pack_process_available?)
expect(availability.node_parser).to eq(described_class.available?)
expect(availability.diagnostics).to be_an(Array)
end
diff --git a/gems/binary-merge/.gitattributes b/gems/binary-merge/.gitattributes
index 0ac65aaa7..35a3c7359 100644
--- a/gems/binary-merge/.gitattributes
+++ b/gems/binary-merge/.gitattributes
@@ -1,5 +1,5 @@
# <> do not edit below this line
-*.rb diff=smorg-ruby
+*.rb diff=smorg-rb
*.go diff=smorg-go
*.rs diff=smorg-rs
# <>
diff --git a/gems/binary-merge/.kettle-drift.lock b/gems/binary-merge/.kettle-drift.lock
index 9878fb8f5..f1287e677 100644
--- a/gems/binary-merge/.kettle-drift.lock
+++ b/gems/binary-merge/.kettle-drift.lock
@@ -5,7 +5,13 @@
"lines": [
79,
119,
- 159
+ 159,
+ 199,
+ 239,
+ 279,
+ 319,
+ 359,
+ 399
]
}
],
@@ -15,7 +21,13 @@
"lines": [
90,
130,
- 170
+ 170,
+ 210,
+ 250,
+ 290,
+ 330,
+ 370,
+ 410
]
}
],
@@ -25,7 +37,13 @@
"lines": [
80,
120,
- 160
+ 160,
+ 200,
+ 240,
+ 280,
+ 320,
+ 360,
+ 400
]
}
],
@@ -35,7 +53,13 @@
"lines": [
92,
132,
- 172
+ 172,
+ 212,
+ 252,
+ 292,
+ 332,
+ 372,
+ 412
]
}
],
@@ -45,7 +69,13 @@
"lines": [
95,
135,
- 175
+ 175,
+ 215,
+ 255,
+ 295,
+ 335,
+ 375,
+ 415
]
}
],
@@ -55,7 +85,13 @@
"lines": [
81,
121,
- 161
+ 161,
+ 201,
+ 241,
+ 281,
+ 321,
+ 361,
+ 401
]
}
],
@@ -66,7 +102,13 @@
59,
99,
139,
- 179
+ 179,
+ 219,
+ 259,
+ 299,
+ 339,
+ 379,
+ 419
]
}
],
@@ -76,7 +118,13 @@
"lines": [
100,
140,
- 180
+ 180,
+ 220,
+ 260,
+ 300,
+ 340,
+ 380,
+ 420
]
}
],
@@ -87,7 +135,13 @@
42,
86,
126,
- 166
+ 166,
+ 206,
+ 246,
+ 286,
+ 326,
+ 366,
+ 406
]
}
],
@@ -97,7 +151,13 @@
"lines": [
109,
149,
- 189
+ 189,
+ 229,
+ 269,
+ 309,
+ 349,
+ 389,
+ 429
]
}
],
@@ -108,7 +168,13 @@
34,
78,
118,
- 158
+ 158,
+ 198,
+ 238,
+ 278,
+ 318,
+ 358,
+ 398
]
}
],
@@ -119,7 +185,13 @@
68,
108,
148,
- 188
+ 188,
+ 228,
+ 268,
+ 308,
+ 348,
+ 388,
+ 428
]
}
],
@@ -129,7 +201,13 @@
"lines": [
84,
124,
- 164
+ 164,
+ 204,
+ 244,
+ 284,
+ 324,
+ 364,
+ 404
]
}
],
@@ -140,7 +218,13 @@
47,
91,
131,
- 171
+ 171,
+ 211,
+ 251,
+ 291,
+ 331,
+ 371,
+ 411
]
}
],
@@ -151,7 +235,13 @@
43,
87,
127,
- 167
+ 167,
+ 207,
+ 247,
+ 287,
+ 327,
+ 367,
+ 407
]
}
],
@@ -161,7 +251,13 @@
"lines": [
85,
125,
- 165
+ 165,
+ 205,
+ 245,
+ 285,
+ 325,
+ 365,
+ 405
]
}
],
@@ -171,7 +267,13 @@
"lines": [
102,
142,
- 182
+ 182,
+ 222,
+ 262,
+ 302,
+ 342,
+ 382,
+ 422
]
}
],
@@ -181,7 +283,13 @@
"lines": [
101,
141,
- 181
+ 181,
+ 221,
+ 261,
+ 301,
+ 341,
+ 381,
+ 421
]
}
],
@@ -191,7 +299,13 @@
"lines": [
96,
136,
- 176
+ 176,
+ 216,
+ 256,
+ 296,
+ 336,
+ 376,
+ 416
]
}
],
@@ -201,7 +315,13 @@
"lines": [
105,
145,
- 185
+ 185,
+ 225,
+ 265,
+ 305,
+ 345,
+ 385,
+ 425
]
}
],
diff --git a/gems/binary-merge/Gemfile b/gems/binary-merge/Gemfile
index 156002edc..0a94ca078 100644
--- a/gems/binary-merge/Gemfile
+++ b/gems/binary-merge/Gemfile
@@ -191,7 +191,247 @@ if direct_sibling_gems.any? &&
end
end
-# Use the StructuredMerge TLSP branch until upstream ships Ruby 4-compatible gem metadata.
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+# Use the StructuredMerge TSLP branch until upstream ships Ruby 4-compatible gem metadata.
tslp_dev = ENV.fetch('TSLP_DEV', nil)
tslp_declared_by_templating =
ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? && !tslp_dev.to_s.empty?
@@ -200,7 +440,7 @@ unless tslp_declared_by_templating
gem(
'tree_sitter_language_pack',
git: 'https://github.com/structuredmerge/tree-sitter-language-pack.git',
- branch: 'fix/ruby-4-installs',
+ branch: 'fix/ruby-parser-api-methods',
glob: 'packages/ruby/*.gemspec'
)
else
@@ -208,7 +448,7 @@ unless tslp_declared_by_templating
end
end
-# Templating (env-switched: SMORG_RB_DEV=/path/to/structuredmerge/ruby/gems for local paths)
+# Templating (env-switched: STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local paths)
eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?
# Debugging
diff --git a/gems/binary-merge/Gemfile.lock b/gems/binary-merge/Gemfile.lock
index 7d76fd19b..41b29f356 100644
--- a/gems/binary-merge/Gemfile.lock
+++ b/gems/binary-merge/Gemfile.lock
@@ -1,13 +1,3 @@
-GIT
- remote: https://github.com/structuredmerge/tree-sitter-language-pack.git
- revision: dcc959b12d02d6e379abf1c8ac536a852d1b8416
- branch: fix/ruby-4-installs
- glob: packages/ruby/*.gemspec
- specs:
- tree_sitter_language_pack (1.12.5)
- rb_sys (>= 0.9, < 0.9.128)
- sorbet-runtime (~> 0.5)
-
PATH
remote: .
specs:
@@ -15,13 +5,280 @@ PATH
tree_haver (= 7.1.0)
version_gem (~> 1.1, >= 1.1.9)
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-markdown-markly
+ specs:
+ ast-crispr-markdown-markly (7.1.0)
+ ast-crispr (= 7.1.0)
+ markly-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-ruby-prism
+ specs:
+ ast-crispr-ruby-prism (7.1.0)
+ ast-crispr (= 7.1.0)
+ prism-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr
+ specs:
+ ast-crispr (7.1.0)
+ ast-merge (= 7.1.0)
+ service_actor (~> 3.9)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge-git
+ specs:
+ ast-merge-git (7.1.0)
+ ast-merge (= 7.1.0)
+ json-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge
+ specs:
+ ast-merge (7.1.0)
+ benchmark
+ token-resolver (~> 2.0, >= 2.0.4)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-template
+ specs:
+ ast-template (7.1.0)
+ ast-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/bash-merge
+ specs:
+ bash-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.14)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/citrus-toml-merge
+ specs:
+ citrus-toml-merge (7.1.0)
+ toml-merge (= 7.1.0)
+ toml-rb (~> 4.1)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/commonmarker-merge
+ specs:
+ commonmarker-merge (7.1.0)
+ commonmarker (~> 2.2)
+ markdown-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/dotenv-merge
+ specs:
+ dotenv-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.14)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/go-merge
+ specs:
+ go-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/json-merge
+ specs:
+ json-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/kettle-jem
+ specs:
+ kettle-jem (7.1.0)
+ addressable (>= 2.8, < 3)
+ ast-crispr-markdown-markly (= 7.1.0)
+ ast-crispr-ruby-prism (= 7.1.0)
+ ast-merge (= 7.1.0)
+ bash-merge (= 7.1.0)
+ citrus-toml-merge (= 7.1.0)
+ commonmarker-merge (= 7.1.0)
+ dotenv-merge (= 7.1.0)
+ json-merge (= 7.1.0)
+ kettle-dev (~> 2.3, >= 2.3.5)
+ kettle-rb (~> 0.1, >= 0.1.4)
+ kramdown-merge (= 7.1.0)
+ markdown-merge (= 7.1.0)
+ markly-merge (= 7.1.0)
+ prism-merge (= 7.1.0)
+ psych-merge (= 7.1.0)
+ rbs (>= 3.10)
+ rbs-merge (= 7.1.0)
+ ruby-merge (= 7.1.0)
+ token-resolver (~> 2.0, >= 2.0.4)
+ toml-merge (= 7.1.0)
+ toml-rb (~> 4.2)
+ tree_haver (= 7.1.0)
+ yaml-merge (= 7.1.0)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/kramdown-merge
+ specs:
+ kramdown-merge (7.1.0)
+ kramdown (~> 2.5)
+ markdown-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/markdown-merge
+ specs:
+ markdown-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/markly-merge
+ specs:
+ markly-merge (7.1.0)
+ markdown-merge (= 7.1.0)
+ markly (~> 0.9)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/parslet-toml-merge
+ specs:
+ parslet-toml-merge (7.1.0)
+ toml (~> 0.3)
+ toml-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/plain-merge
+ specs:
+ plain-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/prism-merge
+ specs:
+ prism-merge (7.1.0)
+ prism (~> 1.6)
+ ruby-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/psych-merge
+ specs:
+ psych-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+ yaml-merge (= 7.1.0)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/rbs-merge
+ specs:
+ rbs-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ rbs (>= 3.10)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.14)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ruby-merge
+ specs:
+ ruby-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/rust-merge
+ specs:
+ rust-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/smorg-rb
+ specs:
+ smorg-rb (7.1.0)
+ ast-merge (= 7.1.0)
+ ast-merge-git (= 7.1.0)
+ go-merge (= 7.1.0)
+ json-merge (= 7.1.0)
+ kettle-jem (= 7.1.0)
+ markly-merge (= 7.1.0)
+ plain-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/toml-merge
+ specs:
+ toml-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/tree_haver
+ specs:
+ tree_haver (7.1.0)
+ citrus (~> 3.0)
+ parslet (~> 2.0)
+ tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/typescript-merge
+ specs:
+ typescript-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/yaml-merge
+ specs:
+ yaml-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/zip-merge
+ specs:
+ zip-merge (7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /var/home/pboling/src/my/structuredmerge/vendor/tree-sitter-language-pack/packages/ruby
+ specs:
+ tree_sitter_language_pack (1.12.5)
+ rb_sys (>= 0.9, < 0.9.128)
+ sorbet-runtime (~> 0.5)
+
GEM
remote: https://gem.coop/
specs:
addressable (2.9.0)
public_suffix (>= 2.0.2, < 8.0)
ansi (1.6.0)
- appraisal2 (3.1.4)
+ appraisal2 (3.2.0)
bundler (>= 1.17.3)
rake (>= 10)
thor (>= 0.14)
@@ -34,6 +291,12 @@ GEM
thor (~> 1.0)
citrus (3.0.2)
cmdparse (3.0.7)
+ commonmarker (2.9.0-aarch64-linux)
+ commonmarker (2.9.0-aarch64-linux-musl)
+ commonmarker (2.9.0-arm64-darwin)
+ commonmarker (2.9.0-x86_64-darwin)
+ commonmarker (2.9.0-x86_64-linux)
+ commonmarker (2.9.0-x86_64-linux-musl)
concurrent-ruby (1.3.7)
date (3.5.1)
debug (1.11.1)
@@ -92,11 +355,13 @@ GEM
rdoc (>= 4.0.0)
reline (>= 0.4.2)
json (2.21.1)
- kettle-dev (2.3.6)
+ kettle-dev (2.3.7)
emoji_regex (>= 15.0)
kettle-rb (~> 0.1, >= 0.1.2)
kettle-test (~> 2.0, >= 2.0.4)
ruby-progressbar (~> 1.13)
+ kettle-drift (1.0.5)
+ version_gem (~> 1.1, >= 1.1.13)
kettle-rb (0.1.4)
kettle-soup-cover (1.1.3)
simplecov (~> 0.22)
@@ -125,6 +390,7 @@ GEM
language_server-protocol (3.17.0.6)
lint_roller (1.1.0)
logger (1.7.0)
+ markly (0.16.0)
mutex_m (0.3.0)
nokogiri (1.19.4-aarch64-linux-gnu)
racc (~> 1.4)
@@ -264,6 +530,8 @@ GEM
ruby-progressbar (1.13.0)
ruby_engine (2.0.3)
ruby_version (1.0.3)
+ service_actor (3.9.4)
+ zeitwerk (>= 1.0)
silent_stream (1.0.12)
logger (~> 1.2)
version_gem (>= 1.1.8, < 3)
@@ -313,13 +581,16 @@ GEM
delegate (~> 0.1)
rspec (~> 3.0)
timecop (>= 0.7, < 1)
- tree_haver (7.1.0)
- citrus (~> 3.0)
+ token-resolver (2.0.4)
parslet (~> 2.0)
- tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0)
- version_gem (~> 1.1, >= 1.1.9)
+ version_gem (~> 1.1, >= 1.1.13)
+ toml (0.3.0)
+ parslet (>= 1.8.0, < 3.0.0)
+ toml-rb (4.2.0)
+ citrus (~> 3.0, > 3.0)
+ racc (~> 1.7)
tsort (0.2.0)
- turbo_tests2 (3.1.14)
+ turbo_tests2 (3.2.0)
parallel_tests (>= 3.3.0, < 6)
rspec (>= 3.10)
version_gem (~> 1.1, >= 1.1.14)
@@ -344,7 +615,7 @@ GEM
yard
yard-relative_markdown_links (0.6.0)
nokogiri (>= 1.14.3, < 2)
- yard-timekeeper (0.2.3)
+ yard-timekeeper (0.2.4)
version_gem (~> 1.1, >= 1.1.13)
yard-yaml (0.2.3)
version_gem (~> 1.1, >= 1.1.13)
@@ -364,23 +635,45 @@ PLATFORMS
DEPENDENCIES
addressable (>= 2.8, < 3)
appraisal2 (~> 3.0, >= 3.0.6)
+ ast-crispr!
+ ast-crispr-markdown-markly!
+ ast-crispr-ruby-prism!
+ ast-merge!
+ ast-merge-git!
+ ast-template!
+ bash-merge!
benchmark (~> 0.5, >= 0.5.0)
binary-merge!
bundler-audit (~> 0.9.3)
+ citrus-toml-merge!
+ commonmarker-merge!
debug (>= 1.1)
+ dotenv-merge!
erb (~> 6.0, >= 6.0.4)
gem_bench (~> 2.0, >= 2.0.5)
gitmoji-regex (~> 2.0, >= 2.0.0)
+ go-merge!
irb (~> 1.17)
+ json-merge!
kettle-dev (~> 2.0, >= 2.2.25)
+ kettle-drift (~> 1.0, >= 1.0.5)
+ kettle-jem!
kettle-soup-cover (~> 1.0, >= 1.1.3)
kettle-test (~> 2.0, >= 2.0.9)
kramdown (~> 2.5, >= 2.5.1)
+ kramdown-merge!
kramdown-parser-gfm (~> 1.1)
+ markdown-merge!
+ markly-merge!
mutex_m (~> 0.2)
nomono (~> 1.0, >= 1.0.8)
+ parslet-toml-merge!
+ plain-merge!
+ prism-merge!
+ psych-merge!
rake (~> 13.0)
rbs (>= 3.0)
+ rbs-merge!
rdoc (~> 6.11)
reek (~> 6.5)
require_bench (~> 1.0, >= 1.0.4)
@@ -389,31 +682,54 @@ DEPENDENCIES
rubocop-packaging (~> 0.6, >= 0.6.0)
rubocop-rspec (~> 3.6)
rubocop-ruby3_2 (~> 3.0.0)
+ ruby-merge!
ruby-progressbar (~> 1.13)
+ rust-merge!
+ smorg-rb!
standard (>= 1.50)
stone_checksums (~> 1.0, >= 1.0.3)
stringio (>= 3.0)
+ toml-merge!
+ tree_haver!
tree_sitter_language_pack!
+ typescript-merge!
yaml-converter (~> 0.1)
+ yaml-merge!
yard (~> 0.9, >= 0.9.44)
yard-fence (~> 0.9, >= 0.9.1)
yard-junk (~> 0.1, >= 0.1.0)
yard-relative_markdown_links (~> 0.6)
yard-timekeeper (~> 0.1)
yard-yaml (~> 0.1, >= 0.1.2)
+ zip-merge!
CHECKSUMS
addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af
ansi (1.6.0) sha256=ac9ea0c0ea8d32fb4e271348e609963ac78882f34b73836c2a02b3622e666658
- appraisal2 (3.1.4) sha256=f88c27e600adf4bd5bf06c0ab0afd1de6ce4361497760ce35e86e782036286f4
+ appraisal2 (3.2.0) sha256=ccd0b767ac4060cd7af6d16747459b6990f49c39c7b4fb1f7d1146b1e97c492f
ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
+ ast-crispr (7.1.0)
+ ast-crispr-markdown-markly (7.1.0)
+ ast-crispr-ruby-prism (7.1.0)
+ ast-merge (7.1.0)
+ ast-merge-git (7.1.0)
+ ast-template (7.1.0)
backports (3.25.3) sha256=94298d32dc3c40ca15633b54e282780b49e2db0c045f602ea1907e4f63a17235
+ bash-merge (7.1.0)
benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c
bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd
binary-merge (7.1.0)
bundler-audit (0.9.3) sha256=81c8766c71e47d0d28a0f98c7eed028539f21a6ea3cd8f685eb6f42333c9b4e9
citrus (3.0.2) sha256=4ec2412fc389ad186735f4baee1460f7900a8e130ffe3f216b30d4f9c684f650
+ citrus-toml-merge (7.1.0)
cmdparse (3.0.7) sha256=f7c5cace10bec6abf853370ae095e4b97a84ed9d847b3fb38f41cc4fbc950739
+ commonmarker (2.9.0-aarch64-linux) sha256=e2b4aadb9a2cfa4e206582641ce3a49465549ac1ed4c289fdd63b78d8f24579c
+ commonmarker (2.9.0-aarch64-linux-musl) sha256=1cf4d2821f2a7e64945f1ed7c4eeced586fdb27ea7fe7337788802cf8f57cfca
+ commonmarker (2.9.0-arm64-darwin) sha256=1748dbfa4f5813b0d2a14bb4bbfa65a4ec293aa1c825016d60029ee0e132b046
+ commonmarker (2.9.0-x86_64-darwin) sha256=0a9914ccfd2f5d2a59c7bd0dda4fe90eb084cf513b477e499008e09ec9d6edd6
+ commonmarker (2.9.0-x86_64-linux) sha256=8cfe92970eef585a19ddf6613224b91cab64d6029834661bda801f877c9c7f43
+ commonmarker (2.9.0-x86_64-linux-musl) sha256=293921398b839f79ceaf55010e061357e34f053822c3b003cd0be6686176335e
+ commonmarker-merge (7.1.0)
concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0
date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0
debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6
@@ -421,6 +737,7 @@ CHECKSUMS
diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962
diffy (3.4.4) sha256=79384ab5ca82d0e115b2771f0961e27c164c456074bd2ec46b637ebf7b6e47e3
docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e
+ dotenv-merge (7.1.0)
dry-configurable (1.4.0) sha256=e35d1b5f3c081753ef361f564919db79000f32cfa6f20ee3a3ba5921b41b73ce
dry-core (1.2.0) sha256=0cc5a7da88df397f153947eeeae42e876e999c1e30900f3c536fb173854e96a1
dry-inflector (1.3.1) sha256=7fb0c2bb04f67638f25c52e7ba39ab435d922a3a5c3cd196120f63accb682dcc
@@ -433,19 +750,27 @@ CHECKSUMS
gem_bench (2.0.5) sha256=0dc0fb44a5a5eb7b2f5c1c68a5b0164d72007132822c012bac3abe976b199ead
geom2d (0.4.1) sha256=ea0998ea90c4f2752e24fe13d85a4f89bee689d151316140ebcc6369bf634ed9
gitmoji-regex (2.0.4) sha256=01410d3217940bd0e7b2299ec805245afe8d0f06a5d6d38f623d63a63c0ac34f
+ go-merge (7.1.0)
hexapdf (1.9.1) sha256=2d1f6a3622e6bc2a70a707d4c3f3fa44f5552ecd9d899f6283abb07398a84884
io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc
irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3
json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583
- kettle-dev (2.3.6) sha256=955b01e8aca46438365332d1b4413f22cb58dabfeab5cba04d71237c53cc70ae
+ json-merge (7.1.0)
+ kettle-dev (2.3.7) sha256=eb370113cd030d03cbe2d33b31c99858951017e5ad21a17e9ed89dc3770028ee
+ kettle-drift (1.0.5) sha256=07094e80140a049164142820bdd327c30fcd855bb00697a0a430600a2b5144a2
+ kettle-jem (7.1.0)
kettle-rb (0.1.4) sha256=9cef7ce4f7021666b7222292f29051e51eaf042e8a5db11f3f4dd72f74243fc1
kettle-soup-cover (1.1.3) sha256=a373827da22a7131d093afd32945e5b7d7a10a01ebfdded8fd2cb8230d69c8ad
kettle-test (2.0.11) sha256=c710c90f7ab79d51f9452f0c09f5f90657e7a893f63583855c164d0b1b107ab2
kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa
+ kramdown-merge (7.1.0)
kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729
language_server-protocol (3.17.0.6) sha256=5ef2c0c138f8267e1bc631d3328347d354f96724b0af22f2c79516120443b7f0
lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87
logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
+ markdown-merge (7.1.0)
+ markly (0.16.0) sha256=6f70d79e385b1efc9e171f74c81628826259039fe6c778e03c3924c71dac5511
+ markly-merge (7.1.0)
mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751
nokogiri (1.19.4-aarch64-linux-gnu) sha256=1269fb644a6de405057a53dd5c762b1209b43ca7424f839454d3dbc677c31a8f
nokogiri (1.19.4-aarch64-linux-musl) sha256=35c65b9ce72b3bb03207bdbe7067915019dc18c1b9b59139684bd6690fdd01af
@@ -460,10 +785,14 @@ CHECKSUMS
parallel_tests (5.7.0) sha256=3f1762c46ca2c223b8af8ef877217f9d76974e191bfa934f2580b58bcf1d005c
parser (3.3.12.0) sha256=21a6d7f755d5a24dfbdc6e6b772e4e879a52e7631a88bc5a3a134606052c9828
parslet (2.0.0) sha256=d45130695d39b43d7e6a91f4d2ec66b388a8d822bae38de9b4de9a5fbde1f606
+ parslet-toml-merge (7.1.0)
+ plain-merge (7.1.0)
pp (0.6.4) sha256=dfcb0fce700c41456265922884f9fe195d7fbb0674a3578e6c0f69588e82b570
prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193
prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85
+ prism-merge (7.1.0)
psych (5.4.0) sha256=14f72d69a611af663d7d70e4a7b67d9eb1f3ae9f8d916b478961d5a0075ba5b7
+ psych-merge (7.1.0)
public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623
racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
@@ -471,6 +800,7 @@ CHECKSUMS
rake-compiler-dock (1.12.0) sha256=f13205c2738f3d2053afcd03491a9e4541b22a59a0bfc53fc8bc883bd8188023
rb_sys (0.9.127) sha256=e9f90df3bb0577472d26d96127d5b5774b98f44de881e7d36aeefd28d6337847
rbs (4.0.3) sha256=5a7bf70e2628549d9a1f44eae447b2cfe55968a9c60cfff52693a4bdcc020e14
+ rbs-merge (7.1.0)
rdoc (6.17.0) sha256=0f50d4e568fc98195f9bb155a9e8dff6c7feabfb515fb22ef6df1d12ad5a02b7
reek (6.5.0) sha256=d26d3a492773b2bbc228888067a21afe33ac07954a17dbd64cdeae42c4c69be1
regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb
@@ -498,9 +828,12 @@ CHECKSUMS
rubocop-rspec (3.10.2) sha256=0b3e2ecc592cd10ecbf0095bb58d1e357905276e069643523cc19eb7495f65e2
rubocop-ruby3_2 (3.0.7) sha256=f53dd6d286fb05186214fc6ec116783e7f837030918e8931c05de773e98f8466
rubocop-thread_safety (0.7.3) sha256=067cdd52fbf5deffc18995437e45b5194236eaff4f71de3375a1f6052e48f431
+ ruby-merge (7.1.0)
ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
ruby_engine (2.0.3) sha256=ca2ae7def8cfcdc2bfb6a186d36d5d59c8b403245dc0256c3802b767fa278aaa
ruby_version (1.0.3) sha256=5930f9950746b7e6c973184398ee364ee7440b170fef7922b9f5cdf317f1ccb5
+ rust-merge (7.1.0)
+ service_actor (3.9.4) sha256=e63b523630b9a7e62959b2a90113b08d2565b5de9c148557b281ef847c9539ce
silent_stream (1.0.12) sha256=377c43aa10033fe90c33b39ea8cd97d79f2d1c4856df598efc56f3091f3ae782
simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5
simplecov-cobertura (3.2.0) sha256=70d702658677fcb20e5aceb6915ccf8bc62ff2ccd38b62b3ad5c9db5c0888740
@@ -509,6 +842,7 @@ CHECKSUMS
simplecov-lcov (0.9.0) sha256=7a77a31e200a595ed4b0249493056efd0c920601f53d2ef135ca34ee796346cd
simplecov-rcov (0.3.7) sha256=372f50bf6df6b6350b7d0c840f2f8bdabe021861a43c26877b747c9ac96139fc
simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428
+ smorg-rb (7.1.0)
sorbet-runtime (0.6.13342) sha256=dbeb9892597f593ed2b29e38018912787f6c4e0c4b736d8af0d6bd3c63bde3c3
standard (1.56.0) sha256=ae2af4d9669589162ac69ed5ef59dcf9f346d4afc81f7e62b84339310dfcb787
standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b
@@ -521,21 +855,28 @@ CHECKSUMS
thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73
timecop (0.9.11) sha256=41284dc6e5041f2184f781ace766f942108c842f8d8c1386a26e6343decc7542
timecop-rspec (1.0.3) sha256=005f14841bb606dcaefb060e321b5388e2e59537742bee8b3a9a9a40e598fab9
+ token-resolver (2.0.4) sha256=33b926958f504525bba3ed511ab66fbcbf8ef30390815e931436b30f27ffcad0
+ toml (0.3.0) sha256=0a91d0f76a9036e84e44f95693b12f58d358c1df3ac8e3b5271f2056ecc6e4b9
+ toml-merge (7.1.0)
+ toml-rb (4.2.0) sha256=10a48c91613e20cf63483a7a776767dfb3cd7d70e9327c0237443da601e13776
tree_haver (7.1.0)
tree_sitter_language_pack (1.12.5)
tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f
- turbo_tests2 (3.1.14) sha256=cc29d5b36bdbba67a83eee09a9546880d0926edfbbe50d99633fc0b5763ee94c
+ turbo_tests2 (3.2.0) sha256=8b35421548399d1923567b177970f42671c65695b93cdd134d78fbcbab85dff0
+ typescript-merge (7.1.0)
unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42
unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f
version_gem (1.1.14) sha256=6b7306c7e9416d06067561981ab3444e2cecb844f26cc325ae3c27b44cf85613
yaml-converter (0.2.3) sha256=d35e69e547610d9e347672cc277fcb7d71dff3c53a942e66f82b1c64022ada72
+ yaml-merge (7.1.0)
yard (0.9.45) sha256=52e211493f7cb8a3ebf7e104a25a1e73937a3103092545d34cb88fafebb3dc51
yard-fence (0.9.6) sha256=3d1dbf4e3df462ac78b8bd2e01cf740a2de20168387c929aca31a0bcee490659
yard-junk (0.1.0) sha256=e85fe2ec1afa47313decd333447b53458cb1ed49b510b70015fdc3041a94bcdd
yard-relative_markdown_links (0.6.0) sha256=3e5ffa85cbad9bac70bee5421774b190fb25d3bdf489323a5b3534f647d1a70e
- yard-timekeeper (0.2.3) sha256=849a3e74a0484b1e0b5209cf86823e418b3091e21f4f143c141d38e1cc262034
+ yard-timekeeper (0.2.4) sha256=62f8d001d737c6e2ac688e7b37386f958dceb0f6aff9c909575e1bec8d20775a
yard-yaml (0.2.3) sha256=fe5fef18819e1cbd05bb8f1b9e1baad6bf70c28125eb75b57bbf6397b0831812
zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12
+ zip-merge (7.1.0)
zlib (3.2.3) sha256=5bd316698b32f31a64ab910a8b6c282442ca1626a81bbd6a1674e8522e319c20
BUNDLED WITH
diff --git a/gems/binary-merge/gemfiles/modular/templating.gemfile b/gems/binary-merge/gemfiles/modular/templating.gemfile
index 0d1c9bcf4..e3c24e6b7 100644
--- a/gems/binary-merge/gemfiles/modular/templating.gemfile
+++ b/gems/binary-merge/gemfiles/modular/templating.gemfile
@@ -1,9 +1,9 @@
# frozen_string_literal: true
-smorg_remote = ENV.fetch('SMORG_RB_DEV', 'false').casecmp('false').zero?
+structuredmerge_remote = ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false').zero?
kettle_remote = ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero?
-if smorg_remote
+if structuredmerge_remote
# Merge recipes and parser dependencies for released installs.
gem 'kettle-jem', '>= 7.0'
end
@@ -13,10 +13,10 @@ if kettle_remote
gem 'kettle-drift', '~> 1.0', '>= 1.0.5', require: false
end
-# Set SMORG_RB_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies.
+# Set STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies.
# When false (default / CI), released kettle-jem brings merge gems and parser dependencies.
# Local path overrides bring the same dependencies from sibling gemspecs.
#
# Set KETTLE_RB_DEV=/path/to/kettle-rb for local development with Kettle plugin gems.
# When false (default / CI), released Kettle plugin gems are used.
-eval_gemfile 'templating_local.gemfile' unless smorg_remote && kettle_remote
+eval_gemfile 'templating_local.gemfile' unless structuredmerge_remote && kettle_remote
diff --git a/gems/binary-merge/gemfiles/modular/templating_local.gemfile b/gems/binary-merge/gemfiles/modular/templating_local.gemfile
index c4b43a13e..41201dc8a 100644
--- a/gems/binary-merge/gemfiles/modular/templating_local.gemfile
+++ b/gems/binary-merge/gemfiles/modular/templating_local.gemfile
@@ -1,12 +1,12 @@
# frozen_string_literal: true
# Local path overrides for templating development.
-# Loaded by the associated non-local gemfile when SMORG_RB_DEV or KETTLE_RB_DEV
+# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_RB_DEV
# is not "false".
require 'nomono/bundler' unless defined?(Nomono)
-smorg_rb_local_gems = %w[
+structuredmerge_local_gems = %w[
tree_haver
ast-merge
ast-merge-git
@@ -43,7 +43,7 @@ kettle_rb_local_gems = %w[
kettle-dev kettle-test kettle-soup-cover kettle-drift
]
declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name)
-smorg_rb_local_gems_to_eval = smorg_rb_local_gems - %w[binary-merge] - declared_gems
+structuredmerge_local_gems_to_eval = structuredmerge_local_gems - %w[binary-merge] - declared_gems
kettle_rb_local_gems_to_eval = kettle_rb_local_gems - %w[binary-merge] - declared_gems
tslp_dev = ENV.fetch('TSLP_DEV', nil)
@@ -52,14 +52,14 @@ tslp_dev = ENV.fetch('TSLP_DEV', nil)
platform :mri do
gem 'tree_sitter_language_pack', path: tslp_dev unless tslp_dev.to_s.empty?
- if ENV.fetch('SMORG_RB_DEV', 'false').casecmp('false') != 0
+ if ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false') != 0
eval_nomono_gems(
- gems: smorg_rb_local_gems_to_eval,
- prefix: 'SMORG_RB',
- path_env: 'SMORG_RB_DEV',
+ gems: structuredmerge_local_gems_to_eval,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
vendored_gems_env: 'VENDORED_GEMS',
vendor_gem_dir_env: 'VENDOR_GEM_DIR',
- debug_env: 'SMORG_RB_DEBUG'
+ debug_env: 'STRUCTUREDMERGE_DEBUG'
)
end
diff --git a/gems/citrus-toml-merge/.gitattributes b/gems/citrus-toml-merge/.gitattributes
index 0ac65aaa7..35a3c7359 100644
--- a/gems/citrus-toml-merge/.gitattributes
+++ b/gems/citrus-toml-merge/.gitattributes
@@ -1,5 +1,5 @@
# <> do not edit below this line
-*.rb diff=smorg-ruby
+*.rb diff=smorg-rb
*.go diff=smorg-go
*.rs diff=smorg-rs
# <>
diff --git a/gems/citrus-toml-merge/.kettle-drift.lock b/gems/citrus-toml-merge/.kettle-drift.lock
index 1dad17e1d..aa01ca527 100644
--- a/gems/citrus-toml-merge/.kettle-drift.lock
+++ b/gems/citrus-toml-merge/.kettle-drift.lock
@@ -4,7 +4,13 @@
"file": "Gemfile",
"lines": [
79,
- 119
+ 119,
+ 159,
+ 199,
+ 239,
+ 279,
+ 319,
+ 359
]
}
],
@@ -13,7 +19,13 @@
"file": "Gemfile",
"lines": [
90,
- 130
+ 130,
+ 170,
+ 210,
+ 250,
+ 290,
+ 330,
+ 370
]
}
],
@@ -22,7 +34,13 @@
"file": "Gemfile",
"lines": [
80,
- 120
+ 120,
+ 160,
+ 200,
+ 240,
+ 280,
+ 320,
+ 360
]
}
],
@@ -31,7 +49,13 @@
"file": "Gemfile",
"lines": [
92,
- 132
+ 132,
+ 172,
+ 212,
+ 252,
+ 292,
+ 332,
+ 372
]
}
],
@@ -40,7 +64,13 @@
"file": "Gemfile",
"lines": [
95,
- 135
+ 135,
+ 175,
+ 215,
+ 255,
+ 295,
+ 335,
+ 375
]
}
],
@@ -49,7 +79,13 @@
"file": "Gemfile",
"lines": [
81,
- 121
+ 121,
+ 161,
+ 201,
+ 241,
+ 281,
+ 321,
+ 361
]
}
],
@@ -59,7 +95,13 @@
"lines": [
59,
99,
- 139
+ 139,
+ 179,
+ 219,
+ 259,
+ 299,
+ 339,
+ 379
]
}
],
@@ -68,7 +110,13 @@
"file": "Gemfile",
"lines": [
100,
- 140
+ 140,
+ 180,
+ 220,
+ 260,
+ 300,
+ 340,
+ 380
]
}
],
@@ -78,7 +126,13 @@
"lines": [
42,
86,
- 126
+ 126,
+ 166,
+ 206,
+ 246,
+ 286,
+ 326,
+ 366
]
}
],
@@ -87,7 +141,13 @@
"file": "Gemfile",
"lines": [
109,
- 149
+ 149,
+ 189,
+ 229,
+ 269,
+ 309,
+ 349,
+ 389
]
}
],
@@ -97,7 +157,13 @@
"lines": [
34,
78,
- 118
+ 118,
+ 158,
+ 198,
+ 238,
+ 278,
+ 318,
+ 358
]
}
],
@@ -107,7 +173,13 @@
"lines": [
68,
108,
- 148
+ 148,
+ 188,
+ 228,
+ 268,
+ 308,
+ 348,
+ 388
]
}
],
@@ -116,7 +188,13 @@
"file": "Gemfile",
"lines": [
84,
- 124
+ 124,
+ 164,
+ 204,
+ 244,
+ 284,
+ 324,
+ 364
]
}
],
@@ -126,7 +204,13 @@
"lines": [
47,
91,
- 131
+ 131,
+ 171,
+ 211,
+ 251,
+ 291,
+ 331,
+ 371
]
}
],
@@ -136,7 +220,13 @@
"lines": [
43,
87,
- 127
+ 127,
+ 167,
+ 207,
+ 247,
+ 287,
+ 327,
+ 367
]
}
],
@@ -145,7 +235,13 @@
"file": "Gemfile",
"lines": [
85,
- 125
+ 125,
+ 165,
+ 205,
+ 245,
+ 285,
+ 325,
+ 365
]
}
],
@@ -154,7 +250,13 @@
"file": "Gemfile",
"lines": [
102,
- 142
+ 142,
+ 182,
+ 222,
+ 262,
+ 302,
+ 342,
+ 382
]
}
],
@@ -163,7 +265,13 @@
"file": "Gemfile",
"lines": [
101,
- 141
+ 141,
+ 181,
+ 221,
+ 261,
+ 301,
+ 341,
+ 381
]
}
],
@@ -172,7 +280,13 @@
"file": "Gemfile",
"lines": [
96,
- 136
+ 136,
+ 176,
+ 216,
+ 256,
+ 296,
+ 336,
+ 376
]
}
],
@@ -181,7 +295,13 @@
"file": "Gemfile",
"lines": [
105,
- 145
+ 145,
+ 185,
+ 225,
+ 265,
+ 305,
+ 345,
+ 385
]
}
],
diff --git a/gems/citrus-toml-merge/.rubocop_gradual.lock b/gems/citrus-toml-merge/.rubocop_gradual.lock
index 4af8d888b..6289f37c0 100644
--- a/gems/citrus-toml-merge/.rubocop_gradual.lock
+++ b/gems/citrus-toml-merge/.rubocop_gradual.lock
@@ -82,15 +82,19 @@
"lib/citrus-toml-merge.rb:1706359962": [
[1, 1, 0, "Naming/FileName: The name of this source file (`citrus-toml-merge.rb`) should use snake_case.", 5381]
],
- "lib/citrus/toml/merge.rb:4234713312": [
+ "lib/citrus/toml/merge.rb:4256403494": [
[11, 5, 12, "Style/Documentation: Missing top-level documentation comment for `module Citrus::Toml::Merge`.", 2866359175],
+ [11, 5, 4979, "Metrics/ModuleLength: Module has too many lines. [104/100]", 3343629788],
[12, 7, 11, "Style/ModuleFunction: Use `module_function` instead of `extend self`.", 1210897631],
- [92, 7, 17, "Style/Documentation: Missing top-level documentation comment for `class Citrus::Toml::Merge::SmartMerger`.", 497427992]
+ [76, 7, 1663, "Metrics/AbcSize: Assignment Branch Condition size for `merge_toml` is too high. [<7, 21, 8> 23.54/17]", 3550313116],
+ [76, 7, 1663, "Metrics/MethodLength: Method has too many lines. [27/10]", 3550313116],
+ [139, 7, 17, "Style/Documentation: Missing top-level documentation comment for `class Citrus::Toml::Merge::SmartMerger`.", 497427992]
],
- "spec/fixtures_integration_spec.rb:673344638": [
- [3, 1, 5553, "Metrics/BlockLength: Block has too many lines. [122/25]", 3226186319],
+ "spec/fixtures_integration_spec.rb:239117620": [
+ [3, 1, 7226, "Metrics/BlockLength: Block has too many lines. [159/25]", 3966119837],
[26, 3, 1318, "Metrics/BlockLength: Block has too many lines. [34/25]", 4255752267],
- [64, 3, 1804, "Metrics/BlockLength: Block has too many lines. [28/25]", 1255882875],
- [106, 3, 1419, "Metrics/BlockLength: Block has too many lines. [29/25]", 944475815]
+ [64, 3, 2344, "Metrics/BlockLength: Block has too many lines. [36/25]", 228336363],
+ [114, 3, 1129, "Metrics/BlockLength: Block has too many lines. [27/25]", 2358141919],
+ [152, 3, 1419, "Metrics/BlockLength: Block has too many lines. [29/25]", 944475815]
]
}
diff --git a/gems/citrus-toml-merge/Gemfile b/gems/citrus-toml-merge/Gemfile
index cf47e3d6b..aae6101f4 100644
--- a/gems/citrus-toml-merge/Gemfile
+++ b/gems/citrus-toml-merge/Gemfile
@@ -151,7 +151,247 @@ if direct_sibling_gems.any? &&
end
end
-# Use the StructuredMerge TLSP branch until upstream ships Ruby 4-compatible gem metadata.
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+if direct_sibling_gems.any? &&
+ (direct_sibling_local ||
+ ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)
+ direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')
+ direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)
+ begin
+ nomono_activation_requirements = nomono_requirements
+ nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)
+ if File.file?(nomono_lockfile)
+ nomono_locked_spec = Bundler::LockfileParser
+ .new(Bundler.read_file(nomono_lockfile))
+ .specs
+ .find { |spec| spec.name == 'nomono' }
+ nomono_locked = nomono_locked_spec &&
+ Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
+ nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked
+ end
+ Kernel.send(:gem, 'nomono', *nomono_activation_requirements)
+ require 'nomono/bundler'
+ ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local
+
+ eval_nomono_gems(
+ gems: direct_sibling_gems,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
+ root: %w[src my structuredmerge]
+ )
+ rescue LoadError
+ warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'
+ ensure
+ if direct_sibling_templating && !direct_sibling_local
+ if direct_sibling_dev_was_set
+ ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original
+ else
+ ENV.delete('STRUCTUREDMERGE_DEV')
+ end
+ end
+ end
+end
+
+# Use the StructuredMerge TSLP branch until upstream ships Ruby 4-compatible gem metadata.
tslp_dev = ENV.fetch('TSLP_DEV', nil)
tslp_declared_by_templating =
ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? && !tslp_dev.to_s.empty?
@@ -160,7 +400,7 @@ unless tslp_declared_by_templating
gem(
'tree_sitter_language_pack',
git: 'https://github.com/structuredmerge/tree-sitter-language-pack.git',
- branch: 'fix/ruby-4-installs',
+ branch: 'fix/ruby-parser-api-methods',
glob: 'packages/ruby/*.gemspec'
)
else
@@ -168,7 +408,7 @@ unless tslp_declared_by_templating
end
end
-# Templating (env-switched: SMORG_RB_DEV=/path/to/structuredmerge/ruby/gems for local paths)
+# Templating (env-switched: STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local paths)
eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?
# Debugging
diff --git a/gems/citrus-toml-merge/Gemfile.lock b/gems/citrus-toml-merge/Gemfile.lock
index 3daa583e7..417371cb2 100644
--- a/gems/citrus-toml-merge/Gemfile.lock
+++ b/gems/citrus-toml-merge/Gemfile.lock
@@ -1,13 +1,3 @@
-GIT
- remote: https://github.com/structuredmerge/tree-sitter-language-pack.git
- revision: dcc959b12d02d6e379abf1c8ac536a852d1b8416
- branch: fix/ruby-4-installs
- glob: packages/ruby/*.gemspec
- specs:
- tree_sitter_language_pack (1.12.5)
- rb_sys (>= 0.9, < 0.9.128)
- sorbet-runtime (~> 0.5)
-
PATH
remote: .
specs:
@@ -16,22 +6,283 @@ PATH
toml-rb (~> 4.1)
version_gem (~> 1.1, >= 1.1.9)
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-markdown-markly
+ specs:
+ ast-crispr-markdown-markly (7.1.0)
+ ast-crispr (= 7.1.0)
+ markly-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-ruby-prism
+ specs:
+ ast-crispr-ruby-prism (7.1.0)
+ ast-crispr (= 7.1.0)
+ prism-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr
+ specs:
+ ast-crispr (7.1.0)
+ ast-merge (= 7.1.0)
+ service_actor (~> 3.9)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge-git
+ specs:
+ ast-merge-git (7.1.0)
+ ast-merge (= 7.1.0)
+ json-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge
+ specs:
+ ast-merge (7.1.0)
+ benchmark
+ token-resolver (~> 2.0, >= 2.0.4)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-template
+ specs:
+ ast-template (7.1.0)
+ ast-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/bash-merge
+ specs:
+ bash-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.14)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/binary-merge
+ specs:
+ binary-merge (7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/commonmarker-merge
+ specs:
+ commonmarker-merge (7.1.0)
+ commonmarker (~> 2.2)
+ markdown-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/dotenv-merge
+ specs:
+ dotenv-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.14)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/go-merge
+ specs:
+ go-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/json-merge
+ specs:
+ json-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/kettle-jem
+ specs:
+ kettle-jem (7.1.0)
+ addressable (>= 2.8, < 3)
+ ast-crispr-markdown-markly (= 7.1.0)
+ ast-crispr-ruby-prism (= 7.1.0)
+ ast-merge (= 7.1.0)
+ bash-merge (= 7.1.0)
+ citrus-toml-merge (= 7.1.0)
+ commonmarker-merge (= 7.1.0)
+ dotenv-merge (= 7.1.0)
+ json-merge (= 7.1.0)
+ kettle-dev (~> 2.3, >= 2.3.5)
+ kettle-rb (~> 0.1, >= 0.1.4)
+ kramdown-merge (= 7.1.0)
+ markdown-merge (= 7.1.0)
+ markly-merge (= 7.1.0)
+ prism-merge (= 7.1.0)
+ psych-merge (= 7.1.0)
+ rbs (>= 3.10)
+ rbs-merge (= 7.1.0)
+ ruby-merge (= 7.1.0)
+ token-resolver (~> 2.0, >= 2.0.4)
+ toml-merge (= 7.1.0)
+ toml-rb (~> 4.2)
+ tree_haver (= 7.1.0)
+ yaml-merge (= 7.1.0)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/kramdown-merge
+ specs:
+ kramdown-merge (7.1.0)
+ kramdown (~> 2.5)
+ markdown-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/markdown-merge
+ specs:
+ markdown-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/markly-merge
+ specs:
+ markly-merge (7.1.0)
+ markdown-merge (= 7.1.0)
+ markly (~> 0.9)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/parslet-toml-merge
+ specs:
+ parslet-toml-merge (7.1.0)
+ toml (~> 0.3)
+ toml-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/plain-merge
+ specs:
+ plain-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/prism-merge
+ specs:
+ prism-merge (7.1.0)
+ prism (~> 1.6)
+ ruby-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/psych-merge
+ specs:
+ psych-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+ yaml-merge (= 7.1.0)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/rbs-merge
+ specs:
+ rbs-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ rbs (>= 3.10)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.14)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/ruby-merge
+ specs:
+ ruby-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/rust-merge
+ specs:
+ rust-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/smorg-rb
+ specs:
+ smorg-rb (7.1.0)
+ ast-merge (= 7.1.0)
+ ast-merge-git (= 7.1.0)
+ go-merge (= 7.1.0)
+ json-merge (= 7.1.0)
+ kettle-jem (= 7.1.0)
+ markly-merge (= 7.1.0)
+ plain-merge (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/toml-merge
+ specs:
+ toml-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/tree_haver
+ specs:
+ tree_haver (7.1.0)
+ citrus (~> 3.0)
+ parslet (~> 2.0)
+ tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/typescript-merge
+ specs:
+ typescript-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/yaml-merge
+ specs:
+ yaml-merge (7.1.0)
+ ast-merge (= 7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /home/pboling/src/my/structuredmerge/ruby/gems/zip-merge
+ specs:
+ zip-merge (7.1.0)
+ tree_haver (= 7.1.0)
+ version_gem (~> 1.1, >= 1.1.9)
+
+PATH
+ remote: /var/home/pboling/src/my/structuredmerge/vendor/tree-sitter-language-pack/packages/ruby
+ specs:
+ tree_sitter_language_pack (1.12.5)
+ rb_sys (>= 0.9, < 0.9.128)
+ sorbet-runtime (~> 0.5)
+
GEM
remote: https://gem.coop/
specs:
addressable (2.9.0)
public_suffix (>= 2.0.2, < 8.0)
ansi (1.6.0)
- appraisal2 (3.1.4)
+ appraisal2 (3.2.0)
bundler (>= 1.17.3)
rake (>= 10)
thor (>= 0.14)
ast (2.4.3)
- ast-merge (7.1.0)
- benchmark
- token-resolver (~> 2.0, >= 2.0.4)
- tree_haver (= 7.1.0)
- version_gem (~> 1.1, >= 1.1.9)
backports (3.25.3)
benchmark (0.5.0)
bigdecimal (4.1.2)
@@ -40,6 +291,12 @@ GEM
thor (~> 1.0)
citrus (3.0.2)
cmdparse (3.0.7)
+ commonmarker (2.9.0-aarch64-linux)
+ commonmarker (2.9.0-aarch64-linux-musl)
+ commonmarker (2.9.0-arm64-darwin)
+ commonmarker (2.9.0-x86_64-darwin)
+ commonmarker (2.9.0-x86_64-linux)
+ commonmarker (2.9.0-x86_64-linux-musl)
concurrent-ruby (1.3.7)
date (3.5.1)
debug (1.11.1)
@@ -98,11 +355,13 @@ GEM
rdoc (>= 4.0.0)
reline (>= 0.4.2)
json (2.21.1)
- kettle-dev (2.3.6)
+ kettle-dev (2.3.7)
emoji_regex (>= 15.0)
kettle-rb (~> 0.1, >= 0.1.2)
kettle-test (~> 2.0, >= 2.0.4)
ruby-progressbar (~> 1.13)
+ kettle-drift (1.0.5)
+ version_gem (~> 1.1, >= 1.1.13)
kettle-rb (0.1.4)
kettle-soup-cover (1.1.3)
simplecov (~> 0.22)
@@ -131,6 +390,7 @@ GEM
language_server-protocol (3.17.0.6)
lint_roller (1.1.0)
logger (1.7.0)
+ markly (0.16.0)
mutex_m (0.3.0)
nokogiri (1.19.4-aarch64-linux-gnu)
racc (~> 1.4)
@@ -270,6 +530,8 @@ GEM
ruby-progressbar (1.13.0)
ruby_engine (2.0.3)
ruby_version (1.0.3)
+ service_actor (3.9.4)
+ zeitwerk (>= 1.0)
silent_stream (1.0.12)
logger (~> 1.2)
version_gem (>= 1.1.8, < 3)
@@ -322,20 +584,13 @@ GEM
token-resolver (2.0.4)
parslet (~> 2.0)
version_gem (~> 1.1, >= 1.1.13)
- toml-merge (7.1.0)
- ast-merge (= 7.1.0)
- tree_haver (= 7.1.0)
- version_gem (~> 1.1, >= 1.1.9)
+ toml (0.3.0)
+ parslet (>= 1.8.0, < 3.0.0)
toml-rb (4.2.0)
citrus (~> 3.0, > 3.0)
racc (~> 1.7)
- tree_haver (7.1.0)
- citrus (~> 3.0)
- parslet (~> 2.0)
- tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0)
- version_gem (~> 1.1, >= 1.1.9)
tsort (0.2.0)
- turbo_tests2 (3.1.14)
+ turbo_tests2 (3.2.0)
parallel_tests (>= 3.3.0, < 6)
rspec (>= 3.10)
version_gem (~> 1.1, >= 1.1.14)
@@ -360,7 +615,7 @@ GEM
yard
yard-relative_markdown_links (0.6.0)
nokogiri (>= 1.14.3, < 2)
- yard-timekeeper (0.2.3)
+ yard-timekeeper (0.2.4)
version_gem (~> 1.1, >= 1.1.13)
yard-yaml (0.2.3)
version_gem (~> 1.1, >= 1.1.13)
@@ -380,23 +635,45 @@ PLATFORMS
DEPENDENCIES
addressable (>= 2.8, < 3)
appraisal2 (~> 3.0, >= 3.0.6)
+ ast-crispr!
+ ast-crispr-markdown-markly!
+ ast-crispr-ruby-prism!
+ ast-merge!
+ ast-merge-git!
+ ast-template!
+ bash-merge!
benchmark (~> 0.5, >= 0.5.0)
+ binary-merge!
bundler-audit (~> 0.9.3)
citrus-toml-merge!
+ commonmarker-merge!
debug (>= 1.1)
+ dotenv-merge!
erb (~> 6.0, >= 6.0.4)
gem_bench (~> 2.0, >= 2.0.5)
gitmoji-regex (~> 2.0, >= 2.0.0)
+ go-merge!
irb (~> 1.17)
+ json-merge!
kettle-dev (~> 2.0, >= 2.2.25)
+ kettle-drift (~> 1.0, >= 1.0.5)
+ kettle-jem!
kettle-soup-cover (~> 1.0, >= 1.1.3)
kettle-test (~> 2.0, >= 2.0.9)
kramdown (~> 2.5, >= 2.5.1)
+ kramdown-merge!
kramdown-parser-gfm (~> 1.1)
+ markdown-merge!
+ markly-merge!
mutex_m (~> 0.2)
nomono (~> 1.0, >= 1.0.8)
+ parslet-toml-merge!
+ plain-merge!
+ prism-merge!
+ psych-merge!
rake (~> 13.0)
rbs (>= 3.0)
+ rbs-merge!
rdoc (~> 6.11)
reek (~> 6.5)
require_bench (~> 1.0, >= 1.0.4)
@@ -405,32 +682,54 @@ DEPENDENCIES
rubocop-packaging (~> 0.6, >= 0.6.0)
rubocop-rspec (~> 3.6)
rubocop-ruby3_2 (~> 3.0.0)
+ ruby-merge!
ruby-progressbar (~> 1.13)
+ rust-merge!
+ smorg-rb!
standard (>= 1.50)
stone_checksums (~> 1.0, >= 1.0.3)
stringio (>= 3.0)
+ toml-merge!
+ tree_haver!
tree_sitter_language_pack!
+ typescript-merge!
yaml-converter (~> 0.1)
+ yaml-merge!
yard (~> 0.9, >= 0.9.44)
yard-fence (~> 0.9, >= 0.9.1)
yard-junk (~> 0.1, >= 0.1.0)
yard-relative_markdown_links (~> 0.6)
yard-timekeeper (~> 0.1)
yard-yaml (~> 0.1, >= 0.1.2)
+ zip-merge!
CHECKSUMS
addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af
ansi (1.6.0) sha256=ac9ea0c0ea8d32fb4e271348e609963ac78882f34b73836c2a02b3622e666658
- appraisal2 (3.1.4) sha256=f88c27e600adf4bd5bf06c0ab0afd1de6ce4361497760ce35e86e782036286f4
+ appraisal2 (3.2.0) sha256=ccd0b767ac4060cd7af6d16747459b6990f49c39c7b4fb1f7d1146b1e97c492f
ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
+ ast-crispr (7.1.0)
+ ast-crispr-markdown-markly (7.1.0)
+ ast-crispr-ruby-prism (7.1.0)
ast-merge (7.1.0)
+ ast-merge-git (7.1.0)
+ ast-template (7.1.0)
backports (3.25.3) sha256=94298d32dc3c40ca15633b54e282780b49e2db0c045f602ea1907e4f63a17235
+ bash-merge (7.1.0)
benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c
bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd
+ binary-merge (7.1.0)
bundler-audit (0.9.3) sha256=81c8766c71e47d0d28a0f98c7eed028539f21a6ea3cd8f685eb6f42333c9b4e9
citrus (3.0.2) sha256=4ec2412fc389ad186735f4baee1460f7900a8e130ffe3f216b30d4f9c684f650
citrus-toml-merge (7.1.0)
cmdparse (3.0.7) sha256=f7c5cace10bec6abf853370ae095e4b97a84ed9d847b3fb38f41cc4fbc950739
+ commonmarker (2.9.0-aarch64-linux) sha256=e2b4aadb9a2cfa4e206582641ce3a49465549ac1ed4c289fdd63b78d8f24579c
+ commonmarker (2.9.0-aarch64-linux-musl) sha256=1cf4d2821f2a7e64945f1ed7c4eeced586fdb27ea7fe7337788802cf8f57cfca
+ commonmarker (2.9.0-arm64-darwin) sha256=1748dbfa4f5813b0d2a14bb4bbfa65a4ec293aa1c825016d60029ee0e132b046
+ commonmarker (2.9.0-x86_64-darwin) sha256=0a9914ccfd2f5d2a59c7bd0dda4fe90eb084cf513b477e499008e09ec9d6edd6
+ commonmarker (2.9.0-x86_64-linux) sha256=8cfe92970eef585a19ddf6613224b91cab64d6029834661bda801f877c9c7f43
+ commonmarker (2.9.0-x86_64-linux-musl) sha256=293921398b839f79ceaf55010e061357e34f053822c3b003cd0be6686176335e
+ commonmarker-merge (7.1.0)
concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0
date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0
debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6
@@ -438,6 +737,7 @@ CHECKSUMS
diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962
diffy (3.4.4) sha256=79384ab5ca82d0e115b2771f0961e27c164c456074bd2ec46b637ebf7b6e47e3
docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e
+ dotenv-merge (7.1.0)
dry-configurable (1.4.0) sha256=e35d1b5f3c081753ef361f564919db79000f32cfa6f20ee3a3ba5921b41b73ce
dry-core (1.2.0) sha256=0cc5a7da88df397f153947eeeae42e876e999c1e30900f3c536fb173854e96a1
dry-inflector (1.3.1) sha256=7fb0c2bb04f67638f25c52e7ba39ab435d922a3a5c3cd196120f63accb682dcc
@@ -450,19 +750,27 @@ CHECKSUMS
gem_bench (2.0.5) sha256=0dc0fb44a5a5eb7b2f5c1c68a5b0164d72007132822c012bac3abe976b199ead
geom2d (0.4.1) sha256=ea0998ea90c4f2752e24fe13d85a4f89bee689d151316140ebcc6369bf634ed9
gitmoji-regex (2.0.4) sha256=01410d3217940bd0e7b2299ec805245afe8d0f06a5d6d38f623d63a63c0ac34f
+ go-merge (7.1.0)
hexapdf (1.9.1) sha256=2d1f6a3622e6bc2a70a707d4c3f3fa44f5552ecd9d899f6283abb07398a84884
io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc
irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3
json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583
- kettle-dev (2.3.6) sha256=955b01e8aca46438365332d1b4413f22cb58dabfeab5cba04d71237c53cc70ae
+ json-merge (7.1.0)
+ kettle-dev (2.3.7) sha256=eb370113cd030d03cbe2d33b31c99858951017e5ad21a17e9ed89dc3770028ee
+ kettle-drift (1.0.5) sha256=07094e80140a049164142820bdd327c30fcd855bb00697a0a430600a2b5144a2
+ kettle-jem (7.1.0)
kettle-rb (0.1.4) sha256=9cef7ce4f7021666b7222292f29051e51eaf042e8a5db11f3f4dd72f74243fc1
kettle-soup-cover (1.1.3) sha256=a373827da22a7131d093afd32945e5b7d7a10a01ebfdded8fd2cb8230d69c8ad
kettle-test (2.0.11) sha256=c710c90f7ab79d51f9452f0c09f5f90657e7a893f63583855c164d0b1b107ab2
kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa
+ kramdown-merge (7.1.0)
kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729
language_server-protocol (3.17.0.6) sha256=5ef2c0c138f8267e1bc631d3328347d354f96724b0af22f2c79516120443b7f0
lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87
logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
+ markdown-merge (7.1.0)
+ markly (0.16.0) sha256=6f70d79e385b1efc9e171f74c81628826259039fe6c778e03c3924c71dac5511
+ markly-merge (7.1.0)
mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751
nokogiri (1.19.4-aarch64-linux-gnu) sha256=1269fb644a6de405057a53dd5c762b1209b43ca7424f839454d3dbc677c31a8f
nokogiri (1.19.4-aarch64-linux-musl) sha256=35c65b9ce72b3bb03207bdbe7067915019dc18c1b9b59139684bd6690fdd01af
@@ -477,10 +785,14 @@ CHECKSUMS
parallel_tests (5.7.0) sha256=3f1762c46ca2c223b8af8ef877217f9d76974e191bfa934f2580b58bcf1d005c
parser (3.3.12.0) sha256=21a6d7f755d5a24dfbdc6e6b772e4e879a52e7631a88bc5a3a134606052c9828
parslet (2.0.0) sha256=d45130695d39b43d7e6a91f4d2ec66b388a8d822bae38de9b4de9a5fbde1f606
+ parslet-toml-merge (7.1.0)
+ plain-merge (7.1.0)
pp (0.6.4) sha256=dfcb0fce700c41456265922884f9fe195d7fbb0674a3578e6c0f69588e82b570
prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193
prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85
+ prism-merge (7.1.0)
psych (5.4.0) sha256=14f72d69a611af663d7d70e4a7b67d9eb1f3ae9f8d916b478961d5a0075ba5b7
+ psych-merge (7.1.0)
public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623
racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
@@ -488,6 +800,7 @@ CHECKSUMS
rake-compiler-dock (1.12.0) sha256=f13205c2738f3d2053afcd03491a9e4541b22a59a0bfc53fc8bc883bd8188023
rb_sys (0.9.127) sha256=e9f90df3bb0577472d26d96127d5b5774b98f44de881e7d36aeefd28d6337847
rbs (4.0.3) sha256=5a7bf70e2628549d9a1f44eae447b2cfe55968a9c60cfff52693a4bdcc020e14
+ rbs-merge (7.1.0)
rdoc (6.17.0) sha256=0f50d4e568fc98195f9bb155a9e8dff6c7feabfb515fb22ef6df1d12ad5a02b7
reek (6.5.0) sha256=d26d3a492773b2bbc228888067a21afe33ac07954a17dbd64cdeae42c4c69be1
regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb
@@ -515,9 +828,12 @@ CHECKSUMS
rubocop-rspec (3.10.2) sha256=0b3e2ecc592cd10ecbf0095bb58d1e357905276e069643523cc19eb7495f65e2
rubocop-ruby3_2 (3.0.7) sha256=f53dd6d286fb05186214fc6ec116783e7f837030918e8931c05de773e98f8466
rubocop-thread_safety (0.7.3) sha256=067cdd52fbf5deffc18995437e45b5194236eaff4f71de3375a1f6052e48f431
+ ruby-merge (7.1.0)
ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
ruby_engine (2.0.3) sha256=ca2ae7def8cfcdc2bfb6a186d36d5d59c8b403245dc0256c3802b767fa278aaa
ruby_version (1.0.3) sha256=5930f9950746b7e6c973184398ee364ee7440b170fef7922b9f5cdf317f1ccb5
+ rust-merge (7.1.0)
+ service_actor (3.9.4) sha256=e63b523630b9a7e62959b2a90113b08d2565b5de9c148557b281ef847c9539ce
silent_stream (1.0.12) sha256=377c43aa10033fe90c33b39ea8cd97d79f2d1c4856df598efc56f3091f3ae782
simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5
simplecov-cobertura (3.2.0) sha256=70d702658677fcb20e5aceb6915ccf8bc62ff2ccd38b62b3ad5c9db5c0888740
@@ -526,6 +842,7 @@ CHECKSUMS
simplecov-lcov (0.9.0) sha256=7a77a31e200a595ed4b0249493056efd0c920601f53d2ef135ca34ee796346cd
simplecov-rcov (0.3.7) sha256=372f50bf6df6b6350b7d0c840f2f8bdabe021861a43c26877b747c9ac96139fc
simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428
+ smorg-rb (7.1.0)
sorbet-runtime (0.6.13342) sha256=dbeb9892597f593ed2b29e38018912787f6c4e0c4b736d8af0d6bd3c63bde3c3
standard (1.56.0) sha256=ae2af4d9669589162ac69ed5ef59dcf9f346d4afc81f7e62b84339310dfcb787
standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b
@@ -539,23 +856,27 @@ CHECKSUMS
timecop (0.9.11) sha256=41284dc6e5041f2184f781ace766f942108c842f8d8c1386a26e6343decc7542
timecop-rspec (1.0.3) sha256=005f14841bb606dcaefb060e321b5388e2e59537742bee8b3a9a9a40e598fab9
token-resolver (2.0.4) sha256=33b926958f504525bba3ed511ab66fbcbf8ef30390815e931436b30f27ffcad0
+ toml (0.3.0) sha256=0a91d0f76a9036e84e44f95693b12f58d358c1df3ac8e3b5271f2056ecc6e4b9
toml-merge (7.1.0)
toml-rb (4.2.0) sha256=10a48c91613e20cf63483a7a776767dfb3cd7d70e9327c0237443da601e13776
tree_haver (7.1.0)
tree_sitter_language_pack (1.12.5)
tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f
- turbo_tests2 (3.1.14) sha256=cc29d5b36bdbba67a83eee09a9546880d0926edfbbe50d99633fc0b5763ee94c
+ turbo_tests2 (3.2.0) sha256=8b35421548399d1923567b177970f42671c65695b93cdd134d78fbcbab85dff0
+ typescript-merge (7.1.0)
unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42
unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f
version_gem (1.1.14) sha256=6b7306c7e9416d06067561981ab3444e2cecb844f26cc325ae3c27b44cf85613
yaml-converter (0.2.3) sha256=d35e69e547610d9e347672cc277fcb7d71dff3c53a942e66f82b1c64022ada72
+ yaml-merge (7.1.0)
yard (0.9.45) sha256=52e211493f7cb8a3ebf7e104a25a1e73937a3103092545d34cb88fafebb3dc51
yard-fence (0.9.6) sha256=3d1dbf4e3df462ac78b8bd2e01cf740a2de20168387c929aca31a0bcee490659
yard-junk (0.1.0) sha256=e85fe2ec1afa47313decd333447b53458cb1ed49b510b70015fdc3041a94bcdd
yard-relative_markdown_links (0.6.0) sha256=3e5ffa85cbad9bac70bee5421774b190fb25d3bdf489323a5b3534f647d1a70e
- yard-timekeeper (0.2.3) sha256=849a3e74a0484b1e0b5209cf86823e418b3091e21f4f143c141d38e1cc262034
+ yard-timekeeper (0.2.4) sha256=62f8d001d737c6e2ac688e7b37386f958dceb0f6aff9c909575e1bec8d20775a
yard-yaml (0.2.3) sha256=fe5fef18819e1cbd05bb8f1b9e1baad6bf70c28125eb75b57bbf6397b0831812
zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12
+ zip-merge (7.1.0)
zlib (3.2.3) sha256=5bd316698b32f31a64ab910a8b6c282442ca1626a81bbd6a1674e8522e319c20
BUNDLED WITH
diff --git a/gems/citrus-toml-merge/gemfiles/modular/templating.gemfile b/gems/citrus-toml-merge/gemfiles/modular/templating.gemfile
index 0d1c9bcf4..e3c24e6b7 100644
--- a/gems/citrus-toml-merge/gemfiles/modular/templating.gemfile
+++ b/gems/citrus-toml-merge/gemfiles/modular/templating.gemfile
@@ -1,9 +1,9 @@
# frozen_string_literal: true
-smorg_remote = ENV.fetch('SMORG_RB_DEV', 'false').casecmp('false').zero?
+structuredmerge_remote = ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false').zero?
kettle_remote = ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero?
-if smorg_remote
+if structuredmerge_remote
# Merge recipes and parser dependencies for released installs.
gem 'kettle-jem', '>= 7.0'
end
@@ -13,10 +13,10 @@ if kettle_remote
gem 'kettle-drift', '~> 1.0', '>= 1.0.5', require: false
end
-# Set SMORG_RB_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies.
+# Set STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies.
# When false (default / CI), released kettle-jem brings merge gems and parser dependencies.
# Local path overrides bring the same dependencies from sibling gemspecs.
#
# Set KETTLE_RB_DEV=/path/to/kettle-rb for local development with Kettle plugin gems.
# When false (default / CI), released Kettle plugin gems are used.
-eval_gemfile 'templating_local.gemfile' unless smorg_remote && kettle_remote
+eval_gemfile 'templating_local.gemfile' unless structuredmerge_remote && kettle_remote
diff --git a/gems/citrus-toml-merge/gemfiles/modular/templating_local.gemfile b/gems/citrus-toml-merge/gemfiles/modular/templating_local.gemfile
index ead39ecc9..261a205a9 100644
--- a/gems/citrus-toml-merge/gemfiles/modular/templating_local.gemfile
+++ b/gems/citrus-toml-merge/gemfiles/modular/templating_local.gemfile
@@ -1,12 +1,12 @@
# frozen_string_literal: true
# Local path overrides for templating development.
-# Loaded by the associated non-local gemfile when SMORG_RB_DEV or KETTLE_RB_DEV
+# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_RB_DEV
# is not "false".
require 'nomono/bundler' unless defined?(Nomono)
-smorg_rb_local_gems = %w[
+structuredmerge_local_gems = %w[
tree_haver
ast-merge
ast-merge-git
@@ -43,7 +43,7 @@ kettle_rb_local_gems = %w[
kettle-dev kettle-test kettle-soup-cover kettle-drift
]
declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name)
-smorg_rb_local_gems_to_eval = smorg_rb_local_gems - %w[citrus-toml-merge] - declared_gems
+structuredmerge_local_gems_to_eval = structuredmerge_local_gems - %w[citrus-toml-merge] - declared_gems
kettle_rb_local_gems_to_eval = kettle_rb_local_gems - %w[citrus-toml-merge] - declared_gems
tslp_dev = ENV.fetch('TSLP_DEV', nil)
@@ -52,14 +52,14 @@ tslp_dev = ENV.fetch('TSLP_DEV', nil)
platform :mri do
gem 'tree_sitter_language_pack', path: tslp_dev unless tslp_dev.to_s.empty?
- if ENV.fetch('SMORG_RB_DEV', 'false').casecmp('false') != 0
+ if ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false') != 0
eval_nomono_gems(
- gems: smorg_rb_local_gems_to_eval,
- prefix: 'SMORG_RB',
- path_env: 'SMORG_RB_DEV',
+ gems: structuredmerge_local_gems_to_eval,
+ prefix: 'STRUCTUREDMERGE',
+ path_env: 'STRUCTUREDMERGE_DEV',
vendored_gems_env: 'VENDORED_GEMS',
vendor_gem_dir_env: 'VENDOR_GEM_DIR',
- debug_env: 'SMORG_RB_DEBUG'
+ debug_env: 'STRUCTUREDMERGE_DEBUG'
)
end
diff --git a/gems/citrus-toml-merge/lib/citrus/toml/merge.rb b/gems/citrus-toml-merge/lib/citrus/toml/merge.rb
index fd356d516..154717fe2 100644
--- a/gems/citrus-toml-merge/lib/citrus/toml/merge.rb
+++ b/gems/citrus-toml-merge/lib/citrus/toml/merge.rb
@@ -13,6 +13,21 @@ module Merge
PACKAGE_NAME = 'citrus-toml-merge'
BACKEND = TreeHaver::CITRUS_BACKEND
+ BACKEND_REGISTRY = Struct.new(:registered, :mutex).new(false, Mutex.new)
+
+ def register_backend!
+ BACKEND_REGISTRY.mutex.synchronize do
+ return if BACKEND_REGISTRY.registered
+
+ TreeHaver.register_language(
+ :toml,
+ grammar_module: TomlRB::Document,
+ gem_name: 'toml-rb'
+ )
+
+ BACKEND_REGISTRY.registered = true
+ end
+ end
def toml_feature_profile
::Toml::Merge.toml_feature_profile
@@ -51,10 +66,7 @@ def parse_toml(source, dialect, backend: nil)
return unsupported_feature_result("Unsupported TOML backend #{requested}.") unless requested == BACKEND.id
return unsupported_feature_result("Unsupported TOML dialect #{dialect}.") unless dialect == 'toml'
- syntax_result = TreeHaver.parse_with_citrus(source, grammar_module: TomlRB::Document)
- return { ok: false, diagnostics: syntax_result[:diagnostics], policies: [] } unless syntax_result[:ok]
-
- ::Toml::Merge.analyze_toml_source(source, dialect)
+ TreeHaver.with_backend(BACKEND.id) { ::Toml::Merge.analyze_toml_source(source, dialect) }
end
def match_toml_owners(template, destination)
@@ -65,9 +77,35 @@ def merge_toml(template_source, destination_source, dialect, backend: nil)
requested = backend.to_s.empty? ? BACKEND.id : backend.to_s
return unsupported_feature_result("Unsupported TOML backend #{requested}.") unless requested == BACKEND.id
- ::Toml::Merge.merge_toml_with_parser(template_source, destination_source, dialect) do |source, parse_dialect|
- parse_toml(source, parse_dialect, backend: BACKEND.id)
- end
+ return unsupported_feature_result("Unsupported TOML dialect #{dialect}.") unless dialect == 'toml'
+
+ template_parse = parse_toml(template_source, dialect, backend: BACKEND.id)
+ return provider_parse_failure(:template_parse_error, template_parse) unless template_parse[:ok]
+
+ destination_parse = parse_toml(destination_source, dialect, backend: BACKEND.id)
+ return provider_parse_failure(:destination_parse_error, destination_parse) unless destination_parse[:ok]
+
+ output = SmartMerger.new(
+ template_source,
+ destination_source,
+ preference: :destination,
+ add_template_only_nodes: true
+ ).merge_result.to_toml
+
+ {
+ ok: true,
+ diagnostics: [],
+ output: output,
+ policies: [::Toml::Merge::DESTINATION_WINS_ARRAY_POLICY]
+ }
+ rescue ::Toml::Merge::TemplateParseError => e
+ { ok: false, diagnostics: [{ severity: 'error', category: 'template_parse_error', message: e.message }],
+ policies: [] }
+ rescue ::Toml::Merge::DestinationParseError => e
+ { ok: false, diagnostics: [{ severity: 'error', category: 'destination_parse_error', message: e.message }],
+ policies: [] }
+ rescue StandardError => e
+ { ok: false, diagnostics: [{ severity: 'error', category: 'merge_error', message: e.message }], policies: [] }
end
def unsupported_feature_result(message)
@@ -78,15 +116,24 @@ def unsupported_feature_result(message)
}
end
+ def provider_parse_failure(category, parse_result)
+ diagnostics = Array(parse_result[:diagnostics])
+ message = diagnostics.map { |diagnostic| diagnostic[:message] || diagnostic['message'] }.compact.join('; ')
+ message = 'provider parse failed' if message.empty?
+ { ok: false, diagnostics: [{ severity: 'error', category: category.to_s, message: message }], policies: [] }
+ end
+
module_function(
:toml_feature_profile,
+ :register_backend!,
:available_toml_backends,
:toml_backend_feature_profile,
:toml_plan_context,
:parse_toml,
:match_toml_owners,
:merge_toml,
- :unsupported_feature_result
+ :unsupported_feature_result,
+ :provider_parse_failure
)
class SmartMerger < ::Toml::Merge::SmartMerger
@@ -102,6 +149,8 @@ def merge_result
end
end
+Citrus::Toml::Merge.register_backend!
+
Citrus::Toml::Merge::Version.class_eval do
extend VersionGem::Basic
end
diff --git a/gems/citrus-toml-merge/results/test_results.html b/gems/citrus-toml-merge/results/test_results.html
new file mode 100644
index 000000000..0480bcd66
--- /dev/null
+++ b/gems/citrus-toml-merge/results/test_results.html
@@ -0,0 +1,312 @@
+
+
+
+ RSpec results
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ - Citrus::Toml::Merge
+
+ - exposes the TOML family through the Citrus provider backend0.00299s
+
+ - conforms to the shared TOML analysis, matching, and merge fixtures0.14349s
+
+ - rejects unsupported provider backend overrides0.00077s
+
+ - conforms to the provider named-suite plan and manifest-report fixtures0.00117s
+
+ - merges comment-free arrays of tables through the Citrus parser provider0.13290s
+
+
+
+
+
+
+
+
+ipt">moveProgressBar('100.0');
+ is idempotent (merging again produces same result)0.01383s
+
+
+
+
+
+
+