rbs-merge 1.0.0

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.
data/sig/rbs/merge.rbs ADDED
@@ -0,0 +1,203 @@
1
+ # Type signatures for rbs-merge gem
2
+ # Smart merge for RBS type signature files using AST analysis
3
+
4
+ module Rbs
5
+ module Merge
6
+ VERSION: String
7
+
8
+ # Base error class for rbs-merge errors
9
+ class Error < StandardError
10
+ end
11
+
12
+ # Error raised when template RBS file has syntax errors
13
+ class TemplateParseError < Error
14
+ attr_reader errors: Array[RBS::BaseError]
15
+
16
+ def initialize: (Array[RBS::BaseError] errors) -> void
17
+ end
18
+
19
+ # Error raised when destination RBS file has syntax errors
20
+ class DestinationParseError < Error
21
+ attr_reader errors: Array[RBS::BaseError]
22
+
23
+ def initialize: (Array[RBS::BaseError] errors) -> void
24
+ end
25
+
26
+ # Debug logging utility
27
+ module DebugLogger
28
+ extend Ast::Merge::DebugLogger
29
+
30
+ BENCHMARK_AVAILABLE: bool
31
+ ENV_VAR_NAME: String
32
+ LOG_PREFIX: String
33
+
34
+ def self.enabled?: () -> bool
35
+ def self.debug: (String message, ?Hash[Symbol, untyped] context) -> void
36
+ def self.info: (String message) -> void
37
+ def self.warning: (String message) -> void
38
+ def self.warn: (String message) -> void
39
+ def self.time: [T] (String operation) { () -> T } -> T
40
+ end
41
+
42
+ # Freeze block node for RBS files
43
+ class FreezeNode < Ast::Merge::FreezeNode
44
+ InvalidStructureError: singleton(Ast::Merge::FreezeNode::InvalidStructureError)
45
+ Location: singleton(Ast::Merge::FreezeNode::Location)
46
+
47
+ attr_reader nodes: Array[RBS::AST::Declarations::Base | RBS::AST::Members::Base]
48
+
49
+ def initialize: (
50
+ start_line: Integer,
51
+ end_line: Integer,
52
+ analysis: FileAnalysis,
53
+ ?nodes: Array[RBS::AST::Declarations::Base | RBS::AST::Members::Base],
54
+ ?overlapping_nodes: Array[RBS::AST::Declarations::Base | RBS::AST::Members::Base]?,
55
+ ?start_marker: String?,
56
+ ?end_marker: String?,
57
+ ?pattern_type: Symbol
58
+ ) -> void
59
+
60
+ def signature: () -> Array[untyped]
61
+ def inspect: () -> String
62
+
63
+ private
64
+
65
+ def validate_structure!: () -> void
66
+ end
67
+
68
+ # Merge result container
69
+ class MergeResult < Ast::Merge::MergeResult
70
+ DECISION_FREEZE_BLOCK: Symbol
71
+ DECISION_TEMPLATE: Symbol
72
+ DECISION_DESTINATION: Symbol
73
+ DECISION_ADDED: Symbol
74
+ DECISION_RECURSIVE: Symbol
75
+
76
+ attr_reader template_analysis: FileAnalysis
77
+ attr_reader dest_analysis: FileAnalysis
78
+ attr_reader decisions: Array[Hash[Symbol, untyped]]
79
+ attr_reader content: Array[String]
80
+
81
+ def initialize: (FileAnalysis template_analysis, FileAnalysis dest_analysis) -> void
82
+
83
+ def add_from_template: (Integer index, ?decision: Symbol) -> void
84
+ def add_from_destination: (Integer index, ?decision: Symbol) -> void
85
+ def add_freeze_block: (FreezeNode freeze_node) -> void
86
+ def add_recursive_merge: (String merged_content, template_index: Integer, dest_index: Integer) -> void
87
+ def add_raw: (Array[String] lines, decision: Symbol) -> void
88
+ def to_s: () -> String
89
+ def empty?: () -> bool
90
+ def summary: () -> Hash[Symbol, untyped]
91
+
92
+ private
93
+
94
+ def extract_lines: (untyped statement, FileAnalysis analysis) -> Array[String]
95
+ end
96
+
97
+ # File analysis for RBS files
98
+ class FileAnalysis
99
+ DEFAULT_FREEZE_TOKEN: String
100
+
101
+ attr_reader buffer: RBS::Buffer
102
+ attr_reader directives: Array[RBS::AST::Directives::Base]
103
+ attr_reader declarations: Array[RBS::AST::Declarations::Base]
104
+ attr_reader source: String
105
+ attr_reader lines: Array[String]
106
+ attr_reader freeze_token: String
107
+ attr_reader signature_generator: (^(untyped) -> (Array[untyped] | untyped | nil))?
108
+ attr_reader statements: Array[RBS::AST::Declarations::Base | FreezeNode]
109
+
110
+ def initialize: (
111
+ String source,
112
+ ?freeze_token: String,
113
+ ?signature_generator: (^(untyped) -> (Array[untyped] | untyped | nil))?
114
+ ) -> void
115
+
116
+ def valid?: () -> bool
117
+ def freeze_blocks: () -> Array[FreezeNode]
118
+ def line_at: (Integer line_number) -> String?
119
+ def normalized_line: (Integer line_number) -> String?
120
+ def signature_at: (Integer index) -> Array[untyped]?
121
+ def generate_signature: (untyped node) -> Array[untyped]?
122
+ def compute_node_signature: (untyped node) -> Array[untyped]?
123
+
124
+ private
125
+
126
+ def extract_and_integrate_all_nodes: () -> Array[untyped]
127
+ def find_freeze_markers: () -> Array[Hash[Symbol, untyped]]
128
+ def build_freeze_blocks: (Array[Hash[Symbol, untyped]] markers) -> Array[FreezeNode]
129
+ def find_contained_nodes: (Integer start_line, Integer end_line) -> Array[untyped]
130
+ def find_overlapping_nodes: (Integer start_line, Integer end_line) -> Array[untyped]
131
+ def integrate_nodes_with_freeze_blocks: (Array[untyped] declarations, Array[FreezeNode] freeze_blocks) -> Array[untyped]
132
+ end
133
+
134
+ # Conflict resolver for merge operations
135
+ class ConflictResolver
136
+ attr_reader preference: (Symbol | Hash[Symbol, Symbol])
137
+ attr_reader template_analysis: FileAnalysis
138
+ attr_reader dest_analysis: FileAnalysis
139
+
140
+ def initialize: (
141
+ preference: (Symbol | Hash[Symbol, Symbol]),
142
+ template_analysis: FileAnalysis,
143
+ dest_analysis: FileAnalysis
144
+ ) -> void
145
+
146
+ def resolve: (
147
+ untyped template_decl,
148
+ untyped dest_decl,
149
+ template_index: Integer,
150
+ dest_index: Integer
151
+ ) -> Hash[Symbol, untyped]
152
+
153
+ def declarations_identical?: (untyped decl1, untyped decl2) -> bool
154
+ def can_recursive_merge?: (untyped template_decl, untyped dest_decl) -> bool
155
+ end
156
+
157
+ # File aligner for matching declarations
158
+ class FileAligner
159
+ attr_reader template_analysis: FileAnalysis
160
+ attr_reader dest_analysis: FileAnalysis
161
+
162
+ def initialize: (FileAnalysis template_analysis, FileAnalysis dest_analysis) -> void
163
+
164
+ def align: () -> Array[Hash[Symbol, untyped]]
165
+
166
+ private
167
+
168
+ def build_signature_map: (Array[untyped] statements, FileAnalysis analysis) -> Hash[Array[untyped], Array[Integer]]
169
+ def sort_alignment: (Array[Hash[Symbol, untyped]] alignment) -> Array[Hash[Symbol, untyped]]
170
+ end
171
+
172
+ # Smart merger orchestrator
173
+ class SmartMerger
174
+ attr_reader template_analysis: FileAnalysis
175
+ attr_reader dest_analysis: FileAnalysis
176
+ attr_reader aligner: FileAligner
177
+ attr_reader resolver: ConflictResolver
178
+ attr_reader result: MergeResult
179
+
180
+ def initialize: (
181
+ String template_content,
182
+ String dest_content,
183
+ ?signature_generator: (^(untyped) -> (Array[untyped] | untyped | nil))?,
184
+ ?signature_match_preference: (Symbol | Hash[Symbol, Symbol]),
185
+ ?add_template_only_nodes: bool,
186
+ ?freeze_token: String,
187
+ ?max_recursion_depth: Integer | Float,
188
+ ?node_splitter: Hash[Symbol, untyped]?
189
+ ) -> void
190
+
191
+ def merge: () -> MergeResult
192
+
193
+ private
194
+
195
+ def process_alignment: (Array[Hash[Symbol, untyped]] alignment) -> void
196
+ def process_match: (Hash[Symbol, untyped] entry) -> void
197
+ def process_template_only: (Hash[Symbol, untyped] entry) -> void
198
+ def process_dest_only: (Hash[Symbol, untyped] entry) -> void
199
+ def process_recursive_merge: (Hash[Symbol, untyped] entry, Hash[Symbol, untyped] resolution) -> void
200
+ def reconstruct_declaration_with_merged_members: (untyped template_decl, untyped dest_decl, Integer template_index, Integer dest_index) -> String
201
+ end
202
+ end
203
+ end
data.tar.gz.sig ADDED
Binary file
metadata ADDED
@@ -0,0 +1,318 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rbs-merge
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Peter H. Boling
8
+ bindir: exe
9
+ cert_chain:
10
+ - |
11
+ -----BEGIN CERTIFICATE-----
12
+ MIIEgDCCAuigAwIBAgIBATANBgkqhkiG9w0BAQsFADBDMRUwEwYDVQQDDAxwZXRl
13
+ ci5ib2xpbmcxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkW
14
+ A2NvbTAeFw0yNTA1MDQxNTMzMDlaFw00NTA0MjkxNTMzMDlaMEMxFTATBgNVBAMM
15
+ DHBldGVyLmJvbGluZzEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPy
16
+ LGQBGRYDY29tMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAruUoo0WA
17
+ uoNuq6puKWYeRYiZekz/nsDeK5x/0IEirzcCEvaHr3Bmz7rjo1I6On3gGKmiZs61
18
+ LRmQ3oxy77ydmkGTXBjruJB+pQEn7UfLSgQ0xa1/X3kdBZt6RmabFlBxnHkoaGY5
19
+ mZuZ5+Z7walmv6sFD9ajhzj+oIgwWfnEHkXYTR8I6VLN7MRRKGMPoZ/yvOmxb2DN
20
+ coEEHWKO9CvgYpW7asIihl/9GMpKiRkcYPm9dGQzZc6uTwom1COfW0+ZOFrDVBuV
21
+ FMQRPswZcY4Wlq0uEBLPU7hxnCL9nKK6Y9IhdDcz1mY6HZ91WImNslOSI0S8hRpj
22
+ yGOWxQIhBT3fqCBlRIqFQBudrnD9jSNpSGsFvbEijd5ns7Z9ZMehXkXDycpGAUj1
23
+ to/5cuTWWw1JqUWrKJYoifnVhtE1o1DZ+LkPtWxHtz5kjDG/zR3MG0Ula0UOavlD
24
+ qbnbcXPBnwXtTFeZ3C+yrWpE4pGnl3yGkZj9SMTlo9qnTMiPmuWKQDatAgMBAAGj
25
+ fzB9MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBQE8uWvNbPVNRXZ
26
+ HlgPbc2PCzC4bjAhBgNVHREEGjAYgRZwZXRlci5ib2xpbmdAZ21haWwuY29tMCEG
27
+ A1UdEgQaMBiBFnBldGVyLmJvbGluZ0BnbWFpbC5jb20wDQYJKoZIhvcNAQELBQAD
28
+ ggGBAJbnUwfJQFPkBgH9cL7hoBfRtmWiCvdqdjeTmi04u8zVNCUox0A4gT982DE9
29
+ wmuN12LpdajxZONqbXuzZvc+nb0StFwmFYZG6iDwaf4BPywm2e/Vmq0YG45vZXGR
30
+ L8yMDSK1cQXjmA+ZBKOHKWavxP6Vp7lWvjAhz8RFwqF9GuNIdhv9NpnCAWcMZtpm
31
+ GUPyIWw/Cw/2wZp74QzZj6Npx+LdXoLTF1HMSJXZ7/pkxLCsB8m4EFVdb/IrW/0k
32
+ kNSfjtAfBHO8nLGuqQZVH9IBD1i9K6aSs7pT6TW8itXUIlkIUI2tg5YzW6OFfPzq
33
+ QekSkX3lZfY+HTSp/o+YvKkqWLUV7PQ7xh1ZYDtocpaHwgxe/j3bBqHE+CUPH2vA
34
+ 0V/FwdTRWcwsjVoOJTrYcff8pBZ8r2MvtAc54xfnnhGFzeRHfcltobgFxkAXdE6p
35
+ DVjBtqT23eugOqQ73umLcYDZkc36vnqGxUBSsXrzY9pzV5gGr2I8YUxMqf6ATrZt
36
+ L9nRqA==
37
+ -----END CERTIFICATE-----
38
+ date: 1980-01-02 00:00:00.000000000 Z
39
+ dependencies:
40
+ - !ruby/object:Gem::Dependency
41
+ name: rbs
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '1.6'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '1.6'
54
+ - !ruby/object:Gem::Dependency
55
+ name: ast-merge
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '1.0'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '1.0'
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.9
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.9
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: '1.1'
95
+ type: :development
96
+ prerelease: false
97
+ version_requirements: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
100
+ - !ruby/object:Gem::Version
101
+ version: '1.1'
102
+ - !ruby/object:Gem::Dependency
103
+ name: bundler-audit
104
+ requirement: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: 0.9.2
109
+ type: :development
110
+ prerelease: false
111
+ version_requirements: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - "~>"
114
+ - !ruby/object:Gem::Version
115
+ version: 0.9.2
116
+ - !ruby/object:Gem::Dependency
117
+ name: rake
118
+ requirement: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - "~>"
121
+ - !ruby/object:Gem::Version
122
+ version: '13.0'
123
+ type: :development
124
+ prerelease: false
125
+ version_requirements: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - "~>"
128
+ - !ruby/object:Gem::Version
129
+ version: '13.0'
130
+ - !ruby/object:Gem::Dependency
131
+ name: require_bench
132
+ requirement: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - "~>"
135
+ - !ruby/object:Gem::Version
136
+ version: '1.0'
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: 1.0.4
140
+ type: :development
141
+ prerelease: false
142
+ version_requirements: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - "~>"
145
+ - !ruby/object:Gem::Version
146
+ version: '1.0'
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ version: 1.0.4
150
+ - !ruby/object:Gem::Dependency
151
+ name: appraisal2
152
+ requirement: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - "~>"
155
+ - !ruby/object:Gem::Version
156
+ version: '3.0'
157
+ type: :development
158
+ prerelease: false
159
+ version_requirements: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - "~>"
162
+ - !ruby/object:Gem::Version
163
+ version: '3.0'
164
+ - !ruby/object:Gem::Dependency
165
+ name: kettle-test
166
+ requirement: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - "~>"
169
+ - !ruby/object:Gem::Version
170
+ version: '1.0'
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: 1.0.6
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '1.0'
181
+ - - ">="
182
+ - !ruby/object:Gem::Version
183
+ version: 1.0.6
184
+ - !ruby/object:Gem::Dependency
185
+ name: ruby-progressbar
186
+ requirement: !ruby/object:Gem::Requirement
187
+ requirements:
188
+ - - "~>"
189
+ - !ruby/object:Gem::Version
190
+ version: '1.13'
191
+ type: :development
192
+ prerelease: false
193
+ version_requirements: !ruby/object:Gem::Requirement
194
+ requirements:
195
+ - - "~>"
196
+ - !ruby/object:Gem::Version
197
+ version: '1.13'
198
+ - !ruby/object:Gem::Dependency
199
+ name: stone_checksums
200
+ requirement: !ruby/object:Gem::Requirement
201
+ requirements:
202
+ - - "~>"
203
+ - !ruby/object:Gem::Version
204
+ version: '1.0'
205
+ - - ">="
206
+ - !ruby/object:Gem::Version
207
+ version: 1.0.2
208
+ type: :development
209
+ prerelease: false
210
+ version_requirements: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - "~>"
213
+ - !ruby/object:Gem::Version
214
+ version: '1.0'
215
+ - - ">="
216
+ - !ruby/object:Gem::Version
217
+ version: 1.0.2
218
+ - !ruby/object:Gem::Dependency
219
+ name: gitmoji-regex
220
+ requirement: !ruby/object:Gem::Requirement
221
+ requirements:
222
+ - - "~>"
223
+ - !ruby/object:Gem::Version
224
+ version: '1.0'
225
+ - - ">="
226
+ - !ruby/object:Gem::Version
227
+ version: 1.0.3
228
+ type: :development
229
+ prerelease: false
230
+ version_requirements: !ruby/object:Gem::Requirement
231
+ requirements:
232
+ - - "~>"
233
+ - !ruby/object:Gem::Version
234
+ version: '1.0'
235
+ - - ">="
236
+ - !ruby/object:Gem::Version
237
+ version: 1.0.3
238
+ description: "☯️ Intelligently merge RBS type signature files by parsing and comparing
239
+ AST structures. Supports freeze blocks to protect customizations, signature-based
240
+ matching, and configurable merge strategies."
241
+ email:
242
+ - floss@galtzo.com
243
+ executables: []
244
+ extensions: []
245
+ extra_rdoc_files:
246
+ - CHANGELOG.md
247
+ - CITATION.cff
248
+ - CODE_OF_CONDUCT.md
249
+ - CONTRIBUTING.md
250
+ - FUNDING.md
251
+ - LICENSE.txt
252
+ - README.md
253
+ - REEK
254
+ - RUBOCOP.md
255
+ - SECURITY.md
256
+ files:
257
+ - CHANGELOG.md
258
+ - CITATION.cff
259
+ - CODE_OF_CONDUCT.md
260
+ - CONTRIBUTING.md
261
+ - FUNDING.md
262
+ - LICENSE.txt
263
+ - README.md
264
+ - REEK
265
+ - RUBOCOP.md
266
+ - SECURITY.md
267
+ - lib/rbs-merge.rb
268
+ - lib/rbs/merge.rb
269
+ - lib/rbs/merge/conflict_resolver.rb
270
+ - lib/rbs/merge/debug_logger.rb
271
+ - lib/rbs/merge/file_aligner.rb
272
+ - lib/rbs/merge/file_analysis.rb
273
+ - lib/rbs/merge/freeze_node.rb
274
+ - lib/rbs/merge/merge_result.rb
275
+ - lib/rbs/merge/smart_merger.rb
276
+ - lib/rbs/merge/version.rb
277
+ - sig/rbs/merge.rbs
278
+ homepage: https://github.com/kettle-rb/rbs-merge
279
+ licenses:
280
+ - MIT
281
+ metadata:
282
+ homepage_uri: https://rbs-merge.galtzo.com/
283
+ source_code_uri: https://github.com/kettle-rb/rbs-merge/tree/v1.0.0
284
+ changelog_uri: https://github.com/kettle-rb/rbs-merge/blob/v1.0.0/CHANGELOG.md
285
+ bug_tracker_uri: https://github.com/kettle-rb/rbs-merge/issues
286
+ documentation_uri: https://www.rubydoc.info/gems/rbs-merge/1.0.0
287
+ funding_uri: https://github.com/sponsors/pboling
288
+ wiki_uri: https://github.com/kettle-rb/rbs-merge/wiki
289
+ news_uri: https://www.railsbling.com/tags/rbs-merge
290
+ discord_uri: https://discord.gg/3qme4XHNKN
291
+ rubygems_mfa_required: 'true'
292
+ rdoc_options:
293
+ - "--title"
294
+ - rbs-merge - ☯️ Smart merge for RBS type signature files using AST analysis
295
+ - "--main"
296
+ - README.md
297
+ - "--exclude"
298
+ - "^sig/"
299
+ - "--line-numbers"
300
+ - "--inline-source"
301
+ - "--quiet"
302
+ require_paths:
303
+ - lib
304
+ required_ruby_version: !ruby/object:Gem::Requirement
305
+ requirements:
306
+ - - ">="
307
+ - !ruby/object:Gem::Version
308
+ version: 3.2.0
309
+ required_rubygems_version: !ruby/object:Gem::Requirement
310
+ requirements:
311
+ - - ">="
312
+ - !ruby/object:Gem::Version
313
+ version: '0'
314
+ requirements: []
315
+ rubygems_version: 4.0.1
316
+ specification_version: 4
317
+ summary: "☯️ Smart merge for RBS type signature files using AST analysis"
318
+ test_files: []
metadata.gz.sig ADDED
Binary file