ast-merge 1.1.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +198 -7
  4. data/README.md +208 -39
  5. data/exe/ast-merge-recipe +366 -0
  6. data/lib/ast/merge/conflict_resolver_base.rb +8 -1
  7. data/lib/ast/merge/content_match_refiner.rb +278 -0
  8. data/lib/ast/merge/debug_logger.rb +2 -1
  9. data/lib/ast/merge/detector/base.rb +193 -0
  10. data/lib/ast/merge/detector/fenced_code_block.rb +227 -0
  11. data/lib/ast/merge/detector/mergeable.rb +369 -0
  12. data/lib/ast/merge/detector/toml_frontmatter.rb +82 -0
  13. data/lib/ast/merge/detector/yaml_frontmatter.rb +82 -0
  14. data/lib/ast/merge/merge_result_base.rb +4 -1
  15. data/lib/ast/merge/navigable_statement.rb +630 -0
  16. data/lib/ast/merge/partial_template_merger.rb +432 -0
  17. data/lib/ast/merge/recipe/config.rb +198 -0
  18. data/lib/ast/merge/recipe/preset.rb +171 -0
  19. data/lib/ast/merge/recipe/runner.rb +254 -0
  20. data/lib/ast/merge/recipe/script_loader.rb +181 -0
  21. data/lib/ast/merge/recipe.rb +26 -0
  22. data/lib/ast/merge/rspec/dependency_tags.rb +252 -0
  23. data/lib/ast/merge/rspec/shared_examples/reproducible_merge.rb +3 -2
  24. data/lib/ast/merge/rspec.rb +33 -2
  25. data/lib/ast/merge/smart_merger_base.rb +86 -3
  26. data/lib/ast/merge/version.rb +1 -1
  27. data/lib/ast/merge.rb +10 -6
  28. data/sig/ast/merge.rbs +389 -2
  29. data.tar.gz.sig +0 -0
  30. metadata +60 -16
  31. metadata.gz.sig +0 -0
  32. data/lib/ast/merge/fenced_code_block_detector.rb +0 -313
  33. data/lib/ast/merge/region.rb +0 -124
  34. data/lib/ast/merge/region_detector_base.rb +0 -114
  35. data/lib/ast/merge/region_mergeable.rb +0 -364
  36. data/lib/ast/merge/toml_frontmatter_detector.rb +0 -88
  37. data/lib/ast/merge/yaml_frontmatter_detector.rb +0 -88
data/sig/ast/merge.rbs CHANGED
@@ -167,13 +167,13 @@ module Ast
167
167
 
168
168
  attr_reader signature_match_preference: Symbol | Hash[Symbol, Symbol]
169
169
  attr_reader node_splitter: Hash[Symbol, untyped]?
170
- attr_reader add_template_only_nodes: bool
170
+ attr_reader add_template_only_nodes: add_template_only_nodes_type
171
171
  attr_reader freeze_token: String?
172
172
  attr_reader signature_generator: (^(untyped) -> (Array[untyped] | untyped | nil))?
173
173
 
174
174
  def initialize: (
175
175
  ?signature_match_preference: (Symbol | Hash[Symbol, Symbol]),
176
- ?add_template_only_nodes: bool,
176
+ ?add_template_only_nodes: add_template_only_nodes_type,
177
177
  ?freeze_token: String?,
178
178
  ?signature_generator: (^(untyped) -> (Array[untyped] | untyped | nil))?,
179
179
  ?node_splitter: Hash[Symbol, untyped]?
@@ -191,5 +191,392 @@ module Ast
191
191
 
192
192
  def validate_preference!: (Symbol preference) -> void
193
193
  end
194
+
195
+ # Type alias for node typing callables
196
+ type node_typing_callable = ^(untyped) -> untyped?
197
+ type node_typing_hash = Hash[Symbol | String, node_typing_callable]
198
+ type preference_type = Symbol | Hash[Symbol, Symbol]
199
+
200
+ # Type alias for add_template_only_nodes filter
201
+ # Can be: Boolean, or callable that receives (node, entry) and returns truthy/falsey
202
+ # Entry hash contains: { template_node:, signature:, template_index:, dest_index: nil }
203
+ type add_template_only_filter = ^(untyped node, Hash[Symbol, untyped] entry) -> boolish
204
+ type add_template_only_nodes_type = bool | add_template_only_filter
205
+
206
+ # Abstract base class for SmartMerger implementations
207
+ class SmartMergerBase
208
+ include Detector::Mergeable
209
+
210
+ attr_reader template_content: String
211
+ attr_reader dest_content: String
212
+ attr_reader template_analysis: untyped
213
+ attr_reader dest_analysis: untyped
214
+ attr_reader resolver: untyped
215
+ attr_reader result: untyped
216
+ attr_reader preference: preference_type
217
+ attr_reader add_template_only_nodes: add_template_only_nodes_type
218
+ attr_reader freeze_token: String
219
+ attr_reader signature_generator: (^(untyped) -> (Array[untyped] | untyped | nil))?
220
+ attr_reader match_refiner: untyped?
221
+ attr_reader node_typing: node_typing_hash?
222
+
223
+ def initialize: (
224
+ String template_content,
225
+ String dest_content,
226
+ ?signature_generator: (^(untyped) -> (Array[untyped] | untyped | nil))?,
227
+ ?preference: preference_type,
228
+ ?add_template_only_nodes: add_template_only_nodes_type,
229
+ ?freeze_token: String?,
230
+ ?match_refiner: untyped?,
231
+ ?regions: Array[Hash[Symbol, untyped]]?,
232
+ ?region_placeholder: String?,
233
+ ?node_typing: node_typing_hash?,
234
+ **untyped format_options
235
+ ) -> void
236
+
237
+ def merge: () -> String
238
+ def merge_result: () -> untyped
239
+
240
+ # Class method for convenient merging
241
+ def self.merge: (
242
+ String template_content,
243
+ String dest_content,
244
+ **untyped options
245
+ ) -> String
246
+
247
+ private
248
+
249
+ # Abstract methods that subclasses must implement
250
+ def analysis_class: () -> Class
251
+ def perform_merge: () -> untyped
252
+
253
+ # Optional hooks for subclasses
254
+ def default_freeze_token: () -> String
255
+ def resolver_class: () -> Class?
256
+ def result_class: () -> Class?
257
+ def aligner_class: () -> Class?
258
+ def build_analysis_options: () -> Hash[Symbol, untyped]
259
+ def build_resolver_options: () -> Hash[Symbol, untyped]
260
+ def build_full_analysis_options: (Symbol source) -> Hash[Symbol, untyped]
261
+ def update_result_content: (untyped result, String content) -> void
262
+ def template_parse_error_class: () -> Class
263
+ def destination_parse_error_class: () -> Class
264
+ end
265
+
266
+ # Abstract base class for ConflictResolver implementations
267
+ class ConflictResolverBase
268
+ # Decision constants
269
+ DECISION_KEPT_TEMPLATE: Symbol
270
+ DECISION_KEPT_DEST: Symbol
271
+ DECISION_MERGED: Symbol
272
+ DECISION_ADDED: Symbol
273
+ DECISION_FREEZE_BLOCK: Symbol
274
+ DECISION_APPENDED: Symbol
275
+ DECISION_REPLACED: Symbol
276
+
277
+ attr_reader strategy: Symbol
278
+ attr_reader preference: preference_type
279
+ attr_reader template_analysis: untyped
280
+ attr_reader dest_analysis: untyped
281
+ attr_reader add_template_only_nodes: bool
282
+ attr_reader match_refiner: untyped?
283
+
284
+ def initialize: (
285
+ strategy: Symbol,
286
+ preference: preference_type,
287
+ template_analysis: untyped,
288
+ dest_analysis: untyped,
289
+ ?add_template_only_nodes: bool,
290
+ ?match_refiner: untyped?,
291
+ **untyped options
292
+ ) -> void
293
+
294
+ def resolve: (*untyped args, **untyped kwargs) -> untyped
295
+
296
+ # Get preference for a specific node (supports Hash preference)
297
+ def preference_for: (untyped node) -> Symbol
298
+
299
+ private
300
+
301
+ def validate_preference!: (preference_type preference) -> void
302
+ def resolve_node_pair: (untyped template_node, untyped dest_node, **untyped kwargs) -> untyped
303
+ def resolve_batch: (*untyped args) -> untyped
304
+ def resolve_boundary: (*untyped args) -> untyped
305
+ end
306
+
307
+ # Abstract base class for MergeResult implementations
308
+ class MergeResultBase
309
+ # Decision constants
310
+ DECISION_KEPT_TEMPLATE: Symbol
311
+ DECISION_KEPT_DEST: Symbol
312
+ DECISION_MERGED: Symbol
313
+ DECISION_ADDED: Symbol
314
+ DECISION_FREEZE_BLOCK: Symbol
315
+ DECISION_APPENDED: Symbol
316
+ DECISION_REPLACED: Symbol
317
+
318
+ attr_reader template_analysis: untyped?
319
+ attr_reader dest_analysis: untyped?
320
+ attr_reader lines: Array[String]
321
+ attr_reader decisions: Array[Hash[Symbol, untyped]]
322
+ attr_reader conflicts: Array[Hash[Symbol, untyped]]
323
+ attr_reader frozen_blocks: Array[untyped]
324
+ attr_reader stats: Hash[Symbol, untyped]
325
+
326
+ def initialize: (
327
+ ?template_analysis: untyped?,
328
+ ?dest_analysis: untyped?,
329
+ ?conflicts: Array[Hash[Symbol, untyped]],
330
+ ?frozen_blocks: Array[untyped],
331
+ ?stats: Hash[Symbol, untyped],
332
+ **untyped options
333
+ ) -> void
334
+
335
+ def content: () -> Array[String]
336
+ def content?: () -> bool
337
+ def content_string: () -> String
338
+ def to_s: () -> String
339
+ def success?: () -> bool
340
+ def conflicts?: () -> bool
341
+ def track_decision: (Symbol decision, Symbol source, **untyped metadata) -> void
342
+ end
343
+
344
+ # Abstract base class for MatchRefiner implementations
345
+ class MatchRefinerBase
346
+ # Default similarity threshold
347
+ DEFAULT_THRESHOLD: Float
348
+
349
+ attr_reader threshold: Float
350
+ attr_reader node_types: Array[Symbol]?
351
+
352
+ def initialize: (
353
+ ?threshold: Float,
354
+ ?node_types: Array[Symbol]?,
355
+ **untyped options
356
+ ) -> void
357
+
358
+ # Find matches between unmatched nodes
359
+ def call: (
360
+ Array[untyped] template_nodes,
361
+ Array[untyped] dest_nodes,
362
+ ?Hash[Symbol, untyped] context
363
+ ) -> Array[MatchResult]
364
+
365
+ # Compute similarity score between two nodes
366
+ def similarity: (untyped template_node, untyped dest_node) -> Float
367
+
368
+ # Check if a node matches the configured types
369
+ def matches_type?: (untyped node) -> bool
370
+
371
+ private
372
+
373
+ # Levenshtein distance for string similarity
374
+ def levenshtein_distance: (String s1, String s2) -> Integer
375
+ def string_similarity: (String s1, String s2) -> Float
376
+ end
377
+
378
+ # Result of a match refinement operation
379
+ class MatchResult
380
+ attr_reader template_node: untyped
381
+ attr_reader dest_node: untyped
382
+ attr_reader score: Float
383
+ attr_reader metadata: Hash[Symbol, untyped]
384
+
385
+ def initialize: (
386
+ template_node: untyped,
387
+ dest_node: untyped,
388
+ score: Float,
389
+ ?metadata: Hash[Symbol, untyped]
390
+ ) -> void
391
+
392
+ def to_h: () -> Hash[Symbol, untyped]
393
+ end
394
+
395
+ # Detector namespace for region detection and merging
396
+ module Detector
397
+ # Represents a detected region within a document
398
+ class Region < Struct[untyped]
399
+ attr_accessor type: Symbol
400
+ attr_accessor content: String
401
+ attr_accessor start_line: Integer
402
+ attr_accessor end_line: Integer
403
+ attr_accessor delimiters: Array[String]?
404
+ attr_accessor metadata: Hash[Symbol, untyped]?
405
+
406
+ def line_range: () -> Range[Integer]
407
+ def line_count: () -> Integer
408
+ def full_text: () -> String
409
+ def contains_line?: (Integer line) -> bool
410
+ def overlaps?: (Region other) -> bool
411
+ def to_s: () -> String
412
+ def inspect: () -> String
413
+ end
414
+
415
+ # Abstract base class for region detectors
416
+ class Base
417
+ def region_type: () -> Symbol
418
+ def detect_all: (String source) -> Array[Region]
419
+ def strip_delimiters?: () -> bool
420
+ def name: () -> String
421
+ def inspect: () -> String
422
+
423
+ private
424
+
425
+ def build_region: (
426
+ type: Symbol,
427
+ content: String,
428
+ start_line: Integer,
429
+ end_line: Integer,
430
+ ?delimiters: Array[String]?,
431
+ ?metadata: Hash[Symbol, untyped]?
432
+ ) -> Region
433
+ end
434
+
435
+ # Detects fenced code blocks
436
+ class FencedCodeBlock < Base
437
+ attr_reader language: String
438
+ attr_reader aliases: Array[String]
439
+
440
+ def initialize: (String language, ?aliases: Array[String]) -> void
441
+ def self.ruby: () -> FencedCodeBlock
442
+ def self.yaml: () -> FencedCodeBlock
443
+ def self.json: () -> FencedCodeBlock
444
+ def self.bash: () -> FencedCodeBlock
445
+ end
446
+
447
+ # Detects YAML frontmatter
448
+ class YamlFrontmatter < Base
449
+ FRONTMATTER_PATTERN: Regexp
450
+ end
451
+
452
+ # Detects TOML frontmatter
453
+ class TomlFrontmatter < Base
454
+ FRONTMATTER_PATTERN: Regexp
455
+ end
456
+
457
+ # Mixin for region-aware merging
458
+ module Mergeable
459
+ DEFAULT_PLACEHOLDER_PREFIX: String
460
+ DEFAULT_PLACEHOLDER_SUFFIX: String
461
+
462
+ # Configuration for a region type
463
+ class Config < Struct[untyped]
464
+ attr_accessor detector: Base
465
+ attr_accessor merger_class: Class?
466
+ attr_accessor merger_options: Hash[Symbol, untyped]
467
+ attr_accessor regions: Array[Hash[Symbol, untyped]]
468
+ end
469
+
470
+ # Extracted region with placeholder
471
+ class ExtractedRegion < Struct[untyped]
472
+ attr_accessor region: Region
473
+ attr_accessor config: Config
474
+ attr_accessor placeholder: String
475
+ attr_accessor merged_content: String?
476
+ end
477
+
478
+ def regions_configured?: () -> bool
479
+ def setup_regions: (regions: Array[Hash[Symbol, untyped]], ?region_placeholder: String?) -> void
480
+ def extract_template_regions: (String content) -> String
481
+ def extract_dest_regions: (String content) -> String
482
+ def substitute_merged_regions: (String content) -> String
483
+ end
484
+ end
485
+
486
+ # Recipe namespace for YAML-based merge recipes
487
+ module Recipe
488
+ # Recipe configuration loaded from YAML
489
+ class Config
490
+ attr_reader name: String
491
+ attr_reader description: String?
492
+ attr_reader template_path: String
493
+ attr_reader targets: Array[String]
494
+ attr_reader injection: Hash[String, untyped]
495
+ attr_reader merge_options: Hash[String, untyped]
496
+ attr_reader when_missing: Symbol
497
+ attr_reader recipe_path: String?
498
+
499
+ def self.load: (String path) -> Config
500
+ def initialize: (Hash[String, untyped] config, ?recipe_path: String?) -> void
501
+ def anchor_config: () -> Hash[String, untyped]
502
+ def boundary_config: () -> Hash[String, untyped]?
503
+ def position: () -> Symbol
504
+ def preference: () -> Symbol
505
+ def add_missing?: () -> bool
506
+ def replace_mode?: () -> bool
507
+ end
508
+
509
+ # Executes recipes against target files
510
+ class Runner
511
+ # Result of processing a single file
512
+ class Result < Struct[untyped]
513
+ attr_accessor path: String
514
+ attr_accessor relative_path: String
515
+ attr_accessor status: Symbol
516
+ attr_accessor changed: bool
517
+ attr_accessor has_anchor: bool
518
+ attr_accessor message: String?
519
+ attr_accessor stats: Hash[Symbol, untyped]?
520
+ attr_accessor error: String?
521
+ end
522
+
523
+ attr_reader recipe: Config
524
+ attr_reader dry_run: bool
525
+ attr_reader verbose: bool
526
+ attr_reader parser: Symbol
527
+ attr_reader base_dir: String
528
+ attr_reader results: Array[Result]
529
+
530
+ def initialize: (
531
+ Config recipe,
532
+ ?dry_run: bool,
533
+ ?verbose: bool,
534
+ ?parser: Symbol,
535
+ ?base_dir: String
536
+ ) -> void
537
+
538
+ def run: () ?{ (Result) -> void } -> Array[Result]
539
+ def summary: () -> Hash[Symbol, Integer]
540
+ def summary_table: () -> Array[Hash[Symbol, untyped]]
541
+ end
542
+
543
+ # Loads Ruby scripts referenced by recipes
544
+ class ScriptLoader
545
+ attr_reader base_dir: String?
546
+ attr_reader cache: Hash[String, untyped]
547
+
548
+ def initialize: (?recipe_path: String?, ?base_dir: String?) -> void
549
+ def load_callable: (String script_ref) -> (^(*untyped) -> untyped)?
550
+ def resolve_path: (String script_ref) -> String?
551
+
552
+ private
553
+
554
+ def load_from_file: (String path) -> untyped
555
+ def parse_inline_lambda: (String code) -> (^(*untyped) -> untyped)?
556
+ end
557
+ end
558
+
559
+ # Module for node typing support
560
+ module NodeTyping
561
+ # Wrapper class for typed nodes
562
+ class Wrapper
563
+ attr_reader node: untyped
564
+ attr_reader merge_type: Symbol
565
+
566
+ def initialize: (untyped node, Symbol merge_type) -> void
567
+ def method_missing: (Symbol method, *untyped args) ?{ (*untyped) -> untyped } -> untyped
568
+ def respond_to_missing?: (Symbol method, ?bool include_private) -> bool
569
+ def typed_node?: () -> bool
570
+ def unwrap: () -> untyped
571
+ def ==: (untyped other) -> bool
572
+ def hash: () -> Integer
573
+ def eql?: (untyped other) -> bool
574
+ def inspect: () -> String
575
+ end
576
+
577
+ def self.with_merge_type: (untyped node, Symbol merge_type) -> Wrapper
578
+ def self.validate!: (node_typing_hash? node_typing) -> void
579
+ def self.apply: (untyped node, node_typing_hash? node_typing) -> untyped
580
+ end
194
581
  end
195
582
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ast-merge
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -66,7 +66,7 @@ dependencies:
66
66
  version: '3.1'
67
67
  - - ">="
68
68
  - !ruby/object:Gem::Version
69
- version: 3.1.0
69
+ version: 3.1.2
70
70
  type: :runtime
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
@@ -76,7 +76,7 @@ dependencies:
76
76
  version: '3.1'
77
77
  - - ">="
78
78
  - !ruby/object:Gem::Version
79
- version: 3.1.0
79
+ version: 3.1.2
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: kettle-dev
82
82
  requirement: !ruby/object:Gem::Requirement
@@ -153,6 +153,40 @@ dependencies:
153
153
  - - "~>"
154
154
  - !ruby/object:Gem::Version
155
155
  version: '3.0'
156
+ - !ruby/object:Gem::Dependency
157
+ name: benchmark
158
+ requirement: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - "~>"
161
+ - !ruby/object:Gem::Version
162
+ version: '0.5'
163
+ type: :development
164
+ prerelease: false
165
+ version_requirements: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - "~>"
168
+ - !ruby/object:Gem::Version
169
+ version: '0.5'
170
+ - !ruby/object:Gem::Dependency
171
+ name: kettle-soup-cover
172
+ requirement: !ruby/object:Gem::Requirement
173
+ requirements:
174
+ - - "~>"
175
+ - !ruby/object:Gem::Version
176
+ version: '1.1'
177
+ - - ">="
178
+ - !ruby/object:Gem::Version
179
+ version: 1.1.1
180
+ type: :development
181
+ prerelease: false
182
+ version_requirements: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - "~>"
185
+ - !ruby/object:Gem::Version
186
+ version: '1.1'
187
+ - - ">="
188
+ - !ruby/object:Gem::Version
189
+ version: 1.1.1
156
190
  - !ruby/object:Gem::Dependency
157
191
  name: kettle-test
158
192
  requirement: !ruby/object:Gem::Requirement
@@ -162,7 +196,7 @@ dependencies:
162
196
  version: '1.0'
163
197
  - - ">="
164
198
  - !ruby/object:Gem::Version
165
- version: 1.0.6
199
+ version: 1.0.7
166
200
  type: :development
167
201
  prerelease: false
168
202
  version_requirements: !ruby/object:Gem::Requirement
@@ -172,7 +206,7 @@ dependencies:
172
206
  version: '1.0'
173
207
  - - ">="
174
208
  - !ruby/object:Gem::Version
175
- version: 1.0.6
209
+ version: 1.0.7
176
210
  - !ruby/object:Gem::Dependency
177
211
  name: ruby-progressbar
178
212
  requirement: !ruby/object:Gem::Requirement
@@ -232,7 +266,8 @@ description: "☯️ Ast::Merge provides base classes, modules, and RSpec shared
232
266
  psych-merge, json-merge, and other format-specific merge gems."
233
267
  email:
234
268
  - floss@galtzo.com
235
- executables: []
269
+ executables:
270
+ - ast-merge-recipe
236
271
  extensions: []
237
272
  extra_rdoc_files:
238
273
  - CHANGELOG.md
@@ -256,6 +291,7 @@ files:
256
291
  - REEK
257
292
  - RUBOCOP.md
258
293
  - SECURITY.md
294
+ - exe/ast-merge-recipe
259
295
  - lib/ast-merge.rb
260
296
  - lib/ast/merge.rb
261
297
  - lib/ast/merge/ast_node.rb
@@ -266,8 +302,13 @@ files:
266
302
  - lib/ast/merge/comment/parser.rb
267
303
  - lib/ast/merge/comment/style.rb
268
304
  - lib/ast/merge/conflict_resolver_base.rb
305
+ - lib/ast/merge/content_match_refiner.rb
269
306
  - lib/ast/merge/debug_logger.rb
270
- - lib/ast/merge/fenced_code_block_detector.rb
307
+ - lib/ast/merge/detector/base.rb
308
+ - lib/ast/merge/detector/fenced_code_block.rb
309
+ - lib/ast/merge/detector/mergeable.rb
310
+ - lib/ast/merge/detector/toml_frontmatter.rb
311
+ - lib/ast/merge/detector/yaml_frontmatter.rb
271
312
  - lib/ast/merge/file_analyzable.rb
272
313
  - lib/ast/merge/freezable.rb
273
314
  - lib/ast/merge/freeze_node_base.rb
@@ -275,11 +316,16 @@ files:
275
316
  - lib/ast/merge/match_score_base.rb
276
317
  - lib/ast/merge/merge_result_base.rb
277
318
  - lib/ast/merge/merger_config.rb
319
+ - lib/ast/merge/navigable_statement.rb
278
320
  - lib/ast/merge/node_typing.rb
279
- - lib/ast/merge/region.rb
280
- - lib/ast/merge/region_detector_base.rb
281
- - lib/ast/merge/region_mergeable.rb
321
+ - lib/ast/merge/partial_template_merger.rb
322
+ - lib/ast/merge/recipe.rb
323
+ - lib/ast/merge/recipe/config.rb
324
+ - lib/ast/merge/recipe/preset.rb
325
+ - lib/ast/merge/recipe/runner.rb
326
+ - lib/ast/merge/recipe/script_loader.rb
282
327
  - lib/ast/merge/rspec.rb
328
+ - lib/ast/merge/rspec/dependency_tags.rb
283
329
  - lib/ast/merge/rspec/shared_examples.rb
284
330
  - lib/ast/merge/rspec/shared_examples/conflict_resolver_base.rb
285
331
  - lib/ast/merge/rspec/shared_examples/debug_logger.rb
@@ -299,19 +345,17 @@ files:
299
345
  - lib/ast/merge/text/section_splitter.rb
300
346
  - lib/ast/merge/text/smart_merger.rb
301
347
  - lib/ast/merge/text/word_node.rb
302
- - lib/ast/merge/toml_frontmatter_detector.rb
303
348
  - lib/ast/merge/version.rb
304
- - lib/ast/merge/yaml_frontmatter_detector.rb
305
349
  - sig/ast/merge.rbs
306
350
  homepage: https://github.com/kettle-rb/ast-merge
307
351
  licenses:
308
352
  - MIT
309
353
  metadata:
310
354
  homepage_uri: https://ast-merge.galtzo.com/
311
- source_code_uri: https://github.com/kettle-rb/ast-merge/tree/v1.1.0
312
- changelog_uri: https://github.com/kettle-rb/ast-merge/blob/v1.1.0/CHANGELOG.md
355
+ source_code_uri: https://github.com/kettle-rb/ast-merge/tree/v2.0.1
356
+ changelog_uri: https://github.com/kettle-rb/ast-merge/blob/v2.0.1/CHANGELOG.md
313
357
  bug_tracker_uri: https://github.com/kettle-rb/ast-merge/issues
314
- documentation_uri: https://www.rubydoc.info/gems/ast-merge/1.1.0
358
+ documentation_uri: https://www.rubydoc.info/gems/ast-merge/2.0.1
315
359
  funding_uri: https://github.com/sponsors/pboling
316
360
  wiki_uri: https://github.com/kettle-rb/ast-merge/wiki
317
361
  news_uri: https://www.railsbling.com/tags/ast-merge
@@ -340,7 +384,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
340
384
  - !ruby/object:Gem::Version
341
385
  version: '0'
342
386
  requirements: []
343
- rubygems_version: 4.0.1
387
+ rubygems_version: 4.0.3
344
388
  specification_version: 4
345
389
  summary: "☯️ Shared infrastructure for the *-merge gem family"
346
390
  test_files: []
metadata.gz.sig CHANGED
Binary file