Skip to content
This repository was archived by the owner on Jul 19, 2026. It is now read-only.

Commit d6cd4bd

Browse files
committed
✨ Toml::Merge::Emitter
### Added - **Emitter** - based on `Ast::Merge::EmitterBase` - autoloaded via `autoload :Emitter, "toml/merge/emitter"` ### Removed - **Obsolete Tests**: Removed 3 obsolete tests - Tests for `add_node_to_result` and `merge_matched_nodes` methods - These methods don't exist in the `:batch` strategy (ConflictResolver now uses Emitter) - Tests were for old `:node` strategy pattern
1 parent 7d4b507 commit d6cd4bd

16 files changed

Lines changed: 217 additions & 1709 deletions

.rubocop_rspec.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ RSpec/DescribeClass:
3131

3232
RSpec/MultipleMemoizedHelpers:
3333
Enabled: false
34+
3435
RSpec/SpecFilePathSuffix:
3536
Exclude:
3637
- 'spec/README.md'
@@ -46,3 +47,8 @@ RSpec/MultipleDescribes:
4647
RSpec/RepeatedExampleGroupDescription:
4748
Exclude:
4849
- 'spec/README.md'
50+
51+
RSpec/Output:
52+
Exclude:
53+
- 'spec/support/**/*'
54+
- 'spec/config/**/*'

.tool-versions

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
ruby jruby
1+
ruby latest

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ Please file a bug if you notice a violation of semantic versioning.
2020

2121
### Added
2222

23+
- **Emitter autoload** - Added `Emitter` to module autoload list
24+
- Previously missing, causing `NameError: uninitialized constant Emitter` in ConflictResolver
25+
- Now properly autoloaded via `autoload :Emitter, "toml/merge/emitter"`
26+
2327
### Changed
2428

2529
- **Test suite now explicitly tests all available backend modes** - Tests previously ran with

Gemfile.lock

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ PATH
3535
remote: .
3636
specs:
3737
toml-merge (2.0.0)
38-
ast-merge (~> 3.0, >= 3.0.0)
39-
tree_haver (~> 3.2, >= 3.2.3)
38+
ast-merge (~> 3.1, >= 3.1.0)
39+
tree_haver (~> 4.0, >= 4.0.0)
4040
version_gem (~> 1.1, >= 1.1.9)
4141

4242
GEM
@@ -50,8 +50,8 @@ GEM
5050
rake (>= 10)
5151
thor (>= 0.14)
5252
ast (2.4.3)
53-
ast-merge (3.0.0)
54-
tree_haver (~> 3.2, >= 3.2.5)
53+
ast-merge (3.1.0)
54+
tree_haver (~> 4.0, >= 4.0.0)
5555
version_gem (~> 1.1, >= 1.1.9)
5656
backports (3.25.3)
5757
benchmark (0.5.0)
@@ -183,7 +183,7 @@ GEM
183183
racc (1.8.1-java)
184184
rainbow (3.1.1)
185185
rake (13.3.1)
186-
rbs (3.10.0)
186+
rbs (3.10.2)
187187
logger
188188
rdoc (6.17.0)
189189
erb
@@ -264,7 +264,7 @@ GEM
264264
rubocop-rake (0.7.1)
265265
lint_roller (~> 1.1)
266266
rubocop (>= 1.72.1)
267-
rubocop-rspec (3.8.0)
267+
rubocop-rspec (3.9.0)
268268
lint_roller (~> 1.1)
269269
rubocop (~> 1.81)
270270
rubocop-ruby3_2 (2.0.7)
@@ -303,7 +303,7 @@ GEM
303303
simplecov-rcov (0.3.7)
304304
simplecov (>= 0.4.1)
305305
simplecov_json_formatter (0.1.4)
306-
sorbet-runtime (0.6.12874)
306+
sorbet-runtime (0.6.12878)
307307
standard (1.52.0)
308308
language_server-protocol (~> 3.17.0.2)
309309
lint_roller (~> 1.0)
@@ -337,7 +337,7 @@ GEM
337337
toml-rb (4.1.0)
338338
citrus (~> 3.0, > 3.0)
339339
racc (~> 1.7)
340-
tree_haver (3.2.6)
340+
tree_haver (4.0.0)
341341
version_gem (~> 1.1, >= 1.1.9)
342342
tsort (0.2.0)
343343
ttfunk (1.8.0)
@@ -416,7 +416,7 @@ CHECKSUMS
416416
ansi (1.5.0) sha256=5408253274e33d9d27d4a98c46d2998266fd51cba58a7eb9d08f50e57ed23592
417417
appraisal2 (3.0.0) sha256=f1b4e742cf8ebef5e9fbb76c416a8c16edfe0727964a5a17b44adfc37b701aed
418418
ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
419-
ast-merge (3.0.0) sha256=63664b465a854a7bcec56dbf99223b9d30f14a401a7c433d1d62983254781290
419+
ast-merge (3.1.0) sha256=b4bffa3536385d30b280193c705c003f9a1dd4e43c9fb4146a2f56dda01746ee
420420
backports (3.25.3) sha256=94298d32dc3c40ca15633b54e282780b49e2db0c045f602ea1907e4f63a17235
421421
benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c
422422
bigdecimal (3.3.1) sha256=eaa01e228be54c4f9f53bf3cc34fe3d5e845c31963e7fcc5bedb05a4e7d52218
@@ -481,7 +481,7 @@ CHECKSUMS
481481
racc (1.8.1-java) sha256=54f2e6d1e1b91c154013277d986f52a90e5ececbe91465d29172e49342732b98
482482
rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
483483
rake (13.3.1) sha256=8c9e89d09f66a26a01264e7e3480ec0607f0c497a861ef16063604b1b08eb19c
484-
rbs (3.10.0) sha256=e75b5f1313c71c9ee0fcea68bf97d3e5fe8ec7a641d4b5cd18bbc28c94ddf298
484+
rbs (3.10.2) sha256=bd8a5dc4c62f229f020146b61844a31f9c79e649449d212904a474eb79c846fc
485485
rdoc (6.17.0) sha256=0f50d4e568fc98195f9bb155a9e8dff6c7feabfb515fb22ef6df1d12ad5a02b7
486486
reek (6.5.0) sha256=d26d3a492773b2bbc228888067a21afe33ac07954a17dbd64cdeae42c4c69be1
487487
regexp_parser (2.11.3) sha256=ca13f381a173b7a93450e53459075c9b76a10433caadcb2f1180f2c741fc55a4
@@ -506,7 +506,7 @@ CHECKSUMS
506506
rubocop-packaging (0.6.0) sha256=fb92bd0fb48e6f8cdb1648d2249b0cd51c2497dcc87340132d22f01edbf558a7
507507
rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834
508508
rubocop-rake (0.7.1) sha256=3797f2b6810c3e9df7376c26d5f44f3475eda59eb1adc38e6f62ecf027cbae4d
509-
rubocop-rspec (3.8.0) sha256=28440dccb3f223a9938ca1f946bd3438275b8c6c156dab909e2cb8bc424cab33
509+
rubocop-rspec (3.9.0) sha256=8fa70a3619408237d789aeecfb9beef40576acc855173e60939d63332fdb55e2
510510
rubocop-ruby3_2 (2.0.7) sha256=2f067d18ca3c9ce40b4c9f8c4aea3e1036328229edc5cb556b230b128bab7ad0
511511
rubocop-shopify (2.18.0) sha256=dafa25e5617ce4600ff86b1de3d5b78e43ab3d58cc5729df38e492b8e10294eb
512512
rubocop-thread_safety (0.7.3) sha256=067cdd52fbf5deffc18995437e45b5194236eaff4f71de3375a1f6052e48f431
@@ -523,7 +523,7 @@ CHECKSUMS
523523
simplecov-lcov (0.9.0) sha256=7a77a31e200a595ed4b0249493056efd0c920601f53d2ef135ca34ee796346cd
524524
simplecov-rcov (0.3.7) sha256=372f50bf6df6b6350b7d0c840f2f8bdabe021861a43c26877b747c9ac96139fc
525525
simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428
526-
sorbet-runtime (0.6.12874) sha256=53e69e89c7550ce97a23286da6d4ce73917f3edf7ce882353c4fe5be80d17332
526+
sorbet-runtime (0.6.12878) sha256=e1efa4b73f6d111025d9978a63b6c0f31ab7603027ce272591449d10888c83c9
527527
standard (1.52.0) sha256=ec050e63228e31fabe40da3ef96da7edda476f7acdf3e7c2ad47b6e153f6a076
528528
standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b
529529
standard-performance (1.9.0) sha256=49483d31be448292951d80e5e67cdcb576c2502103c7b40aec6f1b6e9c88e3f2
@@ -537,7 +537,7 @@ CHECKSUMS
537537
timecop-rspec (1.0.3) sha256=005f14841bb606dcaefb060e321b5388e2e59537742bee8b3a9a9a40e598fab9
538538
toml-merge (2.0.0)
539539
toml-rb (4.1.0) sha256=14456ec4549e4703881bf04b83a56f3264ef99884880092d83c98a2058d95846
540-
tree_haver (3.2.6) sha256=0c7a07a260bcbaea05a61671af84e36b8e6166379b6abae5def154f643487d4e
540+
tree_haver (4.0.0) sha256=f2e2c05273dbe606c4a0c1ddb8c6c95945032ccd9c1a9227069733ed59614ce3
541541
tree_stump (0.1.0)
542542
tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f
543543
ttfunk (1.8.0) sha256=a7cbc7e489cc46e979dde04d34b5b9e4f5c8f1ee5fc6b1a7be39b829919d20ca

bin/kettle-soup-cover

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ if @show_lines
277277
if line_results.empty?
278278
puts "All files fully covered (lines)!"
279279
else
280-
puts "Files with uncovered (-d to expand) lines (-n=#{max_details}; use n=0 for unlimited):"
280+
puts "Files with uncovered (-d to expand) lines (-n #{max_details}; use n 0 for unlimited):"
281281
puts "-" * 70
282282
line_results.each do |r|
283283
puts format("%3d uncovered | %5.1f%% | %s", r[:uncovered], r[:pct], r[:path])
@@ -317,7 +317,7 @@ if @show_branches
317317
if branch_results.empty?
318318
puts "All files fully covered (branches)!"
319319
else
320-
puts "Files with uncovered (-d to expand) branches (-n=#{max_details}; use n=0 for unlimited):"
320+
puts "Files with uncovered (-d to expand) branches (-n #{max_details}; use n 0 for unlimited):"
321321
puts "-" * 70
322322
branch_results.each do |r|
323323
puts format("%3d uncovered | %5.1f%% | %s", r[:uncovered], r[:pct], r[:path])

docs/Toml/Merge.html

Lines changed: 0 additions & 183 deletions
Original file line numberDiff line numberDiff line change
@@ -1,183 +0,0 @@
1-
<!DOCTYPE html>
2-
<html>
3-
<head>
4-
<meta charset="utf-8">
5-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
6-
<title>
7-
Module: Toml::Merge
8-
9-
&mdash; Documentation by YARD 0.9.38
10-
11-
</title>
12-
13-
<link rel="stylesheet" href="../css/style.css" type="text/css" />
14-
15-
<link rel="stylesheet" href="../css/common.css" type="text/css" />
16-
17-
<script type="text/javascript">
18-
pathId = "Toml::Merge";
19-
relpath = '../';
20-
</script>
21-
22-
23-
<script type="text/javascript" charset="utf-8" src="../js/jquery.js"></script>
24-
25-
<script type="text/javascript" charset="utf-8" src="../js/app.js"></script>
26-
27-
28-
</head>
29-
<body>
30-
<div class="nav_wrap">
31-
<iframe id="nav" src="../class_list.html?1"></iframe>
32-
<div id="resizer"></div>
33-
</div>
34-
35-
<div id="main" tabindex="-1">
36-
<div id="header">
37-
<div id="menu">
38-
39-
<a href="../_index.html">Index (M)</a> &raquo;
40-
<span class='title'><span class='object_link'><a href="../Toml.html" title="Toml (module)">Toml</a></span></span>
41-
&raquo;
42-
<span class="title">Merge</span>
43-
44-
</div>
45-
46-
<div id="search">
47-
48-
<a class="full_list_link" id="class_list_link"
49-
href="../class_list.html">
50-
51-
<svg width="24" height="24">
52-
<rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
53-
<rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
54-
<rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
55-
</svg>
56-
</a>
57-
58-
</div>
59-
<div class="clear"></div>
60-
</div>
61-
62-
<div id="content"><h1>Module: Toml::Merge
63-
64-
65-
66-
</h1>
67-
<div class="box_info">
68-
69-
70-
71-
72-
73-
74-
75-
76-
77-
78-
79-
<dl>
80-
<dt>Defined in:</dt>
81-
<dd>lib/toml/merge.rb<span class="defines">,<br />
82-
lib/toml/merge/version.rb,<br /> lib/toml/merge/debug_logger.rb,<br /> lib/toml/merge/merge_result.rb,<br /> lib/toml/merge/node_wrapper.rb,<br /> lib/toml/merge/smart_merger.rb,<br /> lib/toml/merge/file_analysis.rb,<br /> lib/toml/merge/conflict_resolver.rb,<br /> lib/toml/merge/table_match_refiner.rb,<br /> lib/toml/merge/node_type_normalizer.rb</span>
83-
</dd>
84-
</dl>
85-
86-
</div>
87-
88-
<h2>Overview</h2><div class="docstring">
89-
<div class="discussion">
90-
<p>Smart merge system for TOML files using tree-sitter AST analysis.<br />
91-
Provides intelligent merging by understanding TOML structure<br />
92-
rather than treating files as plain text.</p>
93-
94-
95-
</div>
96-
</div>
97-
<div class="tags">
98-
99-
100-
<p class="tag_title">See Also:</p>
101-
<ul class="see">
102-
103-
<li><span class='object_link'><a href="Merge/SmartMerger.html" title="Toml::Merge::SmartMerger (class)">Main entry point for merge operations</a></span></li>
104-
105-
<li><span class='object_link'><a href="Merge/FileAnalysis.html" title="Toml::Merge::FileAnalysis (class)">Analyzes TOML structure</a></span></li>
106-
107-
<li><span class='object_link'><a href="Merge/ConflictResolver.html" title="Toml::Merge::ConflictResolver (class)">Resolves content conflicts</a></span></li>
108-
109-
</ul>
110-
111-
</div><h2>Defined Under Namespace</h2>
112-
<p class="children">
113-
114-
115-
<strong class="modules">Modules:</strong> <span class='object_link'><a href="Merge/DebugLogger.html" title="Toml::Merge::DebugLogger (module)">DebugLogger</a></span>, <span class='object_link'><a href="Merge/NodeTypeNormalizer.html" title="Toml::Merge::NodeTypeNormalizer (module)">NodeTypeNormalizer</a></span>, <span class='object_link'><a href="Merge/Version.html" title="Toml::Merge::Version (module)">Version</a></span>
116-
117-
118-
119-
<strong class="classes">Classes:</strong> <span class='object_link'><a href="Merge/ConflictResolver.html" title="Toml::Merge::ConflictResolver (class)">ConflictResolver</a></span>, <span class='object_link'><a href="Merge/DestinationParseError.html" title="Toml::Merge::DestinationParseError (class)">DestinationParseError</a></span>, <span class='object_link'><a href="Merge/Error.html" title="Toml::Merge::Error (class)">Error</a></span>, <span class='object_link'><a href="Merge/FileAnalysis.html" title="Toml::Merge::FileAnalysis (class)">FileAnalysis</a></span>, <span class='object_link'><a href="Merge/MergeResult.html" title="Toml::Merge::MergeResult (class)">MergeResult</a></span>, <span class='object_link'><a href="Merge/NodeWrapper.html" title="Toml::Merge::NodeWrapper (class)">NodeWrapper</a></span>, <span class='object_link'><a href="Merge/ParseError.html" title="Toml::Merge::ParseError (class)">ParseError</a></span>, <span class='object_link'><a href="Merge/SmartMerger.html" title="Toml::Merge::SmartMerger (class)">SmartMerger</a></span>, <span class='object_link'><a href="Merge/TableMatchRefiner.html" title="Toml::Merge::TableMatchRefiner (class)">TableMatchRefiner</a></span>, <span class='object_link'><a href="Merge/TemplateParseError.html" title="Toml::Merge::TemplateParseError (class)">TemplateParseError</a></span>
120-
121-
122-
</p>
123-
124-
125-
<h2>
126-
Constant Summary
127-
<small><a href="#" class="constants_summary_toggle">collapse</a></small>
128-
</h2>
129-
130-
<dl class="constants">
131-
132-
<dt id="VERSION-constant" class="">VERSION =
133-
<div class="docstring">
134-
<div class="discussion">
135-
<p>traditional location</p>
136-
137-
138-
</div>
139-
</div>
140-
<div class="tags">
141-
142-
143-
</div>
144-
</dt>
145-
<dd><pre class="code"><span class='const'><span class='object_link'><a href="Merge/Version.html" title="Toml::Merge::Version (module)">Version</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Merge/Version.html#VERSION-constant" title="Toml::Merge::Version::VERSION (constant)">VERSION</a></span></span></pre></dd>
146-
147-
<dt id="NodeTypingNormalizer-constant" class="">NodeTypingNormalizer =
148-
<div class="docstring">
149-
<div class="discussion">
150-
<p>Alias for the shared normalizer module from ast-merge</p>
151-
152-
153-
</div>
154-
</div>
155-
<div class="tags">
156-
157-
158-
</div>
159-
</dt>
160-
<dd><pre class="code"><span class='const'>Ast</span><span class='op'>::</span><span class='const'>Merge</span><span class='op'>::</span><span class='const'>NodeTyping</span><span class='op'>::</span><span class='const'>Normalizer</span></pre></dd>
161-
162-
</dl>
163-
164-
165-
166-
167-
168-
169-
170-
171-
172-
173-
</div>
174-
175-
<div id="footer">
176-
Generated on Fri Jan 2 06:07:01 2026 by
177-
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
178-
0.9.38 (ruby-4.0.0).
179-
</div>
180-
181-
</div>
182-
</body>
183-
</html>

0 commit comments

Comments
 (0)