psych-merge 7.1.8 → 7.1.10

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: 8b38c9a6f3274ff8bb9d92147d02ddf81c6d4d02c4b36c534ee826ce73779d4d
4
- data.tar.gz: 63f51d481149fb7cc7221b183333ee1d13a5a7b1250ac8928de741719cea9506
3
+ metadata.gz: d92d6b29109c879c6deeaefa231b53ef40d78c2c689f85c4b389d3144928d2e1
4
+ data.tar.gz: 700a78701d48f95479e1b165647d27e94e3c6f76823bea4e97265c55a109d125
5
5
  SHA512:
6
- metadata.gz: ff82e5d7c19a232ad13d380d9b4cf86fc86fe5da2307e9f0cf1f6366f8cb7f51e00b33f728ac489c00c5633f73ea46d58a3521bc657b00d4e2a964bceb86c5be
7
- data.tar.gz: e1156c490c572dc4f53d2eac908603e3f768468a0bb796e85e783b17922a7f361053301e3c40ea02462e46cdc0caca33acad57c3602b53f330e61c8fc103db4e
6
+ metadata.gz: 9fd36c8415435121b7810e61c642af591116372289c3d0f07d8cc37aa6ed2b7e8cde74cba601a5f44e87b1759d7c76e55860b7f0f9f128f0179b3d4b1e2afce9
7
+ data.tar.gz: 16e7cb7df228080a1cb993a3d8b4625dec2b52d2840072a43268563a5e6f14f2914b6b5f1eb8e2e6c8ea0b35fa11c9849ddae4aa7e8bad8cb7ca2f0619e848a1
checksums.yaml.gz.sig CHANGED
Binary file
@@ -0,0 +1,148 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Explicit opt-in: the normal psych/merge entry point does not load the core or
4
+ # mutate its registry. Install a compatible generated core artifact separately.
5
+ require 'psych'
6
+ require 'json'
7
+ require 'structuredmerge_core'
8
+ require_relative 'version'
9
+
10
+ module Psych
11
+ module Merge
12
+ # Native syntax projection only. Rust owns semantic analysis and merging.
13
+ # Derived from the retained Psych conformance projector in the kernel.
14
+ class CoreParserHost
15
+ CORE = ::StructuredmergeCore
16
+ PROVIDER_ID = 'ruby.psych'
17
+ # Psych 5.3.1 rejects valid BOM-prefixed Unicode fixtures. Keep the native
18
+ # profile on the verified series until other versions pass the same gate.
19
+ SUPPORTED_PSYCH = Gem::Requirement.new('~> 5.5.0')
20
+ BOM_COLUMN_WIDTH = Psych.parse_stream("\uFEFFx: 1\n").children.first.start_column
21
+ raise 'Unsupported Psych BOM column convention' unless [0, 1].include?(BOM_COLUMN_WIDTH)
22
+
23
+ def descriptor
24
+ CORE::ParserProviderDescriptor.new(id: PROVIDER_ID, family: 'native', runtime: RUBY_ENGINE,
25
+ package: 'psych-merge', package_version: Version::VERSION, parser: 'psych', parser_version: Psych::VERSION,
26
+ languages: ['yaml'], dialects: [], contracts: ['structuredmerge.parse-result/v1'],
27
+ capabilities: %w[diagnostics native_extensions source_spans], probe_id: 'psych.loaded',
28
+ priority: 0, metadata: {}, extensions: [])
29
+ end
30
+
31
+ def probe_batch(request)
32
+ raise TypeError, 'Expected typed ProbeBatchRequest' unless request.is_a?(CORE::ProbeBatchRequest)
33
+
34
+ CORE::ProbeBatchResult.new(items: request.items.map do |item|
35
+ CORE::ParserProbeResult.new(available: compatible? && item.language == 'yaml' && item.dialect.nil?,
36
+ loadable: true)
37
+ end)
38
+ end
39
+
40
+ def parse_batch(request)
41
+ raise TypeError, 'Expected typed ParseBatchRequest' unless request.is_a?(CORE::ParseBatchRequest)
42
+
43
+ CORE::ParseBatchResult.new(items: request.items.map { |item| parse(item) })
44
+ end
45
+
46
+ private
47
+
48
+ def compatible? = SUPPORTED_PSYCH.satisfied_by?(Gem::Version.new(Psych::VERSION))
49
+
50
+ def parse(item)
51
+ text = item.source.bytes.pack('C*').force_encoding(Encoding::UTF_8)
52
+ code = if !compatible?
53
+ 'psych.unsupported_version'
54
+ elsif item.language != 'yaml' || !item.dialect.nil?
55
+ 'psych.unsupported_language'
56
+ elsif item.options.comments || item.options.tokens
57
+ 'psych.unsupported_options'
58
+ elsif !text.valid_encoding? || item.source.descriptor.encoding.to_s != 'utf8'
59
+ 'psych.unsupported_source'
60
+ end
61
+ # Bare CR has different native coordinate semantics. Inspect bytes, not
62
+ # source syntax; comments and ownership are never inferred from text.
63
+ code = 'psych.unsupported_source' if text.b.gsub("\r\n", '').include?("\r")
64
+ return failure(item, code) if code
65
+
66
+ nodes = project(Psych.parse_stream(text), text, item.options.native_extensions)
67
+ CORE::ParseOutput.new(request_id: item.request_id, source: item.source.descriptor,
68
+ ok: true, root_id: nodes.first.id, nodes: nodes, comments: [], diagnostics: [],
69
+ extensions: [], metadata: {}, extra: {})
70
+ rescue Psych::SyntaxError
71
+ # Psych exception messages can contain private source. Never forward them.
72
+ failure(item, 'psych.syntax')
73
+ end
74
+
75
+ def failure(item, code)
76
+ message = case code
77
+ when 'psych.syntax' then 'Psych syntax error'
78
+ when 'psych.unsupported_version' then 'Psych provider requires the verified Psych 5.5.x series'
79
+ else 'Unsupported Psych provider input'
80
+ end
81
+ diagnostic = CORE::ParseDiagnostic.new(id: code, severity: :error, category: 'parse_error', code: code,
82
+ message: message,
83
+ source_role: item.source.descriptor.role, blocking: true, metadata: {}, extra: {})
84
+ CORE::ParseOutput.new(request_id: item.request_id, source: item.source.descriptor, ok: false,
85
+ nodes: [], comments: [], diagnostics: [diagnostic], extensions: [], metadata: {}, extra: {})
86
+ end
87
+
88
+ def project(stream, text, native_extensions)
89
+ lines = text.split("\n", -1)
90
+ bom_bytes = text.start_with?("\uFEFF") ? 3 : 0
91
+ lines[0] = lines[0].delete_prefix("\uFEFF") if bom_bytes.positive?
92
+ starts = [0]
93
+ text.bytes.each_with_index { |byte, index| starts << index + 1 if byte == 10 }
94
+ offset = lambda do |row, column|
95
+ next text.bytesize if row == lines.length && column.zero?
96
+
97
+ column -= BOM_COLUMN_WIDTH if row.zero? && bom_bytes.positive?
98
+ line = lines.fetch(row)
99
+ raise 'Invalid Psych character column' if column.negative? || column > line.length
100
+
101
+ starts.fetch(row) + (row.zero? ? bom_bytes : 0) + line[0, column].bytesize
102
+ end
103
+ point = lambda do |byte|
104
+ row = starts.bsearch_index { |start| start > byte }
105
+ row = row ? row - 1 : starts.length - 1
106
+ CORE::SourcePoint.new(row: row, column: byte - starts.fetch(row))
107
+ end
108
+ # Allocate stable preorder IDs before constructing immutable typed nodes.
109
+ # Iterative traversal avoids adding a Ruby recursion limit to native ASTs.
110
+ entries = []
111
+ stack = [[stream, nil]]
112
+ until stack.empty?
113
+ node, parent = stack.pop
114
+ id = "n#{entries.length}"
115
+ entries << [node, parent, id]
116
+ (node.children || []).reverse_each { |child| stack << [child, id] }
117
+ end
118
+ ids = entries.to_h { |node, _parent, id| [node.object_id, id] }
119
+ entries.map do |node, parent, id|
120
+ kind = node.class.name.split('::').last.downcase
121
+ first = kind == 'stream' ? 0 : offset.call(node.start_line, node.start_column)
122
+ last = kind == 'stream' ? text.bytesize : offset.call(node.end_line, node.end_column)
123
+ facts = %i[value style plain quoted anchor tag implicit
124
+ implicit_end].each_with_object({}) do |attribute, result|
125
+ result[attribute] = node.public_send(attribute) if node.respond_to?(attribute)
126
+ end
127
+ extensions = if native_extensions
128
+ [CORE::NativeExtension.new(schema: 'structuredmerge.extension/ruby-psych/v1',
129
+ namespace: 'ruby-psych', capabilities: [], payload: ::JSON.generate(facts), extra: {})]
130
+ else
131
+ []
132
+ end
133
+ CORE::ParseNode.new(id: id, kind: kind, native_type: node.class.name, role: :structural,
134
+ named: true, missing: false, has_error: false, parent_id: parent,
135
+ span: CORE::SourceSpan.new(range: CORE::ByteRange.new(start_byte: first, end_byte: last),
136
+ start_point: point.call(first), end_point: point.call(last)),
137
+ children: (node.children || []).each_with_index.map do |child, index|
138
+ CORE::ChildEdge.new(node_id: ids.fetch(child.object_id), index: index,
139
+ field_name: if kind == 'mapping'
140
+ index.even? ? 'key' : 'value'
141
+ end)
142
+ end,
143
+ semantic_roles: [], unsupported_features: [], extensions: extensions, metadata: {}, extra: {})
144
+ end
145
+ end
146
+ end
147
+ end
148
+ end
@@ -5,7 +5,7 @@ module Psych
5
5
  # Version namespace for this gem.
6
6
  module Version
7
7
  # Current gem version.
8
- VERSION = '7.1.8'
8
+ VERSION = '7.1.10'
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: psych-merge
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.1.8
4
+ version: 7.1.10
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.8
46
+ version: 7.1.10
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.8
53
+ version: 7.1.10
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.8
60
+ version: 7.1.10
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.8
67
+ version: 7.1.10
68
68
  - !ruby/object:Gem::Dependency
69
69
  name: version_gem
70
70
  requirement: !ruby/object:Gem::Requirement
@@ -91,34 +91,34 @@ dependencies:
91
91
  requirements:
92
92
  - - '='
93
93
  - !ruby/object:Gem::Version
94
- version: 7.1.8
94
+ version: 7.1.10
95
95
  type: :runtime
96
96
  prerelease: false
97
97
  version_requirements: !ruby/object:Gem::Requirement
98
98
  requirements:
99
99
  - - '='
100
100
  - !ruby/object:Gem::Version
101
- version: 7.1.8
101
+ version: 7.1.10
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: kettle-dev
104
104
  requirement: !ruby/object:Gem::Requirement
105
105
  requirements:
106
106
  - - "~>"
107
107
  - !ruby/object:Gem::Version
108
- version: '3.0'
108
+ version: '3.1'
109
109
  - - ">="
110
110
  - !ruby/object:Gem::Version
111
- version: 3.0.31
111
+ version: 3.1.8
112
112
  type: :development
113
113
  prerelease: false
114
114
  version_requirements: !ruby/object:Gem::Requirement
115
115
  requirements:
116
116
  - - "~>"
117
117
  - !ruby/object:Gem::Version
118
- version: '3.0'
118
+ version: '3.1'
119
119
  - - ">="
120
120
  - !ruby/object:Gem::Version
121
- version: 3.0.31
121
+ version: 3.1.8
122
122
  - !ruby/object:Gem::Dependency
123
123
  name: bundler-audit
124
124
  requirement: !ruby/object:Gem::Requirement
@@ -196,7 +196,7 @@ dependencies:
196
196
  version: '3.2'
197
197
  - - ">="
198
198
  - !ruby/object:Gem::Version
199
- version: 3.2.3
199
+ version: 3.2.5
200
200
  type: :development
201
201
  prerelease: false
202
202
  version_requirements: !ruby/object:Gem::Requirement
@@ -206,7 +206,7 @@ dependencies:
206
206
  version: '3.2'
207
207
  - - ">="
208
208
  - !ruby/object:Gem::Version
209
- version: 3.2.3
209
+ version: 3.2.5
210
210
  - !ruby/object:Gem::Dependency
211
211
  name: kettle-test
212
212
  requirement: !ruby/object:Gem::Requirement
@@ -216,7 +216,7 @@ dependencies:
216
216
  version: '2.0'
217
217
  - - ">="
218
218
  - !ruby/object:Gem::Version
219
- version: 2.0.21
219
+ version: 2.0.23
220
220
  type: :development
221
221
  prerelease: false
222
222
  version_requirements: !ruby/object:Gem::Requirement
@@ -226,7 +226,7 @@ dependencies:
226
226
  version: '2.0'
227
227
  - - ">="
228
228
  - !ruby/object:Gem::Version
229
- version: 2.0.21
229
+ version: 2.0.23
230
230
  - !ruby/object:Gem::Dependency
231
231
  name: turbo_tests2
232
232
  requirement: !ruby/object:Gem::Requirement
@@ -236,7 +236,7 @@ dependencies:
236
236
  version: '3.2'
237
237
  - - ">="
238
238
  - !ruby/object:Gem::Version
239
- version: 3.2.7
239
+ version: 3.2.14
240
240
  type: :development
241
241
  prerelease: false
242
242
  version_requirements: !ruby/object:Gem::Requirement
@@ -246,7 +246,7 @@ dependencies:
246
246
  version: '3.2'
247
247
  - - ">="
248
248
  - !ruby/object:Gem::Version
249
- version: 3.2.7
249
+ version: 3.2.14
250
250
  - !ruby/object:Gem::Dependency
251
251
  name: ruby-progressbar
252
252
  requirement: !ruby/object:Gem::Requirement
@@ -270,7 +270,7 @@ dependencies:
270
270
  version: '1.0'
271
271
  - - ">="
272
272
  - !ruby/object:Gem::Version
273
- version: 1.0.8
273
+ version: 1.0.9
274
274
  type: :development
275
275
  prerelease: false
276
276
  version_requirements: !ruby/object:Gem::Requirement
@@ -280,7 +280,7 @@ dependencies:
280
280
  version: '1.0'
281
281
  - - ">="
282
282
  - !ruby/object:Gem::Version
283
- version: 1.0.8
283
+ version: 1.0.9
284
284
  - !ruby/object:Gem::Dependency
285
285
  name: gitmoji-regex
286
286
  requirement: !ruby/object:Gem::Requirement
@@ -290,7 +290,7 @@ dependencies:
290
290
  version: '2.0'
291
291
  - - ">="
292
292
  - !ruby/object:Gem::Version
293
- version: 2.0.12
293
+ version: 2.0.15
294
294
  type: :development
295
295
  prerelease: false
296
296
  version_requirements: !ruby/object:Gem::Requirement
@@ -300,7 +300,7 @@ dependencies:
300
300
  version: '2.0'
301
301
  - - ">="
302
302
  - !ruby/object:Gem::Version
303
- version: 2.0.12
303
+ version: 2.0.15
304
304
  description: "☯️ Psych-backed YAML provider gem for the Structured Merge YAML family."
305
305
  email:
306
306
  - floss@galtzo.com
@@ -314,6 +314,7 @@ files:
314
314
  - lib/psych/merge.rb
315
315
  - lib/psych/merge/comment_tracker.rb
316
316
  - lib/psych/merge/conflict_resolver.rb
317
+ - lib/psych/merge/core_parser_host.rb
317
318
  - lib/psych/merge/debug_logger.rb
318
319
  - lib/psych/merge/diff_mapper.rb
319
320
  - lib/psych/merge/emitter.rb
@@ -337,10 +338,10 @@ licenses:
337
338
  - PolyForm-Small-Business-1.0.0
338
339
  metadata:
339
340
  homepage_uri: https://structuredmerge.org
340
- source_code_uri: https://github.com/structuredmerge/structuredmerge-ruby/tree/v7.1.8
341
- changelog_uri: https://github.com/structuredmerge/structuredmerge-ruby/blob/v7.1.8/CHANGELOG.md
341
+ source_code_uri: https://github.com/structuredmerge/structuredmerge-ruby/tree/v7.1.10
342
+ changelog_uri: https://github.com/structuredmerge/structuredmerge-ruby/blob/v7.1.10/CHANGELOG.md
342
343
  bug_tracker_uri: https://github.com/structuredmerge/structuredmerge-ruby/issues
343
- documentation_uri: https://www.rubydoc.info/gems/psych-merge/7.1.8
344
+ documentation_uri: https://www.rubydoc.info/gems/psych-merge/7.1.10
344
345
  funding_uri: https://github.com/sponsors/pboling
345
346
  wiki_uri: https://github.com/structuredmerge/structuredmerge-ruby/wiki
346
347
  news_uri: https://www.railsbling.com/tags/psych-merge
@@ -370,7 +371,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
370
371
  - !ruby/object:Gem::Version
371
372
  version: '0'
372
373
  requirements: []
373
- rubygems_version: 4.0.17
374
+ rubygems_version: 4.0.20
374
375
  specification_version: 4
375
376
  summary: "☯️ Structured Merge Psych-backed YAML analysis for Ruby"
376
377
  test_files: []
metadata.gz.sig CHANGED
Binary file