rust-merge 7.0.0 → 7.1.3

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.
@@ -2,10 +2,12 @@
2
2
 
3
3
  module Rust
4
4
  module Merge
5
+ # Version namespace for this gem.
5
6
  module Version
6
- VERSION = "7.0.0"
7
+ # Current gem version.
8
+ VERSION = '7.1.3'
7
9
  end
8
-
9
- VERSION = Version::VERSION
10
+ # Current gem version exposed at the traditional constant location.
11
+ VERSION = Version::VERSION # Traditional Constant Location
10
12
  end
11
13
  end
data/lib/rust/merge.rb CHANGED
@@ -1,26 +1,44 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "tree_haver"
3
+ require 'tree_haver'
4
+ require 'ast/merge'
5
+ require_relative 'merge/version'
4
6
 
5
7
  module Rust
6
8
  module Merge
7
- PACKAGE_NAME = "rust-merge"
9
+ PACKAGE_NAME = 'rust-merge'
8
10
  TREE_SITTER_BACKEND = TreeHaver::KREUZBERG_LANGUAGE_PACK_BACKEND
9
- DESTINATION_WINS_ARRAY_POLICY = { surface: "array", name: "destination_wins_array" }.freeze
11
+ DESTINATION_WINS_ARRAY_POLICY = { surface: 'array', name: 'destination_wins_array' }.freeze
12
+ BACKEND_REGISTRY = Struct.new(:registered, :mutex).new(false, Mutex.new)
10
13
 
11
14
  module_function
12
15
 
16
+ def register_backend!
17
+ BACKEND_REGISTRY.mutex.synchronize do
18
+ return if BACKEND_REGISTRY.registered
19
+
20
+ TreeHaver::BackendRegistry.register(TREE_SITTER_BACKEND)
21
+
22
+ grammar_finder = TreeHaver::GrammarFinder.new(:rust)
23
+ grammar_finder.register! if grammar_finder.available?
24
+
25
+ BACKEND_REGISTRY.registered = true
26
+ end
27
+ end
28
+
13
29
  def rust_feature_profile
14
- { family: "rust", supported_dialects: ["rust"], supported_policies: [DESTINATION_WINS_ARRAY_POLICY] }
30
+ { family: 'rust', supported_dialects: ['rust'], supported_policies: [DESTINATION_WINS_ARRAY_POLICY] }
15
31
  end
16
32
 
17
33
  def available_rust_backends
18
- [TREE_SITTER_BACKEND]
34
+ rust_backend_available_for_analysis?(TREE_SITTER_BACKEND.id) ? [TREE_SITTER_BACKEND] : []
19
35
  end
20
36
 
21
37
  def rust_backend_feature_profile(backend: nil)
22
- requested = backend.to_s.empty? ? TREE_SITTER_BACKEND.id : backend.to_s
23
- return unsupported_feature_result("Unsupported Rust backend #{requested}.") unless requested == TREE_SITTER_BACKEND.id
38
+ requested = requested_tree_sitter_backend_id(backend)
39
+ unless rust_backend_available_for_analysis?(requested)
40
+ return unsupported_feature_result("Unsupported Rust backend #{requested}.")
41
+ end
24
42
 
25
43
  rust_feature_profile.merge(
26
44
  backend: requested,
@@ -44,81 +62,172 @@ module Rust
44
62
  end
45
63
 
46
64
  def parse_rust(source, dialect)
47
- return analyze_rust_module(source) if dialect == "rust"
65
+ unless rust_backend_available_for_analysis?(nil)
66
+ diagnostic_backend = TreeHaver.current_backend_id || 'tree-sitter'
67
+ return unsupported_feature_result("Unsupported Rust backend #{diagnostic_backend}.")
68
+ end
69
+
70
+ return analyze_rust_module(source) if dialect == 'rust'
71
+
72
+ { ok: false,
73
+ diagnostics: [{ severity: 'error', category: 'unsupported_feature', message: "Unsupported Rust dialect #{dialect}." }], policies: [] }
74
+ end
75
+
76
+ def rust_backend_available_for_analysis?(backend_id)
77
+ register_backend!
78
+
79
+ if backend_id.to_s.empty?
80
+ TreeHaver.parser_for(:rust, backend_type: :tree_sitter)
81
+ else
82
+ TreeHaver.with_backend(backend_id) { TreeHaver.parser_for(:rust, backend_type: :tree_sitter) }
83
+ end
84
+ true
85
+ rescue TreeHaver::Error, ArgumentError
86
+ false
87
+ end
48
88
 
49
- { ok: false, diagnostics: [{ severity: "error", category: "unsupported_feature", message: "Unsupported Rust dialect #{dialect}." }], policies: [] }
89
+ def requested_tree_sitter_backend_id(backend)
90
+ return backend.to_s unless backend.to_s.empty?
91
+
92
+ contextual = TreeHaver.current_backend_id || ENV['TREE_HAVER_BACKEND']
93
+ contextual.to_s.empty? || contextual.to_s == 'auto' ? TREE_SITTER_BACKEND.id : contextual.to_s
50
94
  end
95
+ private_class_method :requested_tree_sitter_backend_id
51
96
 
52
97
  def match_rust_owners(template, destination)
53
- destination_paths = destination[:owners].to_h { |owner| [owner[:path], true] }
54
- template_paths = template[:owners].to_h { |owner| [owner[:path], true] }
55
- {
56
- matched: template[:owners].filter { |owner| destination_paths[owner[:path]] }.map { |owner| { template_path: owner[:path], destination_path: owner[:path] } },
57
- unmatched_template: template[:owners].map { |owner| owner[:path] }.reject { |path| destination_paths[path] },
58
- unmatched_destination: destination[:owners].map { |owner| owner[:path] }.reject { |path| template_paths[path] }
59
- }
98
+ Ast::Merge::OwnerSelection.match_by_path(template, destination)
60
99
  end
61
100
 
62
101
  def merge_rust(template_source, destination_source, dialect)
63
102
  template = parse_rust(template_source, dialect)
64
103
  return { ok: false, diagnostics: template[:diagnostics], policies: [] } unless template[:ok]
104
+
65
105
  destination = parse_rust(destination_source, dialect)
66
106
  unless destination[:ok]
67
107
  return {
68
108
  ok: false,
69
- diagnostics: destination[:diagnostics].map { |diagnostic| diagnostic[:category] == "parse_error" ? diagnostic.merge(category: "destination_parse_error") : diagnostic },
109
+ diagnostics: destination[:diagnostics].map do |diagnostic|
110
+ diagnostic[:category] == 'parse_error' ? diagnostic.merge(category: 'destination_parse_error') : diagnostic
111
+ end,
70
112
  policies: []
71
113
  }
72
114
  end
73
115
 
74
116
  destination_declarations = destination.dig(:analysis, :declarations).to_h { |item| [item[:path], item] }
75
117
  merged_declaration_texts = destination.dig(:analysis, :declarations).map { |item| item[:text] } +
76
- template.dig(:analysis, :declarations).reject { |item| destination_declarations[item[:path]] }.map { |item| item[:text] }
118
+ template.dig(:analysis, :declarations).reject do |item|
119
+ destination_declarations[item[:path]]
120
+ end.map { |item| item[:text] }
77
121
  import_block = destination.dig(:analysis, :imports).map { |item| item[:text] }.join
78
122
  declaration_block = merged_declaration_texts.join("\n").rstrip
79
123
  sections = [import_block.rstrip, declaration_block].reject(&:empty?)
80
- { ok: true, diagnostics: [], output: "#{sections.join("\n\n").rstrip}\n", policies: [DESTINATION_WINS_ARRAY_POLICY] }
124
+ { ok: true, diagnostics: [], output: "#{sections.join("\n\n").rstrip}\n",
125
+ policies: [DESTINATION_WINS_ARRAY_POLICY] }
81
126
  end
82
127
 
83
128
  def analyze_rust_module(source)
84
- parsed = TreeHaver.parse_with_language_pack(TreeHaver::ParserRequest.new(source: source, language: "rust", dialect: "rust"))
85
- return { ok: false, diagnostics: parsed[:diagnostics], policies: [] } unless parsed[:ok]
86
- processed = TreeHaver.process_with_language_pack(TreeHaver::ProcessRequest.new(source: source, language: "rust"))
87
- return { ok: false, diagnostics: processed[:diagnostics], policies: [] } unless processed[:ok]
88
-
89
- imports = processed[:analysis].imports.each_with_index.map do |item, index|
90
- { path: "/imports/#{index}", match_key: normalize_rust_import_path(item.source), text: import_text(source, item.span) }
129
+ parser = TreeHaver.parser_for(:rust, backend_type: :tree_sitter)
130
+ tree = parser.parse(source)
131
+ collect_parse_errors(tree.root_node)
132
+
133
+ imports = []
134
+ declarations = []
135
+ tree.root_node.children.each do |node|
136
+ case node.type
137
+ when 'use_declaration'
138
+ import_source = line_anchored_slice(source, node)
139
+ imports << {
140
+ path: "/imports/#{imports.length}",
141
+ owner_kind: 'import',
142
+ match_key: normalize_rust_import_path(import_source),
143
+ text: import_text(source, node)
144
+ }
145
+ when 'function_item', 'struct_item', 'enum_item', 'trait_item', 'impl_item', 'const_item', 'static_item',
146
+ 'type_item', 'mod_item'
147
+ name = first_named_descendant_text(source, node, %w[identifier type_identifier])
148
+ next unless name
149
+
150
+ declarations << {
151
+ path: "/declarations/#{name}",
152
+ owner_kind: 'declaration',
153
+ match_key: name,
154
+ text: declaration_text(source, node)
155
+ }
156
+ end
91
157
  end
92
- declarations = processed[:analysis].structure
93
- .select { |item| item.name }
94
- .map { |item| { path: "/declarations/#{item.name}", match_key: item.name, text: declaration_text(source, item.span) } }
95
- .sort_by { |item| item[:path] }
96
158
 
97
159
  {
98
160
  ok: true,
99
161
  diagnostics: [],
100
162
  analysis: {
101
- kind: "rust",
102
- dialect: "rust",
103
- source: source,
104
- owners: imports.map { |item| { path: item[:path], owner_kind: "import", match_key: item[:match_key] } } +
105
- declarations.map { |item| { path: item[:path], owner_kind: "declaration", match_key: item[:match_key] } },
163
+ kind: 'rust',
164
+ dialect: 'rust',
106
165
  imports: imports,
107
- declarations: declarations
166
+ declarations: declarations,
167
+ owners: owner_views(imports + declarations)
108
168
  },
109
169
  policies: []
110
170
  }
171
+ rescue TreeHaver::Error, StandardError => e
172
+ parse_failure_result(e)
111
173
  end
112
174
  private_class_method :analyze_rust_module
113
175
 
176
+ def collect_parse_errors(node)
177
+ raise TreeHaver::NotAvailable, 'Rust parse returned no root node' unless node
178
+ return unless node.respond_to?(:has_error?) && node.has_error?
179
+
180
+ raise TreeHaver::NotAvailable,
181
+ 'Rust parse contains syntax errors'
182
+ end
183
+ private_class_method :collect_parse_errors
184
+
185
+ def parse_failure_result(error)
186
+ { ok: false,
187
+ diagnostics: [{ severity: 'error', category: 'parse_error', message: error.message }],
188
+ policies: [] }
189
+ end
190
+ private_class_method :parse_failure_result
191
+
192
+ def unsupported_feature_result(message)
193
+ {
194
+ ok: false,
195
+ diagnostics: [{ severity: 'error', category: 'unsupported_feature', message: message }],
196
+ policies: []
197
+ }
198
+ end
199
+ private_class_method :unsupported_feature_result
200
+
114
201
  def normalize_rust_import_path(import_source)
115
- import_source.sub(/\Ause\s+/, "").sub(/;\z/, "").strip
202
+ import_source.sub(/\Ause\s+/, '').sub(/;\z/, '').strip
116
203
  end
117
204
  private_class_method :normalize_rust_import_path
118
205
 
206
+ def first_named_descendant_text(source, node, types)
207
+ return slice_span(source, node) if types.include?(node.type)
208
+
209
+ node.children.each do |child|
210
+ value = first_named_descendant_text(source, child, types)
211
+ return value if value && !value.empty?
212
+ end
213
+ nil
214
+ end
215
+ private_class_method :first_named_descendant_text
216
+
217
+ def owner_view(item)
218
+ item.slice(:path, :owner_kind, :match_key)
219
+ end
220
+ private_class_method :owner_view
221
+
222
+ def owner_views(items)
223
+ items.map { |item| owner_view(item) }
224
+ end
225
+ private_class_method :owner_views
226
+
119
227
  def import_text(source, span) = "#{slice_span(source, span)}\n"
120
228
  def declaration_text(source, span) = "#{line_anchored_slice(source, span)}\n"
121
229
  def slice_span(source, span) = source[span.start_byte...span.end_byte].strip
230
+
122
231
  def line_anchored_slice(source, span)
123
232
  line_start = source.rindex("\n", [span.start_byte - 1, 0].max)
124
233
  line_start = line_start ? line_start + 1 : 0
@@ -127,3 +236,7 @@ module Rust
127
236
  private_class_method :import_text, :declaration_text, :slice_span, :line_anchored_slice
128
237
  end
129
238
  end
239
+
240
+ Rust::Merge.register_backend!
241
+ require_relative 'merge/provider'
242
+ Rust::Merge.register_provider!
data/lib/rust-merge.rb CHANGED
@@ -1,3 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "rust/merge"
3
+ require_relative 'rust/merge'
4
+ require 'version_gem'
5
+ require_relative 'rust/merge/version'
6
+
7
+ Rust::Merge::Version.class_eval do
8
+ extend VersionGem::Basic
9
+ end
@@ -0,0 +1,55 @@
1
+ module Rust
2
+ module Merge
3
+ class NodeWrapper
4
+ DECLARATION_TYPES: Array[String]
5
+ NAMED_ITEMS: Hash[String, [Symbol, Array[String]]]
6
+ COMMENT_TYPES: Array[String]
7
+ ATTRIBUTE_TYPES: Array[String]
8
+
9
+ attr_reader node: untyped
10
+ attr_reader source: String
11
+ attr_reader leading_comments: Array[untyped]
12
+ attr_reader trailing_comments: Array[untyped]
13
+
14
+ def initialize: (untyped node, source: String, ?leading_comments: Array[untyped]) -> void
15
+ def signature: () -> Array[untyped]
16
+ def membership_signature: () -> Array[untyped]
17
+ def compound?: () -> bool
18
+ def start_byte: () -> Integer
19
+ def end_byte: () -> Integer
20
+ def start_line: () -> Integer
21
+ def end_line: () -> Integer
22
+ def source_text: () -> String
23
+ def semantic_tree: () -> Array[untyped]
24
+ def attach_trailing_comment!: (untyped comment) -> untyped
25
+ end
26
+
27
+ class FileAnalysis
28
+ attr_reader source: String
29
+ attr_reader root_node: untyped
30
+ attr_reader declarations: Array[NodeWrapper]
31
+ attr_reader errors: Array[StandardError]
32
+ attr_reader backend: Symbol
33
+
34
+ def initialize: (String source) -> void
35
+ end
36
+
37
+ class Provider
38
+ def provider_id: () -> String
39
+ def family: () -> String
40
+ def capabilities: () -> Hash[Symbol, untyped]
41
+ def analyze: (Hash[Symbol, untyped] request) -> Hash[Symbol, untyped]
42
+ def diff2: (Hash[Symbol, untyped] request) -> Hash[Symbol, untyped]
43
+ def merge2: (Hash[Symbol, untyped] request) -> Hash[Symbol, untyped]
44
+ def merge3: (Hash[Symbol, untyped] request) -> Hash[Symbol, untyped]
45
+ end
46
+
47
+ def self.merge_provider: () -> Provider
48
+ def self.register_provider!: (?replace: bool) -> untyped
49
+
50
+ module Version
51
+ VERSION: String
52
+ end
53
+ VERSION: String
54
+ end
55
+ end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,11 +1,11 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rust-merge
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.0.0
4
+ version: 7.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
8
- bindir: bin
8
+ bindir: exe
9
9
  cert_chain:
10
10
  - |
11
11
  -----BEGIN CERTIFICATE-----
@@ -43,54 +43,293 @@ dependencies:
43
43
  requirements:
44
44
  - - '='
45
45
  - !ruby/object:Gem::Version
46
- version: 7.0.0
46
+ version: 7.1.3
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.0.0
53
+ version: 7.1.3
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.0.0
60
+ version: 7.1.3
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.0.0
68
- description: Portable Rust module owner analysis and merge behavior for Structured
69
- Merge.
67
+ version: 7.1.3
68
+ - !ruby/object:Gem::Dependency
69
+ name: version_gem
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '1.1'
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: 1.1.15
78
+ type: :runtime
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - "~>"
83
+ - !ruby/object:Gem::Version
84
+ version: '1.1'
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: 1.1.15
88
+ - !ruby/object:Gem::Dependency
89
+ name: kettle-dev
90
+ requirement: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: '3.0'
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: 3.0.0
98
+ type: :development
99
+ prerelease: false
100
+ version_requirements: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: '3.0'
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: 3.0.0
108
+ - !ruby/object:Gem::Dependency
109
+ name: bundler-audit
110
+ requirement: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - "~>"
113
+ - !ruby/object:Gem::Version
114
+ version: 0.9.3
115
+ type: :development
116
+ prerelease: false
117
+ version_requirements: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - "~>"
120
+ - !ruby/object:Gem::Version
121
+ version: 0.9.3
122
+ - !ruby/object:Gem::Dependency
123
+ name: rake
124
+ requirement: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - "~>"
127
+ - !ruby/object:Gem::Version
128
+ version: '13.0'
129
+ type: :development
130
+ prerelease: false
131
+ version_requirements: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - "~>"
134
+ - !ruby/object:Gem::Version
135
+ version: '13.0'
136
+ - !ruby/object:Gem::Dependency
137
+ name: require_bench
138
+ requirement: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - "~>"
141
+ - !ruby/object:Gem::Version
142
+ version: '1.0'
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: 1.0.4
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '1.0'
153
+ - - ">="
154
+ - !ruby/object:Gem::Version
155
+ version: 1.0.4
156
+ - !ruby/object:Gem::Dependency
157
+ name: anonymous_loader
158
+ requirement: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - "~>"
161
+ - !ruby/object:Gem::Version
162
+ version: '0.1'
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: 0.1.3
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '0.1'
173
+ - - ">="
174
+ - !ruby/object:Gem::Version
175
+ version: 0.1.3
176
+ - !ruby/object:Gem::Dependency
177
+ name: appraisal2
178
+ requirement: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - "~>"
181
+ - !ruby/object:Gem::Version
182
+ version: '3.2'
183
+ - - ">="
184
+ - !ruby/object:Gem::Version
185
+ version: 3.2.2
186
+ type: :development
187
+ prerelease: false
188
+ version_requirements: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - "~>"
191
+ - !ruby/object:Gem::Version
192
+ version: '3.2'
193
+ - - ">="
194
+ - !ruby/object:Gem::Version
195
+ version: 3.2.2
196
+ - !ruby/object:Gem::Dependency
197
+ name: kettle-test
198
+ requirement: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - "~>"
201
+ - !ruby/object:Gem::Version
202
+ version: '2.0'
203
+ - - ">="
204
+ - !ruby/object:Gem::Version
205
+ version: 2.0.19
206
+ type: :development
207
+ prerelease: false
208
+ version_requirements: !ruby/object:Gem::Requirement
209
+ requirements:
210
+ - - "~>"
211
+ - !ruby/object:Gem::Version
212
+ version: '2.0'
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: 2.0.19
216
+ - !ruby/object:Gem::Dependency
217
+ name: turbo_tests2
218
+ requirement: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - "~>"
221
+ - !ruby/object:Gem::Version
222
+ version: '3.2'
223
+ - - ">="
224
+ - !ruby/object:Gem::Version
225
+ version: 3.2.5
226
+ type: :development
227
+ prerelease: false
228
+ version_requirements: !ruby/object:Gem::Requirement
229
+ requirements:
230
+ - - "~>"
231
+ - !ruby/object:Gem::Version
232
+ version: '3.2'
233
+ - - ">="
234
+ - !ruby/object:Gem::Version
235
+ version: 3.2.5
236
+ - !ruby/object:Gem::Dependency
237
+ name: ruby-progressbar
238
+ requirement: !ruby/object:Gem::Requirement
239
+ requirements:
240
+ - - "~>"
241
+ - !ruby/object:Gem::Version
242
+ version: '1.13'
243
+ type: :development
244
+ prerelease: false
245
+ version_requirements: !ruby/object:Gem::Requirement
246
+ requirements:
247
+ - - "~>"
248
+ - !ruby/object:Gem::Version
249
+ version: '1.13'
250
+ - !ruby/object:Gem::Dependency
251
+ name: stone_checksums
252
+ requirement: !ruby/object:Gem::Requirement
253
+ requirements:
254
+ - - "~>"
255
+ - !ruby/object:Gem::Version
256
+ version: '1.0'
257
+ - - ">="
258
+ - !ruby/object:Gem::Version
259
+ version: 1.0.8
260
+ type: :development
261
+ prerelease: false
262
+ version_requirements: !ruby/object:Gem::Requirement
263
+ requirements:
264
+ - - "~>"
265
+ - !ruby/object:Gem::Version
266
+ version: '1.0'
267
+ - - ">="
268
+ - !ruby/object:Gem::Version
269
+ version: 1.0.8
270
+ - !ruby/object:Gem::Dependency
271
+ name: gitmoji-regex
272
+ requirement: !ruby/object:Gem::Requirement
273
+ requirements:
274
+ - - "~>"
275
+ - !ruby/object:Gem::Version
276
+ version: '2.0'
277
+ - - ">="
278
+ - !ruby/object:Gem::Version
279
+ version: 2.0.11
280
+ type: :development
281
+ prerelease: false
282
+ version_requirements: !ruby/object:Gem::Requirement
283
+ requirements:
284
+ - - "~>"
285
+ - !ruby/object:Gem::Version
286
+ version: '2.0'
287
+ - - ">="
288
+ - !ruby/object:Gem::Version
289
+ version: 2.0.11
290
+ description: "☯️ Portable Rust module owner analysis and merge behavior for Structured
291
+ Merge."
70
292
  email:
71
- - info@structuredmerge.org
293
+ - floss@galtzo.com
72
294
  executables: []
73
295
  extensions: []
74
296
  extra_rdoc_files: []
75
297
  files:
298
+ - LICENSE.md
299
+ - README.md
76
300
  - lib/rust-merge.rb
77
301
  - lib/rust/merge.rb
302
+ - lib/rust/merge/file_analysis.rb
303
+ - lib/rust/merge/node_wrapper.rb
304
+ - lib/rust/merge/provider.rb
78
305
  - lib/rust/merge/version.rb
306
+ - sig/rust/merge.rbs
79
307
  homepage: https://github.com/structuredmerge/structuredmerge-ruby
80
308
  licenses:
81
309
  - AGPL-3.0-only
82
310
  - PolyForm-Small-Business-1.0.0
83
311
  metadata:
84
312
  homepage_uri: https://structuredmerge.org
85
- source_code_uri: https://github.com/structuredmerge/structuredmerge-ruby/tree/v7.0.0
86
- changelog_uri: https://github.com/structuredmerge/structuredmerge-ruby/blob/v7.0.0/CHANGELOG.md
313
+ source_code_uri: https://github.com/structuredmerge/structuredmerge-ruby/tree/v7.1.3
314
+ changelog_uri: https://github.com/structuredmerge/structuredmerge-ruby/blob/v7.1.3/CHANGELOG.md
87
315
  bug_tracker_uri: https://github.com/structuredmerge/structuredmerge-ruby/issues
88
- documentation_uri: https://www.rubydoc.info/gems/rust-merge/7.0.0
316
+ documentation_uri: https://www.rubydoc.info/gems/rust-merge/7.1.3
89
317
  funding_uri: https://github.com/sponsors/pboling
90
318
  wiki_uri: https://github.com/structuredmerge/structuredmerge-ruby/wiki
319
+ news_uri: https://www.railsbling.com/tags/rust-merge
91
320
  discord_uri: https://discord.gg/3qme4XHNKN
321
+ mailing_list_uri: https://www.rubyforum.org/tag/structuredmerge
92
322
  rubygems_mfa_required: 'true'
93
- rdoc_options: []
323
+ rdoc_options:
324
+ - "--title"
325
+ - rust-merge - ☯️ Structured Merge Rust module analysis and merge for Ruby
326
+ - "--main"
327
+ - README.md
328
+ - "--exclude"
329
+ - "^sig/"
330
+ - "--line-numbers"
331
+ - "--inline-source"
332
+ - "--quiet"
94
333
  require_paths:
95
334
  - lib
96
335
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -104,7 +343,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
104
343
  - !ruby/object:Gem::Version
105
344
  version: '0'
106
345
  requirements: []
107
- rubygems_version: 4.0.10
346
+ rubygems_version: 4.0.17
108
347
  specification_version: 4
109
- summary: Structured Merge Rust module analysis and merge for Ruby
348
+ summary: "☯️ Structured Merge Rust module analysis and merge for Ruby"
110
349
  test_files: []
metadata.gz.sig CHANGED
Binary file