ruby-merge 7.1.3 → 7.1.4

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.
data/lib/ruby/merge.rb CHANGED
@@ -1,12 +1,32 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'digest'
4
- require 'prism/merge'
5
4
  require 'tree_haver'
6
5
  require 'ast/merge'
7
6
  require_relative 'merge/version'
7
+ require_relative 'merge/block_directive_detector'
8
+ require_relative 'merge/block_binding_support'
9
+ require_relative 'merge/doc_comment_support'
10
+ require_relative 'merge/gemspec_support'
11
+ require_relative 'merge/magic_comment_support'
12
+ require_relative 'merge/method_similarity'
13
+ require_relative 'merge/nocov_node_base'
14
+ require_relative 'merge/nocov_wrapper_base'
15
+ require_relative 'merge/rescue_semantics'
16
+ require_relative 'merge/scaffold_chunk_support'
17
+ require_relative 'merge/signature_support'
8
18
 
9
19
  module Ruby
20
+ # Public Ruby parser-family substrate for Structured Merge.
21
+ #
22
+ # The adapter deliberately keeps parser capability reporting, ownership
23
+ # discovery, merge planning, and source reconstruction together. Splitting
24
+ # those phases to satisfy generic size metrics would obscure the contract
25
+ # they implement and make provider behavior harder to audit.
26
+ # rubocop:disable Metrics/AbcSize, Metrics/BlockLength, Metrics/BlockNesting
27
+ # rubocop:disable Metrics/ClassLength, Metrics/CyclomaticComplexity, Metrics/MethodLength
28
+ # rubocop:disable Metrics/ModuleLength, Metrics/PerceivedComplexity
29
+ # rubocop:disable Style/MultilineBlockChain
10
30
  module Merge
11
31
  extend self
12
32
  include Ast::Merge::SourceRegionReportSupport
@@ -29,7 +49,11 @@ module Ruby
29
49
  REQUIRE_PATTERN = /^\s*require(?:_relative)?\s+["']([^"']+)["']/
30
50
  CLASS_PATTERN = /^\s*class\s+([A-Z]\w*(?:::\w+)*)/
31
51
  MODULE_PATTERN = /^\s*module\s+([A-Z]\w*(?:::\w+)*)/
32
- DEF_PATTERN = %r{^\s*def\s+((?:self\.)?)([a-zA-Z_]\w*[!?=]?|\[\]=?|\+@|-@|\*\*|<<|>>|<=>|===|==|=~|!~|!=|[+\-*/%&|^<>]=?|[!~`])}
52
+ DEF_PATTERN = %r{
53
+ ^\s*def\s+
54
+ ((?:self\.)?)
55
+ ([a-zA-Z_]\w*[!?=]?|\[\]=?|\+@|-@|\*\*|<<|>>|<=>|===|==|=~|!~|!=|[+\-*/%&|^<>]=?|[!~`])
56
+ }x
33
57
  CONSTANT_ASSIGNMENT_PATTERN = /^(\s*)([A-Z]\w*)\s*=/
34
58
  CONSTANT_HASH_ASSIGNMENT_PATTERN = /^(\s*)([A-Z]\w*)\s*=\s*\{/
35
59
 
@@ -155,13 +179,16 @@ module Ruby
155
179
  template_methods = ruby_method_projection(template_source, revision: 'template')
156
180
  destination_methods = ruby_method_projection(destination_source, revision: 'destination')
157
181
  destination_by_signature = destination_methods.to_h { |entry| [entry[:signature], entry] }
158
- template_signatures = template_methods.map { |entry| entry[:signature] }.to_h { |signature| [signature, true] }
182
+ template_signatures = template_methods
183
+ .map { |entry| entry[:signature] }
184
+ .to_h { |signature| [signature, true] }
159
185
 
160
186
  matches = template_methods.filter_map do |template_entry|
161
187
  destination_entry = destination_by_signature[template_entry[:signature]]
162
188
  next unless destination_entry
163
189
 
164
- moved = template_entry[:index] != destination_entry[:index] || template_entry[:parent_path] != destination_entry[:parent_path]
190
+ moved = template_entry[:index] != destination_entry[:index] ||
191
+ template_entry[:parent_path] != destination_entry[:parent_path]
165
192
  Ast::Merge::MoveDetectionMatch.new(
166
193
  from_path: template_entry[:path],
167
194
  to_path: destination_entry[:path],
@@ -174,7 +201,13 @@ module Ruby
174
201
  from_index: template_entry[:index],
175
202
  to_index: destination_entry[:index],
176
203
  confidence: moved ? 0.98 : 0.9,
177
- diagnostics: [moved ? 'same Ruby method signature observed at a different sibling position' : 'same Ruby method signature observed at the same sibling position']
204
+ diagnostics: [
205
+ if moved
206
+ 'same Ruby method signature observed at a different sibling position'
207
+ else
208
+ 'same Ruby method signature observed at the same sibling position'
209
+ end
210
+ ]
178
211
  )
179
212
  end
180
213
 
@@ -197,7 +230,9 @@ module Ruby
197
230
  unmatched_to: destination_methods.reject do |entry|
198
231
  template_signatures[entry[:signature]]
199
232
  end.map { |entry| entry[:path] },
200
- diagnostics: ['Ruby method move detection uses generic move-detection matching over receiver-aware method projections']
233
+ diagnostics: [
234
+ 'Ruby method move detection uses generic move-detection matching over receiver-aware method projections'
235
+ ]
201
236
  ).to_h
202
237
  end
203
238
 
@@ -232,12 +267,15 @@ module Ruby
232
267
  template_declarations_by_key = template_declarations.to_h { |entry| [entry[:merge_key], entry] }
233
268
  intra_owner_merges = ruby_intra_owner_merge_plan(template_declarations, destination_declarations)
234
269
  namespace_conflicts = ruby_namespace_form_conflicts(template_declarations, destination_declarations)
235
- unless namespace_conflicts.empty? || TreeHaver::BackendRegistry.tag_available?(:tslp_ruby_namespace_form_equivalence)
270
+ namespace_equivalence_available = TreeHaver::BackendRegistry.tag_available?(
271
+ :tslp_ruby_namespace_form_equivalence
272
+ )
273
+ unless namespace_conflicts.empty? || namespace_equivalence_available
236
274
  conflicts = namespace_conflicts.join(', ')
237
275
  return unsupported_feature_result(
238
276
  'ruby-merge cannot reconcile equivalent Ruby namespace declaration forms with the active TSLP records: ' \
239
- "#{conflicts}. Use prism-merge for native Ruby merging, or report missing Ruby namespace ownership " \
240
- 'records to tree-sitter-language-pack.'
277
+ "#{conflicts}. Use a native Ruby provider for native Ruby merging, or report missing Ruby namespace " \
278
+ 'ownership records to tree-sitter-language-pack.'
241
279
  )
242
280
  end
243
281
  if !namespace_conflicts.empty? && TreeHaver::BackendRegistry.tag_available?(:tslp_ruby_namespace_form_equivalence)
@@ -413,7 +451,8 @@ module Ruby
413
451
  {
414
452
  severity: 'info',
415
453
  category: 'source_owner_identity_matching',
416
- message: 'Ruby source-owner matching reports confidence per match and uses ordered structural pairing for duplicate identities.'
454
+ message: 'Ruby source-owner matching reports confidence per match and uses ordered structural pairing ' \
455
+ 'for duplicate identities.'
417
456
  }
418
457
  ]
419
458
  }
@@ -637,7 +676,11 @@ module Ruby
637
676
  {
638
677
  severity: owners_preserved ? 'info' : 'error',
639
678
  category: owners_preserved ? 'formatter_adapter_accepted' : 'formatter_adapter_rejected',
640
- message: owners_preserved ? 'Ruby formatter adapter preserved owner identity, conflict scope, and validation semantics.' : 'Ruby formatter adapter changed owner identity and cannot be accepted as a semantic merge.'
679
+ message: if owners_preserved
680
+ 'Ruby formatter adapter preserved owner identity, conflict scope, and validation semantics.'
681
+ else
682
+ 'Ruby formatter adapter changed owner identity and cannot be accepted as a semantic merge.'
683
+ end
641
684
  }
642
685
  ]
643
686
  }
@@ -683,7 +726,12 @@ module Ruby
683
726
  {
684
727
  severity: reconstruction_risk ? 'warning' : 'info',
685
728
  category: reconstruction_risk ? 'ast_node_reconstruction_risk' : 'ast_node_merge_candidate',
686
- message: reconstruction_risk ? 'Ruby AST-node merge candidate has ambiguous whitespace, comment, or marker reconstruction boundaries.' : 'Ruby AST-node merge candidate can be considered when owner-level fallback would be too blunt.'
729
+ message: if reconstruction_risk
730
+ 'Ruby AST-node merge candidate has ambiguous whitespace, comment, or marker ' \
731
+ 'reconstruction boundaries.'
732
+ else
733
+ 'Ruby AST-node merge candidate can be considered when owner-level fallback would be too blunt.'
734
+ end
687
735
  }
688
736
  ]
689
737
  }
@@ -805,7 +853,12 @@ module Ruby
805
853
  {
806
854
  severity: widened ? 'error' : 'info',
807
855
  category: widened ? 'fallback_scope_widening_rejected' : 'fallback_scope_accepted',
808
- message: widened ? "Ruby fallback cannot widen from #{declared_scope} to #{requested_scope} without an explicit policy." : 'Ruby fallback scope is within the declared policy.'
856
+ message: if widened
857
+ "Ruby fallback cannot widen from #{declared_scope} to #{requested_scope} without an " \
858
+ 'explicit policy.'
859
+ else
860
+ 'Ruby fallback scope is within the declared policy.'
861
+ end
809
862
  }
810
863
  ]
811
864
  }
@@ -946,7 +999,8 @@ module Ruby
946
999
  {
947
1000
  severity: 'info',
948
1001
  category: 'ruby_rename_detection',
949
- message: 'Ruby rename detection is explicit and reports clean same-parent method renames by normalized body hash.'
1002
+ message: 'Ruby rename detection is explicit and reports clean same-parent method renames ' \
1003
+ 'by normalized body hash.'
950
1004
  }
951
1005
  ]
952
1006
  end,
@@ -1051,7 +1105,8 @@ module Ruby
1051
1105
  {
1052
1106
  severity: 'info',
1053
1107
  category: 'ruby_cross_container_method_move',
1054
- message: 'Ruby detected same-signature method movement across containers while preserving destination order.'
1108
+ message: 'Ruby detected same-signature method movement across containers while preserving ' \
1109
+ 'destination order.'
1055
1110
  }
1056
1111
  ]
1057
1112
  end
@@ -1152,7 +1207,13 @@ module Ruby
1152
1207
  execution = Array(replay_bundle[:reviewed_nested_executions]).find { |entry| entry[:family] == 'ruby' }
1153
1208
  unless execution
1154
1209
  return { ok: false,
1155
- diagnostics: [{ severity: 'error', category: 'configuration_error', message: 'review replay bundle does not include a reviewed nested execution for ruby.' }], policies: [] }
1210
+ diagnostics: [
1211
+ {
1212
+ severity: 'error',
1213
+ category: 'configuration_error',
1214
+ message: 'review replay bundle does not include a reviewed nested execution for ruby.'
1215
+ }
1216
+ ], policies: [] }
1156
1217
  end
1157
1218
 
1158
1219
  merge_ruby_with_reviewed_nested_outputs(
@@ -1169,7 +1230,13 @@ module Ruby
1169
1230
  execution = Array(review_state[:reviewed_nested_executions]).find { |entry| entry[:family] == 'ruby' }
1170
1231
  unless execution
1171
1232
  return { ok: false,
1172
- diagnostics: [{ severity: 'error', category: 'configuration_error', message: 'review state does not include a reviewed nested execution for ruby.' }], policies: [] }
1233
+ diagnostics: [
1234
+ {
1235
+ severity: 'error',
1236
+ category: 'configuration_error',
1237
+ message: 'review state does not include a reviewed nested execution for ruby.'
1238
+ }
1239
+ ], policies: [] }
1173
1240
  end
1174
1241
 
1175
1242
  merge_ruby_with_reviewed_nested_outputs(
@@ -1186,7 +1253,9 @@ module Ruby
1186
1253
  replay_bundle, import_error = Ast::Merge.import_review_replay_bundle_envelope(envelope)
1187
1254
  if import_error
1188
1255
  return { ok: false,
1189
- diagnostics: [{ severity: 'error', category: import_error[:category], message: import_error[:message] }], policies: [] }
1256
+ diagnostics: [
1257
+ { severity: 'error', category: import_error[:category], message: import_error[:message] }
1258
+ ], policies: [] }
1190
1259
  end
1191
1260
 
1192
1261
  merge_ruby_with_reviewed_nested_outputs_from_replay_bundle(
@@ -1202,7 +1271,9 @@ module Ruby
1202
1271
  review_state, import_error = Ast::Merge.import_conformance_manifest_review_state_envelope(envelope)
1203
1272
  if import_error
1204
1273
  return { ok: false,
1205
- diagnostics: [{ severity: 'error', category: import_error[:category], message: import_error[:message] }], policies: [] }
1274
+ diagnostics: [
1275
+ { severity: 'error', category: import_error[:category], message: import_error[:message] }
1276
+ ], policies: [] }
1206
1277
  end
1207
1278
 
1208
1279
  merge_ruby_with_reviewed_nested_outputs_from_review_state(
@@ -1505,7 +1576,9 @@ module Ruby
1505
1576
  unsupported_lines = ruby_tslp_unsupported_top_level_lines(source, process_analysis)
1506
1577
  unless unsupported_lines.empty?
1507
1578
  return unsupported_feature_result(
1508
- "ruby-merge can only merge TSLP-record-backed top-level Ruby declarations and imports; #{role} has unsupported top-level content on line(s) #{unsupported_lines.join(', ')}. Use prism-merge for native Ruby merging, or report missing Ruby process records to tree-sitter-language-pack."
1579
+ "ruby-merge can only merge TSLP-record-backed top-level Ruby declarations and imports; #{role} has " \
1580
+ "unsupported top-level content on line(s) #{unsupported_lines.join(', ')}. Use a native Ruby provider " \
1581
+ 'for native Ruby merging, or report missing Ruby process records to tree-sitter-language-pack.'
1509
1582
  )
1510
1583
  end
1511
1584
 
@@ -1956,13 +2029,16 @@ module Ruby
1956
2029
  severity: 'warning',
1957
2030
  category: 'ruby_method_shadowing',
1958
2031
  path: "#{entry[:owner_path]}/methods/#{entry[:method_signature]}",
1959
- message: "Ruby method #{entry[:method_signature]} is defined #{entry[:shadowed_count] + 1} times in #{entry[:owner_path]}; the last definition shadows earlier definitions."
2032
+ message: "Ruby method #{entry[:method_signature]} is defined #{entry[:shadowed_count] + 1} times in " \
2033
+ "#{entry[:owner_path]}; the last definition shadows earlier definitions."
1960
2034
  }
1961
2035
  end
1962
2036
  end
1963
2037
 
1964
2038
  def direct_method_shadowing(declaration_entry)
1965
- grouped = direct_body_method_entries(declaration_entry[:text]).each_with_index.group_by do |(method_entry, _index)|
2039
+ grouped = direct_body_method_entries(declaration_entry[:text])
2040
+ .each_with_index
2041
+ .group_by do |(method_entry, _index)|
1966
2042
  method_entry[:signature]
1967
2043
  end
1968
2044
 
@@ -2087,9 +2163,8 @@ module Ruby
2087
2163
  template_match = template_text.match(/\A(\s*[A-Z]\w*\s*=\s*)\[(.*)\]\z/)
2088
2164
  destination_match = destination_text.match(/\A(\s*[A-Z]\w*\s*=\s*)\[(.*)\]\z/)
2089
2165
  unless template_match && destination_match
2090
- return merge_percent_array_constant_text(template_text,
2091
- destination_text) || merge_multiline_array_constant_text(template_text,
2092
- destination_text)
2166
+ return merge_percent_array_constant_text(template_text, destination_text) ||
2167
+ merge_multiline_array_constant_text(template_text, destination_text)
2093
2168
  end
2094
2169
 
2095
2170
  destination_elements = split_ruby_array_elements(destination_match[2])
@@ -2266,7 +2341,11 @@ module Ruby
2266
2341
  if declaration
2267
2342
  start_index = pending_comments.first || index
2268
2343
  finish_index = ruby_block_finish_index(lines, index)
2269
- address = declaration[:kind] == 'def' ? "/methods/#{declaration[:name]}" : "/declarations/#{declaration[:name]}"
2344
+ address = if declaration[:kind] == 'def'
2345
+ "/methods/#{declaration[:name]}"
2346
+ else
2347
+ "/declarations/#{declaration[:name]}"
2348
+ end
2270
2349
  owner = {
2271
2350
  region_id: "#{declaration[:kind] == 'def' ? 'method' : 'declaration'}:#{declaration[:name]}",
2272
2351
  region_kind: 'owner',
@@ -2280,8 +2359,9 @@ module Ruby
2280
2359
  declaration_span: source_report_line_span(index, finish_index),
2281
2360
  content: source_report_region_content(lines, start_index, finish_index)
2282
2361
  }
2283
- owner[:child_regions] = container_child_source_regions(lines, declaration, index, finish_index) if %w[class
2284
- module].include?(declaration[:kind])
2362
+ if %w[class module].include?(declaration[:kind])
2363
+ owner[:child_regions] = container_child_source_regions(lines, declaration, index, finish_index)
2364
+ end
2285
2365
  attached_comments = source_attached_comment_regions_for_report(
2286
2366
  lines: lines,
2287
2367
  start_index: start_index,
@@ -2379,6 +2459,7 @@ module Ruby
2379
2459
  RubyHashPair = Struct.new(:key, :key_source, :delimiter, :value, keyword_init: true)
2380
2460
  RubyScalarNode = Struct.new(:source, keyword_init: true)
2381
2461
 
2462
+ # Projects Ruby hash literals into source-preserving merge nodes.
2382
2463
  class RubyHashLiteralProjector
2383
2464
  def initialize(source)
2384
2465
  @source = source.to_s
@@ -3129,12 +3210,14 @@ module Ruby
3129
3210
  :collect_ruby_declaration_entries,
3130
3211
  :unsupported_feature_result
3131
3212
  )
3213
+ # rubocop:enable Style/MultilineBlockChain
3214
+ # rubocop:enable Metrics/ModuleLength, Metrics/PerceivedComplexity
3215
+ # rubocop:enable Metrics/ClassLength, Metrics/CyclomaticComplexity, Metrics/MethodLength
3216
+ # rubocop:enable Metrics/AbcSize, Metrics/BlockLength, Metrics/BlockNesting
3132
3217
  end
3133
3218
  end
3134
3219
 
3135
3220
  Ruby::Merge.register_backend!
3136
- require_relative 'merge/provider'
3137
- Ruby::Merge.register_provider!
3138
3221
 
3139
3222
  TreeHaver::BackendRegistry.register_tag(
3140
3223
  :tslp_ruby_import_records,
data/sig/ruby/merge.rbs CHANGED
@@ -1,18 +1,5 @@
1
1
  module Ruby
2
2
  module Merge
3
- class Provider
4
- def provider_id: () -> String
5
- def family: () -> String
6
- def capabilities: () -> Hash[Symbol, untyped]
7
- def analyze: (Hash[Symbol, untyped] request) -> Hash[Symbol, untyped]
8
- def diff2: (Hash[Symbol, untyped] request) -> Hash[Symbol, untyped]
9
- def merge2: (Hash[Symbol, untyped] request) -> Hash[Symbol, untyped]
10
- def merge3: (Hash[Symbol, untyped] request) -> Hash[Symbol, untyped]
11
- end
12
-
13
- def self.merge_provider: () -> Provider
14
- def self.register_provider!: (?replace: bool) -> untyped
15
-
16
3
  module Version
17
4
  VERSION: String
18
5
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-merge
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.1.3
4
+ version: 7.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -43,42 +43,28 @@ dependencies:
43
43
  requirements:
44
44
  - - '='
45
45
  - !ruby/object:Gem::Version
46
- version: 7.1.3
46
+ version: 7.1.4
47
47
  type: :runtime
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - '='
52
52
  - !ruby/object:Gem::Version
53
- version: 7.1.3
54
- - !ruby/object:Gem::Dependency
55
- name: prism-merge
56
- requirement: !ruby/object:Gem::Requirement
57
- requirements:
58
- - - '='
59
- - !ruby/object:Gem::Version
60
- version: 7.1.3
61
- type: :runtime
62
- prerelease: false
63
- version_requirements: !ruby/object:Gem::Requirement
64
- requirements:
65
- - - '='
66
- - !ruby/object:Gem::Version
67
- version: 7.1.3
53
+ version: 7.1.4
68
54
  - !ruby/object:Gem::Dependency
69
55
  name: tree_haver
70
56
  requirement: !ruby/object:Gem::Requirement
71
57
  requirements:
72
58
  - - '='
73
59
  - !ruby/object:Gem::Version
74
- version: 7.1.3
60
+ version: 7.1.4
75
61
  type: :runtime
76
62
  prerelease: false
77
63
  version_requirements: !ruby/object:Gem::Requirement
78
64
  requirements:
79
65
  - - '='
80
66
  - !ruby/object:Gem::Version
81
- version: 7.1.3
67
+ version: 7.1.4
82
68
  - !ruby/object:Gem::Dependency
83
69
  name: version_gem
84
70
  requirement: !ruby/object:Gem::Requirement
@@ -108,7 +94,7 @@ dependencies:
108
94
  version: '3.0'
109
95
  - - ">="
110
96
  - !ruby/object:Gem::Version
111
- version: 3.0.0
97
+ version: 3.0.7
112
98
  type: :development
113
99
  prerelease: false
114
100
  version_requirements: !ruby/object:Gem::Requirement
@@ -118,7 +104,7 @@ dependencies:
118
104
  version: '3.0'
119
105
  - - ">="
120
106
  - !ruby/object:Gem::Version
121
- version: 3.0.0
107
+ version: 3.0.7
122
108
  - !ruby/object:Gem::Dependency
123
109
  name: bundler-audit
124
110
  requirement: !ruby/object:Gem::Requirement
@@ -216,7 +202,7 @@ dependencies:
216
202
  version: '2.0'
217
203
  - - ">="
218
204
  - !ruby/object:Gem::Version
219
- version: 2.0.19
205
+ version: 2.0.20
220
206
  type: :development
221
207
  prerelease: false
222
208
  version_requirements: !ruby/object:Gem::Requirement
@@ -226,7 +212,7 @@ dependencies:
226
212
  version: '2.0'
227
213
  - - ">="
228
214
  - !ruby/object:Gem::Version
229
- version: 2.0.19
215
+ version: 2.0.20
230
216
  - !ruby/object:Gem::Dependency
231
217
  name: turbo_tests2
232
218
  requirement: !ruby/object:Gem::Requirement
@@ -236,7 +222,7 @@ dependencies:
236
222
  version: '3.2'
237
223
  - - ">="
238
224
  - !ruby/object:Gem::Version
239
- version: 3.2.5
225
+ version: 3.2.6
240
226
  type: :development
241
227
  prerelease: false
242
228
  version_requirements: !ruby/object:Gem::Requirement
@@ -246,7 +232,7 @@ dependencies:
246
232
  version: '3.2'
247
233
  - - ">="
248
234
  - !ruby/object:Gem::Version
249
- version: 3.2.5
235
+ version: 3.2.6
250
236
  - !ruby/object:Gem::Dependency
251
237
  name: ruby-progressbar
252
238
  requirement: !ruby/object:Gem::Requirement
@@ -290,7 +276,7 @@ dependencies:
290
276
  version: '2.0'
291
277
  - - ">="
292
278
  - !ruby/object:Gem::Version
293
- version: 2.0.11
279
+ version: 2.0.12
294
280
  type: :development
295
281
  prerelease: false
296
282
  version_requirements: !ruby/object:Gem::Requirement
@@ -300,7 +286,7 @@ dependencies:
300
286
  version: '2.0'
301
287
  - - ">="
302
288
  - !ruby/object:Gem::Version
303
- version: 2.0.11
289
+ version: 2.0.12
304
290
  description: "☯️ Tree-sitter-backed Ruby family substrate for Structured Merge."
305
291
  email:
306
292
  - floss@galtzo.com
@@ -312,7 +298,17 @@ files:
312
298
  - README.md
313
299
  - lib/ruby-merge.rb
314
300
  - lib/ruby/merge.rb
315
- - lib/ruby/merge/provider.rb
301
+ - lib/ruby/merge/block_binding_support.rb
302
+ - lib/ruby/merge/block_directive_detector.rb
303
+ - lib/ruby/merge/doc_comment_support.rb
304
+ - lib/ruby/merge/gemspec_support.rb
305
+ - lib/ruby/merge/magic_comment_support.rb
306
+ - lib/ruby/merge/method_similarity.rb
307
+ - lib/ruby/merge/nocov_node_base.rb
308
+ - lib/ruby/merge/nocov_wrapper_base.rb
309
+ - lib/ruby/merge/rescue_semantics.rb
310
+ - lib/ruby/merge/scaffold_chunk_support.rb
311
+ - lib/ruby/merge/signature_support.rb
316
312
  - lib/ruby/merge/version.rb
317
313
  - sig/ruby/merge.rbs
318
314
  homepage: https://github.com/structuredmerge/structuredmerge-ruby
@@ -321,10 +317,10 @@ licenses:
321
317
  - PolyForm-Small-Business-1.0.0
322
318
  metadata:
323
319
  homepage_uri: https://structuredmerge.org
324
- source_code_uri: https://github.com/structuredmerge/structuredmerge-ruby/tree/v7.1.3
325
- changelog_uri: https://github.com/structuredmerge/structuredmerge-ruby/blob/v7.1.3/CHANGELOG.md
320
+ source_code_uri: https://github.com/structuredmerge/structuredmerge-ruby/tree/v7.1.4
321
+ changelog_uri: https://github.com/structuredmerge/structuredmerge-ruby/blob/v7.1.4/CHANGELOG.md
326
322
  bug_tracker_uri: https://github.com/structuredmerge/structuredmerge-ruby/issues
327
- documentation_uri: https://www.rubydoc.info/gems/ruby-merge/7.1.3
323
+ documentation_uri: https://www.rubydoc.info/gems/ruby-merge/7.1.4
328
324
  funding_uri: https://github.com/sponsors/pboling
329
325
  wiki_uri: https://github.com/structuredmerge/structuredmerge-ruby/wiki
330
326
  news_uri: https://www.railsbling.com/tags/ruby-merge
metadata.gz.sig CHANGED
Binary file
@@ -1,77 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Ruby
4
- # Portable Ruby workflow integration.
5
- module Merge
6
- # Ruby workflow selector delegating source-preserving operations to Prism.
7
- class Provider
8
- BACKEND = :prism
9
- DELEGATED_PROVIDER_ID = 'ruby.ruby.prism'
10
- DEFAULT_PROFILE = :source_preserving
11
-
12
- def provider_id = 'ruby.ruby'
13
- def family = 'ruby'
14
-
15
- def capabilities
16
- {
17
- operations: Ast::Merge::ProviderContract::OPERATIONS,
18
- dialects: %i[ruby],
19
- backends: [BACKEND],
20
- profiles: [DEFAULT_PROFILE],
21
- role: :workflow,
22
- source_preservation: Prism::Merge.merge_provider.capabilities.fetch(:source_preservation)
23
- }.freeze
24
- end
25
-
26
- Ast::Merge::ProviderContract::OPERATIONS.each do |operation|
27
- define_method(operation) do |request|
28
- delegated = Ast::Merge.dispatch_provider(operation, delegated_request(request))
29
- delegated.merge(provider: workflow_identity(request, delegated))
30
- end
31
- end
32
-
33
- private
34
-
35
- def delegated_request(request)
36
- request.merge(
37
- provider_id: DELEGATED_PROVIDER_ID,
38
- family: :ruby,
39
- dialect: :ruby,
40
- backend: BACKEND,
41
- profile_id: DEFAULT_PROFILE
42
- )
43
- end
44
-
45
- def workflow_identity(request, delegated)
46
- {
47
- provider_id: provider_id,
48
- family: family,
49
- dialect: request[:dialect] || :ruby,
50
- backend: request[:backend] || BACKEND,
51
- package: PACKAGE_NAME,
52
- package_version: Ruby::Merge::Version::VERSION,
53
- delegated_provider: delegated_identity(delegated.fetch(:provider))
54
- }
55
- end
56
-
57
- def delegated_identity(identity)
58
- {
59
- provider_id: identity.fetch(:provider_id),
60
- backend: identity.fetch(:backend),
61
- package: identity[:package],
62
- package_version: identity[:package_version]
63
- }.compact
64
- end
65
- end
66
-
67
- class << self
68
- def merge_provider
69
- @merge_provider ||= Provider.new
70
- end
71
-
72
- def register_provider!(replace: false)
73
- Ast::Merge.register_provider(merge_provider, replace: replace)
74
- end
75
- end
76
- end
77
- end