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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data/lib/ruby/merge/provider.rb +238 -0
- data/lib/ruby/merge/version.rb +1 -1
- data/lib/ruby/merge.rb +8 -5
- data.tar.gz.sig +0 -0
- metadata +15 -14
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 3ad386abb55c17bd12f237caa2346764e139be3b41b7eac8ffddadaf3175d900
|
|
4
|
+
data.tar.gz: 7a5ab555bc1666ab70647e9bac922e18467deac2fb89aca5c8b8ceaab27b9665
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
data/lib/ruby/merge/version.rb
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
321
|
-
changelog_uri: https://github.com/structuredmerge/structuredmerge-ruby/blob/v7.1.
|
|
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.
|
|
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
|