prism-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: b0bc8c7452f0d13ea4262bb6376b302c026a394824c73b922962635fc36a6b9a
4
- data.tar.gz: 23eaa65f69dc5a6b95ecb6039bf01a58cc55a2214ab68f5ff51312cc8e5cf0c7
3
+ metadata.gz: c9bb0cd6d347f5231bdc73d9fdf4f752dc4900a8a4fda3d1a93e8749673e1d94
4
+ data.tar.gz: 1d0763e1c290d0026f1bf2a6d44b4657b3353c8cb6813597e0943eaa8a4b2369
5
5
  SHA512:
6
- metadata.gz: c9e82f316f95a010d1572c5144fff209269fc23e6c1f2957fed7fe041dabd6bdd7d00a3a743b668859270a88796e9f2e8a1098a702f9be88ee8949be1e440731
7
- data.tar.gz: 645f34de438d18fc26f57cfca03f59cdb2601514cd44ddafcccecf01fa67ffccc3ef9da305b3747f1eb4f186f0b37579580a41ecce54b18b97aa9e8a05dcb21c
6
+ metadata.gz: 23a30711093805e44d7faa6888f24db54d51f741ab033e6d1f8353375df03941ef65007bcb0ce0f1af1137ce86ac4bfebedd3f15aa47035acb1964c4f5333488
7
+ data.tar.gz: 958a34605f7d99be74c799f77072e95b8490184b04e7318c16efc3f00983cb1c16ac1dcb5585e05927548bc39e44c81fb9a01403fd2338428ea26b7d6d783bd4
checksums.yaml.gz.sig CHANGED
Binary file
@@ -402,6 +402,19 @@ module Prism
402
402
  inline_comment_entries = analysis.send(:owner_inline_comment_entries, node)
403
403
 
404
404
  if source == :template
405
+ if leading_comments.empty?
406
+ last_emitted_template_line = result.line_metadata.reverse_each.find do |metadata|
407
+ metadata[:template_line]
408
+ end&.fetch(:template_line, 0) || 0
409
+ emit_layout_leading_gap_lines(
410
+ result: result,
411
+ analysis: analysis,
412
+ owner: node,
413
+ source: source,
414
+ decision: decision,
415
+ last_output_line: last_emitted_template_line
416
+ )
417
+ end
405
418
  emit_template_blank_lines_before_leading_comments(
406
419
  result: result,
407
420
  node: node,
@@ -88,6 +88,8 @@ module Prism
88
88
 
89
89
  exact_role = exact_revision_role(request)
90
90
  decision = decide(documents, include_unmanaged_conflict: exact_role.nil?)
91
+ nested = render_nested_composite(request, documents, decision)
92
+ return nested if nested
91
93
  return render_conflicts(request, documents, decision) unless decision.conflicts.empty?
92
94
 
93
95
  return render_exact(request, documents, decision, exact_role) if exact_role
@@ -144,6 +146,8 @@ module Prism
144
146
  by_id: owners.to_h { |owner| [owner.id, owner] }.freeze,
145
147
  unmanaged_fingerprint: unmanaged_fingerprint(source, owners)
146
148
  )
149
+ rescue Prism::Merge::Error => e
150
+ { parse_error: e.message, source_role: role }
147
151
  end
148
152
 
149
153
  def unmanaged_fingerprint(source, owners)
@@ -363,6 +367,97 @@ module Prism
363
367
  )
364
368
  end
365
369
 
370
+ # Top-level Prism owners intentionally include a class body as one source
371
+ # range. When both revisions edit different direct methods, compose those
372
+ # method ranges before falling back to a class-level conflict.
373
+ def render_nested_composite(request, documents, decision)
374
+ return unless decision.conflicts.length == 1
375
+
376
+ conflict = decision.conflicts.first
377
+ ours_owner = documents.fetch(:ours).by_id[conflict[:owner_id]]
378
+ base_owner = documents.fetch(:base).by_id[conflict[:owner_id]]
379
+ theirs_owner = documents.fetch(:theirs).by_id[conflict[:owner_id]]
380
+ return unless [ours_owner, base_owner, theirs_owner].all?
381
+ return unless %i[class module].include?(ours_owner.signature.first)
382
+
383
+ nodes = {
384
+ base: owner_node(documents.fetch(:base), base_owner),
385
+ ours: owner_node(documents.fetch(:ours), ours_owner),
386
+ theirs: owner_node(documents.fetch(:theirs), theirs_owner)
387
+ }
388
+ return unless nodes.values.all?
389
+
390
+ replacements = nested_method_replacements(documents, nodes)
391
+ return if replacements.nil? || replacements.empty?
392
+
393
+ output_lines = documents.fetch(:ours).source.lines
394
+ replacements.sort_by { |replacement| -replacement.fetch(:start_line) }.each do |replacement|
395
+ start = replacement.fetch(:start_line) - 1
396
+ length = replacement.fetch(:end_line) - replacement.fetch(:start_line) + 1
397
+ output_lines[start, length] = replacement.fetch(:source).lines
398
+ end
399
+ output = output_lines.join
400
+ parsed = parse_source(output, :output)
401
+ return if provider_failure?(parsed)
402
+
403
+ result(
404
+ :merge3,
405
+ request,
406
+ output: output,
407
+ changes: decision.changes,
408
+ render_report: {
409
+ strategy: :nested_owner_composite,
410
+ parent_path: owner_path(ours_owner),
411
+ replacements: replacements.map do |replacement|
412
+ replacement.slice(:path, :start_line, :end_line, :source_role)
413
+ end
414
+ },
415
+ verification: { base_participated: true, output_reparsed: true, semantic_match: true }
416
+ )
417
+ end
418
+
419
+ def owner_node(document, owner)
420
+ document.analysis.nodes_with_comments.find { |info| info[:signature] == owner.signature }&.fetch(:node)
421
+ end
422
+
423
+ def nested_method_replacements(documents, nodes)
424
+ methods = nodes.transform_values do |node|
425
+ body = node.respond_to?(:body) ? node.body : nil
426
+ statements = body.respond_to?(:body) ? body.body : []
427
+ statements.select { |statement| statement.is_a?(::Prism::DefNode) }.to_h do |method|
428
+ [[method.name, method.parameters&.signature], method]
429
+ end
430
+ end
431
+ replacements = []
432
+ methods.fetch(:base).each do |signature, base_method|
433
+ ours_method = methods.fetch(:ours)[signature]
434
+ theirs_method = methods.fetch(:theirs)[signature]
435
+ next unless ours_method && theirs_method
436
+
437
+ base_source = node_source(documents.fetch(:base).source, base_method)
438
+ ours_source = node_source(documents.fetch(:ours).source, ours_method)
439
+ theirs_source = node_source(documents.fetch(:theirs).source, theirs_method)
440
+ next if ours_source == theirs_source || base_source == theirs_source
441
+ return nil if base_source != ours_source && base_source != theirs_source
442
+
443
+ next unless base_source == ours_source
444
+
445
+ replacements << {
446
+ path: "/method:#{signature.first}",
447
+ start_line: ours_method.location.start_line,
448
+ end_line: ours_method.location.end_line,
449
+ source: theirs_source,
450
+ source_role: :theirs
451
+ }
452
+ end
453
+ replacements
454
+ end
455
+
456
+ def node_source(source, node)
457
+ lines = source.lines
458
+ lines[node.location.start_line - 1, node.location.end_line - node.location.start_line + 1].join
459
+ end
460
+
366
461
  def composite_fragments(documents, decision)
367
462
  ours = documents.fetch(:ours)
368
463
  edits = replacement_edits(documents, decision)
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'prism/merge'
4
+
5
+ module Prism
6
+ module Merge
7
+ module RSpec
8
+ # Reuses Prism::Merge's established directive and node-path projection as
9
+ # native evidence for portable provider contract snapshots.
10
+ module ProviderSnapshotExtension
11
+ module_function
12
+
13
+ # rubocop:disable Metrics/MethodLength -- the extension envelope keeps all native evidence explicit
14
+ def call(source:, **)
15
+ normalized = Prism::Merge.parse_ruby_normalized(source)
16
+ nodes = normalized.fetch(:nodes)
17
+ {
18
+ schema: 'structuredmerge.extension/ruby-prism/v1',
19
+ namespace: 'ruby-prism',
20
+ capabilities: %w[comment-directives magic-comments native-node-kinds node-paths],
21
+ payload: {
22
+ parser_metadata: normalized.fetch(:metadata),
23
+ nodes: nodes.map { |node| native_node_evidence(node) },
24
+ native_tree_visibility: 'provider_internal'
25
+ }
26
+ }
27
+ end
28
+ # rubocop:enable Metrics/MethodLength
29
+
30
+ def native_node_evidence(node)
31
+ {
32
+ id: node.fetch(:id),
33
+ role: node.fetch(:role),
34
+ backend_kind: node.fetch(:backend_kind),
35
+ semantic_roles: node.fetch(:semantic_roles),
36
+ metadata: node.fetch(:metadata)
37
+ }
38
+ end
39
+ private_class_method :native_node_evidence
40
+ end
41
+ end
42
+ end
43
+ end
@@ -5,7 +5,7 @@ module Prism
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.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: prism-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,14 +43,14 @@ 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: prism
56
56
  requirement: !ruby/object:Gem::Requirement
@@ -71,28 +71,28 @@ dependencies:
71
71
  requirements:
72
72
  - - '='
73
73
  - !ruby/object:Gem::Version
74
- version: 7.1.7
74
+ version: 7.1.8
75
75
  type: :runtime
76
76
  prerelease: false
77
77
  version_requirements: !ruby/object:Gem::Requirement
78
78
  requirements:
79
79
  - - '='
80
80
  - !ruby/object:Gem::Version
81
- version: 7.1.7
81
+ version: 7.1.8
82
82
  - !ruby/object:Gem::Dependency
83
83
  name: tree_haver
84
84
  requirement: !ruby/object:Gem::Requirement
85
85
  requirements:
86
86
  - - '='
87
87
  - !ruby/object:Gem::Version
88
- version: 7.1.7
88
+ version: 7.1.8
89
89
  type: :runtime
90
90
  prerelease: false
91
91
  version_requirements: !ruby/object:Gem::Requirement
92
92
  requirements:
93
93
  - - '='
94
94
  - !ruby/object:Gem::Version
95
- version: 7.1.7
95
+ version: 7.1.8
96
96
  - !ruby/object:Gem::Dependency
97
97
  name: version_gem
98
98
  requirement: !ruby/object:Gem::Requirement
@@ -122,7 +122,7 @@ dependencies:
122
122
  version: '3.0'
123
123
  - - ">="
124
124
  - !ruby/object:Gem::Version
125
- version: 3.0.17
125
+ version: 3.0.31
126
126
  type: :development
127
127
  prerelease: false
128
128
  version_requirements: !ruby/object:Gem::Requirement
@@ -132,7 +132,7 @@ dependencies:
132
132
  version: '3.0'
133
133
  - - ">="
134
134
  - !ruby/object:Gem::Version
135
- version: 3.0.17
135
+ version: 3.0.31
136
136
  - !ruby/object:Gem::Dependency
137
137
  name: bundler-audit
138
138
  requirement: !ruby/object:Gem::Requirement
@@ -210,7 +210,7 @@ dependencies:
210
210
  version: '3.2'
211
211
  - - ">="
212
212
  - !ruby/object:Gem::Version
213
- version: 3.2.2
213
+ version: 3.2.3
214
214
  type: :development
215
215
  prerelease: false
216
216
  version_requirements: !ruby/object:Gem::Requirement
@@ -220,7 +220,7 @@ dependencies:
220
220
  version: '3.2'
221
221
  - - ">="
222
222
  - !ruby/object:Gem::Version
223
- version: 3.2.2
223
+ version: 3.2.3
224
224
  - !ruby/object:Gem::Dependency
225
225
  name: kettle-test
226
226
  requirement: !ruby/object:Gem::Requirement
@@ -250,7 +250,7 @@ dependencies:
250
250
  version: '3.2'
251
251
  - - ">="
252
252
  - !ruby/object:Gem::Version
253
- version: 3.2.6
253
+ version: 3.2.7
254
254
  type: :development
255
255
  prerelease: false
256
256
  version_requirements: !ruby/object:Gem::Requirement
@@ -260,7 +260,7 @@ dependencies:
260
260
  version: '3.2'
261
261
  - - ">="
262
262
  - !ruby/object:Gem::Version
263
- version: 3.2.6
263
+ version: 3.2.7
264
264
  - !ruby/object:Gem::Dependency
265
265
  name: ruby-progressbar
266
266
  requirement: !ruby/object:Gem::Requirement
@@ -361,6 +361,7 @@ files:
361
361
  - lib/prism/merge/provider.rb
362
362
  - lib/prism/merge/recursive_merge_policy.rb
363
363
  - lib/prism/merge/recursive_node_body_merger.rb
364
+ - lib/prism/merge/rspec/provider_snapshot_extension.rb
364
365
  - lib/prism/merge/ruby_doc_surface_analyzer.rb
365
366
  - lib/prism/merge/scaffold_chunk_remover.rb
366
367
  - lib/prism/merge/smart_merger.rb
@@ -375,10 +376,10 @@ licenses:
375
376
  - PolyForm-Small-Business-1.0.0
376
377
  metadata:
377
378
  homepage_uri: https://structuredmerge.org
378
- source_code_uri: https://github.com/structuredmerge/structuredmerge-ruby/tree/v7.1.7
379
- changelog_uri: https://github.com/structuredmerge/structuredmerge-ruby/blob/v7.1.7/CHANGELOG.md
379
+ source_code_uri: https://github.com/structuredmerge/structuredmerge-ruby/tree/v7.1.8
380
+ changelog_uri: https://github.com/structuredmerge/structuredmerge-ruby/blob/v7.1.8/CHANGELOG.md
380
381
  bug_tracker_uri: https://github.com/structuredmerge/structuredmerge-ruby/issues
381
- documentation_uri: https://www.rubydoc.info/gems/prism-merge/7.1.7
382
+ documentation_uri: https://www.rubydoc.info/gems/prism-merge/7.1.8
382
383
  funding_uri: https://github.com/sponsors/pboling
383
384
  wiki_uri: https://github.com/structuredmerge/structuredmerge-ruby/wiki
384
385
  news_uri: https://www.railsbling.com/tags/prism-merge
metadata.gz.sig CHANGED
Binary file