ruby-merge 7.1.7 → 7.1.8

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3fe81963d8a127dc0c316c3db4954c5fa83122a97461bee2e40b65d51640c556
4
- data.tar.gz: b9ebdf14cfc5ecfe2f099403d88419aa736cd076c93837c6cc440710f35fb54c
3
+ metadata.gz: 3ad386abb55c17bd12f237caa2346764e139be3b41b7eac8ffddadaf3175d900
4
+ data.tar.gz: 7a5ab555bc1666ab70647e9bac922e18467deac2fb89aca5c8b8ceaab27b9665
5
5
  SHA512:
6
- metadata.gz: dc1bc8f1d760efb7359eb0c9b47c9949afce1f7d4235fd474c8082b6beea9824ab813c0b3dc48a344a59eb0f7cf9191c83121454dc442c922ac5258936b99014
7
- data.tar.gz: 86b6e8f5e072ebbc338a33008f3f56d4ea4d9df1e73695498c9190d13ca865af63fd0d63e313657e6cbc77bea9c657d174e1243f0ff822cea20bf249fa23bec1
6
+ metadata.gz: ec65095a788ce87f2fdc8c5deb489030170ce937d41fc473ee1f53ce5778c5ff63094efc1d3299c26e0603f2814d4baea2cffc5e58c4972ddf715f8c09e7a7a2
7
+ data.tar.gz: bd9b63295946ebedd81a2803e5efd0a99b0bbb33b4d26ec070f6d509347bf38949071252be823e7f08e653dfdd56e4eaab523f338dc54b18aad0dd2571e409a8
checksums.yaml.gz.sig CHANGED
Binary file
@@ -0,0 +1,238 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ruby
4
+ # Ruby workflow provider integration.
5
+ module Merge
6
+ # Tree-sitter workflow provider backed by the shared Ruby substrate.
7
+ # rubocop:disable Metrics/AbcSize, Metrics/ClassLength, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/ParameterLists, Metrics/PerceivedComplexity -- provider operations keep request, rendering, and result-envelope logic together
8
+ class Provider
9
+ DEFAULT_PROFILE = :source_preserving
10
+ TREE_SITTER_BACKENDS = [
11
+ *TreeHaver::NATIVE_BACKENDS,
12
+ :tslp,
13
+ :'kreuzberg-language-pack'
14
+ ].freeze
15
+
16
+ def provider_id = 'ruby.ruby'
17
+ def family = 'ruby'
18
+
19
+ def capabilities
20
+ {
21
+ operations: Ast::Merge::ProviderContract::OPERATIONS,
22
+ dialects: %i[ruby],
23
+ backends: TREE_SITTER_BACKENDS,
24
+ profiles: [DEFAULT_PROFILE],
25
+ role: :workflow,
26
+ parser_requirements: {
27
+ allowed_backend_families: ['tree-sitter'],
28
+ denied_backend_ids: ['prism'],
29
+ required_capabilities: %w[normalized-nodes exact-byte-spans]
30
+ },
31
+ source_preservation: %i[exact_source owner_fragments line_provenance reparse]
32
+ }.freeze
33
+ end
34
+
35
+ def analyze(request)
36
+ parsed = parse_source(request.fetch(:source), request)
37
+ return parse_failure(:analyze, :source, parsed, request) unless parsed[:ok]
38
+
39
+ result(
40
+ :analyze,
41
+ request,
42
+ analysis: parsed.fetch(:analysis),
43
+ verification: { source_parsed: true }
44
+ )
45
+ end
46
+
47
+ def diff2(request)
48
+ before = parse_source(request.fetch(:before_source), request)
49
+ return parse_failure(:diff2, :before, before, request) unless before[:ok]
50
+
51
+ after = parse_source(request.fetch(:after_source), request)
52
+ return parse_failure(:diff2, :after, after, request) unless after[:ok]
53
+
54
+ changes = owner_changes(
55
+ request.fetch(:before_source),
56
+ request.fetch(:after_source)
57
+ )
58
+ result(
59
+ :diff2,
60
+ request,
61
+ diff: { changes: changes },
62
+ changes: changes,
63
+ verification: { before_parsed: true, after_parsed: true }
64
+ )
65
+ end
66
+
67
+ def merge2(request)
68
+ merged = Ruby::Merge.merge_ruby(
69
+ request.fetch(:incoming_source),
70
+ request.fetch(:current_source),
71
+ 'ruby',
72
+ backend: request[:backend]
73
+ )
74
+ return substrate_failure(:merge2, merged, request) unless merged[:ok]
75
+
76
+ output = merged.fetch(:output)
77
+ verified = parse_source(output, request)
78
+ return parse_failure(:merge2, :output, verified, request, category: :render_failure) unless verified[:ok]
79
+
80
+ result(
81
+ :merge2,
82
+ request,
83
+ output: output,
84
+ render_report: { strategy: :ruby_substrate, synthesis: :family_emission },
85
+ verification: { output_reparsed: true }
86
+ )
87
+ end
88
+
89
+ def merge3(request)
90
+ parsed = %i[base ours theirs].to_h do |role|
91
+ result = parse_source(request.fetch(:"#{role}_source"), request)
92
+ return parse_failure(:merge3, role, result, request) unless result[:ok]
93
+
94
+ [role, result]
95
+ end
96
+ winner = exact_revision_role(request)
97
+ unless winner
98
+ return failure(
99
+ :merge3,
100
+ request,
101
+ category: :unsupported_capability,
102
+ message: 'ruby-merge has not proven composite three-way merging for tree-sitter runtimes.',
103
+ verification: { base_participated: true }
104
+ )
105
+ end
106
+
107
+ output = request.fetch(:"#{winner}_source")
108
+ result(
109
+ :merge3,
110
+ request,
111
+ output: output,
112
+ render_report: { strategy: :exact_revision, source_role: winner },
113
+ verification: {
114
+ base_participated: true,
115
+ output_reparsed: parsed.fetch(winner)[:ok],
116
+ byte_exact: true,
117
+ source_role: winner
118
+ }
119
+ )
120
+ end
121
+
122
+ private
123
+
124
+ def parse_source(source, request)
125
+ Ruby::Merge.parse_ruby(source, 'ruby', backend: request[:backend])
126
+ end
127
+
128
+ def owner_changes(before_source, after_source)
129
+ before = Ruby::Merge.ruby_source_owner_identity_profile(before_source)
130
+ after = Ruby::Merge.ruby_source_owner_identity_profile(after_source)
131
+ before_by_identity = before.to_h { |owner| [owner[:structural_identity], owner] }
132
+ after_by_identity = after.to_h { |owner| [owner[:structural_identity], owner] }
133
+ [*before_by_identity.keys, *after_by_identity.keys].uniq.filter_map do |identity|
134
+ left = before_by_identity[identity]
135
+ right = after_by_identity[identity]
136
+ next if left == right
137
+
138
+ {
139
+ path: right&.fetch(:address) || left.fetch(:address),
140
+ before: left ? :present : :absent,
141
+ after: right ? :present : :absent,
142
+ change: if left.nil?
143
+ :added
144
+ elsif right.nil?
145
+ :deleted
146
+ else
147
+ :edited
148
+ end
149
+ }.freeze
150
+ end.freeze
151
+ end
152
+
153
+ def exact_revision_role(request)
154
+ base = request.fetch(:base_source)
155
+ ours = request.fetch(:ours_source)
156
+ theirs = request.fetch(:theirs_source)
157
+ return :ours if ours == theirs || base == theirs
158
+
159
+ :theirs if base == ours
160
+ end
161
+
162
+ def parse_failure(operation, role, parsed, request, category: :parse_error)
163
+ diagnostic = Array(parsed[:diagnostics]).first || {}
164
+ failure(
165
+ operation,
166
+ request,
167
+ category: category,
168
+ message: "#{role} parse error: #{diagnostic[:message] || 'Ruby parse failed'}",
169
+ source_role: role,
170
+ verification: operation == :merge3 ? { base_participated: true } : {}
171
+ )
172
+ end
173
+
174
+ def substrate_failure(operation, merged, request)
175
+ diagnostic = Array(merged[:diagnostics]).first || {}
176
+ failure(
177
+ operation,
178
+ request,
179
+ category: (diagnostic[:category] || :merge_failure).to_sym,
180
+ message: diagnostic[:message] || 'Ruby substrate merge failed.'
181
+ )
182
+ end
183
+
184
+ def result(operation, request, changes: [], diagnostics: [], render_report: {}, verification: {}, **payload)
185
+ Ast::Merge::ProviderResult.build(
186
+ operation: operation,
187
+ success: true,
188
+ envelope: envelope(
189
+ request,
190
+ changes: changes,
191
+ diagnostics: diagnostics,
192
+ render_report: render_report,
193
+ verification: verification
194
+ ),
195
+ **payload
196
+ )
197
+ end
198
+
199
+ def failure(operation, request, category:, message:, verification: {}, **payload)
200
+ Ast::Merge::ProviderResult.build(
201
+ operation: operation,
202
+ success: false,
203
+ envelope: envelope(
204
+ request,
205
+ diagnostics: [{ category: category, severity: :error, message: message, blocking: true }],
206
+ verification: verification
207
+ ),
208
+ **payload
209
+ )
210
+ end
211
+
212
+ def envelope(request, **fields)
213
+ {
214
+ provider: {
215
+ provider_id: provider_id,
216
+ family: family,
217
+ dialect: request[:dialect] || :ruby,
218
+ backend: request[:backend] || :'kreuzberg-language-pack',
219
+ package: Ruby::Merge::PACKAGE_NAME,
220
+ package_version: Ruby::Merge::Version::VERSION
221
+ },
222
+ profile: { profile_id: request[:profile_id] || DEFAULT_PROFILE }
223
+ }.merge(fields)
224
+ end
225
+ end
226
+ # rubocop:enable Metrics/AbcSize, Metrics/ClassLength, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/ParameterLists, Metrics/PerceivedComplexity
227
+
228
+ class << self
229
+ def merge_provider
230
+ @merge_provider ||= Provider.new
231
+ end
232
+
233
+ def register_provider!(replace: false)
234
+ Ast::Merge.register_provider(merge_provider, replace: replace)
235
+ end
236
+ end
237
+ end
238
+ end
@@ -5,7 +5,7 @@ module Ruby
5
5
  # Version namespace for this gem.
6
6
  module Version
7
7
  # Current gem version.
8
- VERSION = '7.1.7'
8
+ VERSION = '7.1.8'
9
9
  end
10
10
  # Current gem version exposed at the traditional constant location.
11
11
  VERSION = Version::VERSION # Traditional Constant Location
data/lib/ruby/merge.rb CHANGED
@@ -24,7 +24,7 @@ module Ruby
24
24
  # those phases to satisfy generic size metrics would obscure the contract
25
25
  # they implement and make provider behavior harder to audit.
26
26
  # rubocop:disable Metrics/AbcSize, Metrics/BlockLength, Metrics/BlockNesting
27
- # rubocop:disable Metrics/ClassLength, Metrics/CyclomaticComplexity, Metrics/MethodLength
27
+ # rubocop:disable Metrics/ClassLength, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/ParameterLists
28
28
  # rubocop:disable Metrics/ModuleLength, Metrics/PerceivedComplexity
29
29
  # rubocop:disable Style/MultilineBlockChain
30
30
  module Merge
@@ -236,14 +236,14 @@ module Ruby
236
236
  ).to_h
237
237
  end
238
238
 
239
- def merge_ruby(template_source, destination_source, dialect, merge_template_requires: false,
239
+ def merge_ruby(template_source, destination_source, dialect, backend: nil, merge_template_requires: false,
240
240
  method_move_policy: DEFAULT_METHOD_MOVE_POLICY)
241
- template = parse_ruby(template_source, dialect)
241
+ template = parse_ruby(template_source, dialect, backend: backend)
242
242
  return template unless template[:ok]
243
243
 
244
244
  method_move_policy = normalize_method_move_policy(method_move_policy)
245
245
 
246
- destination = parse_ruby(destination_source, dialect)
246
+ destination = parse_ruby(destination_source, dialect, backend: backend)
247
247
  unless destination[:ok]
248
248
  return {
249
249
  ok: false,
@@ -3212,12 +3212,15 @@ module Ruby
3212
3212
  )
3213
3213
  # rubocop:enable Style/MultilineBlockChain
3214
3214
  # rubocop:enable Metrics/ModuleLength, Metrics/PerceivedComplexity
3215
- # rubocop:enable Metrics/ClassLength, Metrics/CyclomaticComplexity, Metrics/MethodLength
3215
+ # rubocop:enable Metrics/ClassLength, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/ParameterLists
3216
3216
  # rubocop:enable Metrics/AbcSize, Metrics/BlockLength, Metrics/BlockNesting
3217
3217
  end
3218
3218
  end
3219
3219
 
3220
+ require_relative 'merge/provider'
3221
+
3220
3222
  Ruby::Merge.register_backend!
3223
+ Ruby::Merge.register_provider!
3221
3224
 
3222
3225
  TreeHaver::BackendRegistry.register_tag(
3223
3226
  :tslp_ruby_import_records,
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.7
4
+ version: 7.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -43,28 +43,28 @@ dependencies:
43
43
  requirements:
44
44
  - - '='
45
45
  - !ruby/object:Gem::Version
46
- version: 7.1.7
46
+ version: 7.1.8
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.7
53
+ version: 7.1.8
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: tree_haver
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - '='
59
59
  - !ruby/object:Gem::Version
60
- version: 7.1.7
60
+ version: 7.1.8
61
61
  type: :runtime
62
62
  prerelease: false
63
63
  version_requirements: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - '='
66
66
  - !ruby/object:Gem::Version
67
- version: 7.1.7
67
+ version: 7.1.8
68
68
  - !ruby/object:Gem::Dependency
69
69
  name: version_gem
70
70
  requirement: !ruby/object:Gem::Requirement
@@ -94,7 +94,7 @@ dependencies:
94
94
  version: '3.0'
95
95
  - - ">="
96
96
  - !ruby/object:Gem::Version
97
- version: 3.0.17
97
+ version: 3.0.31
98
98
  type: :development
99
99
  prerelease: false
100
100
  version_requirements: !ruby/object:Gem::Requirement
@@ -104,7 +104,7 @@ dependencies:
104
104
  version: '3.0'
105
105
  - - ">="
106
106
  - !ruby/object:Gem::Version
107
- version: 3.0.17
107
+ version: 3.0.31
108
108
  - !ruby/object:Gem::Dependency
109
109
  name: bundler-audit
110
110
  requirement: !ruby/object:Gem::Requirement
@@ -182,7 +182,7 @@ dependencies:
182
182
  version: '3.2'
183
183
  - - ">="
184
184
  - !ruby/object:Gem::Version
185
- version: 3.2.2
185
+ version: 3.2.3
186
186
  type: :development
187
187
  prerelease: false
188
188
  version_requirements: !ruby/object:Gem::Requirement
@@ -192,7 +192,7 @@ dependencies:
192
192
  version: '3.2'
193
193
  - - ">="
194
194
  - !ruby/object:Gem::Version
195
- version: 3.2.2
195
+ version: 3.2.3
196
196
  - !ruby/object:Gem::Dependency
197
197
  name: kettle-test
198
198
  requirement: !ruby/object:Gem::Requirement
@@ -222,7 +222,7 @@ dependencies:
222
222
  version: '3.2'
223
223
  - - ">="
224
224
  - !ruby/object:Gem::Version
225
- version: 3.2.6
225
+ version: 3.2.7
226
226
  type: :development
227
227
  prerelease: false
228
228
  version_requirements: !ruby/object:Gem::Requirement
@@ -232,7 +232,7 @@ dependencies:
232
232
  version: '3.2'
233
233
  - - ">="
234
234
  - !ruby/object:Gem::Version
235
- version: 3.2.6
235
+ version: 3.2.7
236
236
  - !ruby/object:Gem::Dependency
237
237
  name: ruby-progressbar
238
238
  requirement: !ruby/object:Gem::Requirement
@@ -306,6 +306,7 @@ files:
306
306
  - lib/ruby/merge/method_similarity.rb
307
307
  - lib/ruby/merge/nocov_node_base.rb
308
308
  - lib/ruby/merge/nocov_wrapper_base.rb
309
+ - lib/ruby/merge/provider.rb
309
310
  - lib/ruby/merge/rescue_semantics.rb
310
311
  - lib/ruby/merge/scaffold_chunk_support.rb
311
312
  - lib/ruby/merge/signature_support.rb
@@ -317,10 +318,10 @@ licenses:
317
318
  - PolyForm-Small-Business-1.0.0
318
319
  metadata:
319
320
  homepage_uri: https://structuredmerge.org
320
- source_code_uri: https://github.com/structuredmerge/structuredmerge-ruby/tree/v7.1.7
321
- changelog_uri: https://github.com/structuredmerge/structuredmerge-ruby/blob/v7.1.7/CHANGELOG.md
321
+ source_code_uri: https://github.com/structuredmerge/structuredmerge-ruby/tree/v7.1.8
322
+ changelog_uri: https://github.com/structuredmerge/structuredmerge-ruby/blob/v7.1.8/CHANGELOG.md
322
323
  bug_tracker_uri: https://github.com/structuredmerge/structuredmerge-ruby/issues
323
- documentation_uri: https://www.rubydoc.info/gems/ruby-merge/7.1.7
324
+ documentation_uri: https://www.rubydoc.info/gems/ruby-merge/7.1.8
324
325
  funding_uri: https://github.com/sponsors/pboling
325
326
  wiki_uri: https://github.com/structuredmerge/structuredmerge-ruby/wiki
326
327
  news_uri: https://www.railsbling.com/tags/ruby-merge
metadata.gz.sig CHANGED
Binary file