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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +198 -7
- data/README.md +208 -39
- data/exe/ast-merge-recipe +366 -0
- data/lib/ast/merge/conflict_resolver_base.rb +8 -1
- data/lib/ast/merge/content_match_refiner.rb +278 -0
- data/lib/ast/merge/debug_logger.rb +2 -1
- data/lib/ast/merge/detector/base.rb +193 -0
- data/lib/ast/merge/detector/fenced_code_block.rb +227 -0
- data/lib/ast/merge/detector/mergeable.rb +369 -0
- data/lib/ast/merge/detector/toml_frontmatter.rb +82 -0
- data/lib/ast/merge/detector/yaml_frontmatter.rb +82 -0
- data/lib/ast/merge/merge_result_base.rb +4 -1
- data/lib/ast/merge/navigable_statement.rb +630 -0
- data/lib/ast/merge/partial_template_merger.rb +432 -0
- data/lib/ast/merge/recipe/config.rb +198 -0
- data/lib/ast/merge/recipe/preset.rb +171 -0
- data/lib/ast/merge/recipe/runner.rb +254 -0
- data/lib/ast/merge/recipe/script_loader.rb +181 -0
- data/lib/ast/merge/recipe.rb +26 -0
- data/lib/ast/merge/rspec/dependency_tags.rb +252 -0
- data/lib/ast/merge/rspec/shared_examples/reproducible_merge.rb +3 -2
- data/lib/ast/merge/rspec.rb +33 -2
- data/lib/ast/merge/smart_merger_base.rb +86 -3
- data/lib/ast/merge/version.rb +1 -1
- data/lib/ast/merge.rb +10 -6
- data/sig/ast/merge.rbs +389 -2
- data.tar.gz.sig +0 -0
- metadata +60 -16
- metadata.gz.sig +0 -0
- data/lib/ast/merge/fenced_code_block_detector.rb +0 -313
- data/lib/ast/merge/region.rb +0 -124
- data/lib/ast/merge/region_detector_base.rb +0 -114
- data/lib/ast/merge/region_mergeable.rb +0 -364
- data/lib/ast/merge/toml_frontmatter_detector.rb +0 -88
- 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:
|
|
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:
|
|
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:
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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/
|
|
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/
|
|
280
|
-
- lib/ast/merge/
|
|
281
|
-
- lib/ast/merge/
|
|
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/
|
|
312
|
-
changelog_uri: https://github.com/kettle-rb/ast-merge/blob/
|
|
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/
|
|
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.
|
|
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
|