bash-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.
@@ -0,0 +1,260 @@
1
+ # Type signatures for bash-merge gem
2
+ # Smart merge for Bash scripts using tree-sitter AST analysis
3
+
4
+ module Bash
5
+ module Merge
6
+ VERSION: String
7
+
8
+ # Base error class for bash-merge errors
9
+ class Error < StandardError
10
+ end
11
+
12
+ # Error raised when template Bash file has syntax errors
13
+ class TemplateParseError < Error
14
+ attr_reader errors: Array[untyped]
15
+ attr_reader content: String?
16
+
17
+ def initialize: (?String? message, ?errors: Array[untyped], ?content: String?) -> void
18
+ end
19
+
20
+ # Error raised when destination Bash file has syntax errors
21
+ class DestinationParseError < Error
22
+ attr_reader errors: Array[untyped]
23
+ attr_reader content: String?
24
+
25
+ def initialize: (?String? message, ?errors: Array[untyped], ?content: String?) -> void
26
+ end
27
+
28
+ # Debug logging utility for Bash::Merge
29
+ module DebugLogger
30
+ extend Ast::Merge::DebugLogger
31
+
32
+ def self.env_var_name: () -> String
33
+ def self.env_var_name=: (String name) -> String
34
+ def self.log_prefix: () -> String
35
+ def self.log_prefix=: (String prefix) -> String
36
+ def self.enabled?: () -> bool
37
+ def self.debug: (String message, ?Hash[Symbol, untyped] context) -> void
38
+ def self.info: (String message) -> void
39
+ def self.warning: (String message) -> void
40
+ def self.time: [T] (String operation) { () -> T } -> T
41
+ def self.extract_node_info: (untyped node) -> Hash[Symbol, untyped]
42
+ end
43
+
44
+ # Freeze block node for Bash scripts
45
+ class FreezeNode < Ast::Merge::FreezeNode
46
+ InvalidStructureError: singleton(Ast::Merge::FreezeNode::InvalidStructureError)
47
+ Location: singleton(Ast::Merge::FreezeNode::Location)
48
+
49
+ attr_reader lines: Array[String]
50
+
51
+ def initialize: (
52
+ start_line: Integer,
53
+ end_line: Integer,
54
+ lines: Array[String],
55
+ ?start_marker: String?,
56
+ ?end_marker: String?,
57
+ ?pattern_type: Symbol
58
+ ) -> void
59
+
60
+ def signature: () -> Array[Symbol | String]
61
+ def function_definition?: () -> bool
62
+ def variable_assignment?: () -> bool
63
+ def command?: () -> bool
64
+ def slice: () -> String?
65
+ def inspect: () -> String
66
+
67
+ private
68
+
69
+ def validate_structure!: () -> void
70
+ end
71
+
72
+ # Wrapper for tree-sitter Bash nodes
73
+ class NodeWrapper
74
+ attr_reader node: untyped
75
+ attr_reader start_line: Integer
76
+ attr_reader end_line: Integer
77
+ attr_reader source: String
78
+ attr_reader analysis: FileAnalysis?
79
+
80
+ def initialize: (
81
+ untyped node,
82
+ String source,
83
+ ?analysis: FileAnalysis?
84
+ ) -> void
85
+
86
+ def location: () -> Ast::Merge::FreezeNode::Location
87
+ def signature: () -> Array[untyped]
88
+ def freeze_node?: () -> bool
89
+ def function_definition?: () -> bool
90
+ def variable_assignment?: () -> bool
91
+ def command?: () -> bool
92
+ def comment?: () -> bool
93
+ def name: () -> String?
94
+ def value: () -> String?
95
+ def slice: () -> String?
96
+ def text: () -> String
97
+ def type: () -> Symbol
98
+ def inspect: () -> String
99
+ end
100
+
101
+ # Comment tracker for Bash files
102
+ class CommentTracker
103
+ attr_reader comments: Array[Hash[Symbol, untyped]]
104
+ attr_reader source: String
105
+ attr_reader lines: Array[String]
106
+
107
+ def initialize: (String source) -> void
108
+
109
+ def extract_comments: () -> Array[Hash[Symbol, untyped]]
110
+ def comments_for_line: (Integer line) -> Array[Hash[Symbol, untyped]]
111
+ def leading_comments_for: (Integer line) -> Array[Hash[Symbol, untyped]]
112
+ def trailing_comment_for: (Integer line) -> Hash[Symbol, untyped]?
113
+ def shebang?: (String line) -> bool
114
+ end
115
+
116
+ # File analysis for Bash scripts
117
+ class FileAnalysis
118
+ include Ast::Merge::FileAnalysisBase
119
+
120
+ DEFAULT_FREEZE_TOKEN: String
121
+ PARSER_SEARCH_PATHS: Array[String]
122
+
123
+ attr_reader source: String
124
+ attr_reader lines: Array[String]
125
+ attr_reader ast: untyped
126
+ attr_reader statements: Array[NodeWrapper | FreezeNode]
127
+ attr_reader freeze_blocks: Array[FreezeNode]
128
+ attr_reader freeze_token: String
129
+ attr_reader signature_generator: (^(untyped) -> Array[untyped]?)?
130
+ attr_reader comment_tracker: CommentTracker
131
+ attr_reader errors: Array[untyped]
132
+
133
+ def self.find_parser_path: () -> String?
134
+
135
+ def initialize: (
136
+ String source,
137
+ ?freeze_token: String,
138
+ ?signature_generator: (^(untyped) -> Array[untyped]?)?,
139
+ ?parser_path: String?
140
+ ) -> void
141
+
142
+ def valid?: () -> bool
143
+ def nodes: () -> Array[NodeWrapper | FreezeNode]
144
+ def line_at: (Integer line_num) -> String?
145
+ def normalized_line: (Integer line_num) -> String?
146
+ def in_freeze_block?: (Integer line_num) -> bool
147
+ def freeze_block_at: (Integer line_num) -> FreezeNode?
148
+ def signature_at: (Integer index) -> Array[untyped]?
149
+ def generate_signature: (untyped node) -> Array[untyped]?
150
+ def compute_node_signature: (untyped node) -> Array[untyped]?
151
+
152
+ private
153
+
154
+ def parse_bash: () -> void
155
+ def extract_nodes: (untyped tree_node) -> Array[NodeWrapper]
156
+ def extract_freeze_blocks: () -> Array[FreezeNode]
157
+ def integrate_nodes_and_freeze_blocks: () -> Array[NodeWrapper | FreezeNode]
158
+ end
159
+
160
+ # Result of a Bash merge operation
161
+ class MergeResult < Ast::Merge::MergeResult
162
+ DECISION_KEPT_TEMPLATE: Symbol
163
+ DECISION_KEPT_DEST: Symbol
164
+ DECISION_MERGED: Symbol
165
+ DECISION_ADDED: Symbol
166
+ DECISION_FREEZE_BLOCK: Symbol
167
+
168
+ attr_reader lines: Array[Hash[Symbol, untyped]]
169
+ attr_reader decisions: Array[Hash[Symbol, untyped]]
170
+ attr_reader statistics: Hash[Symbol, Integer]
171
+
172
+ def initialize: (
173
+ ?template_analysis: FileAnalysis?,
174
+ ?dest_analysis: FileAnalysis?,
175
+ ?conflicts: Array[Hash[Symbol, untyped]],
176
+ ?frozen_blocks: Array[FreezeNode],
177
+ ?stats: Hash[Symbol, untyped]
178
+ ) -> void
179
+
180
+ def add_line: (
181
+ String line,
182
+ decision: Symbol,
183
+ source: Symbol,
184
+ ?original_line: Integer?
185
+ ) -> void
186
+
187
+ def add_lines: (
188
+ Array[String] lines,
189
+ decision: Symbol,
190
+ source: Symbol,
191
+ ?start_line: Integer?
192
+ ) -> void
193
+
194
+ def add_blank_line: (?decision: Symbol, ?source: Symbol) -> void
195
+ def add_freeze_block: (FreezeNode freeze_node) -> void
196
+ def to_bash: () -> String
197
+ def content: () -> Array[Hash[Symbol, untyped]]
198
+ def content_string: () -> String
199
+ def empty?: () -> bool
200
+
201
+ private
202
+
203
+ def track_statistics: (Symbol decision, Symbol source) -> void
204
+ end
205
+
206
+ # Smart merger for Bash scripts
207
+ class SmartMerger
208
+ include Ast::Merge::MergerConfig
209
+
210
+ attr_reader template_analysis: FileAnalysis
211
+ attr_reader dest_analysis: FileAnalysis
212
+ attr_reader signature_match_preference: (Symbol | Hash[Symbol, Symbol])
213
+ attr_reader add_template_only_nodes: bool
214
+
215
+ def initialize: (
216
+ String template_content,
217
+ String dest_content,
218
+ ?signature_match_preference: (Symbol | Hash[Symbol, Symbol]),
219
+ ?add_template_only_nodes: bool,
220
+ ?freeze_token: String,
221
+ ?signature_generator: (^(untyped) -> Array[untyped]?)?,
222
+ ?node_splitter: Hash[Symbol, untyped]?,
223
+ ?parser_path: String?
224
+ ) -> void
225
+
226
+ def merge: () -> MergeResult
227
+
228
+ private
229
+
230
+ def perform_merge: () -> MergeResult
231
+ def merge_nodes: (MergeResult result) -> void
232
+ end
233
+
234
+ # Conflict resolver for Bash merges
235
+ class ConflictResolver
236
+ attr_reader template_analysis: FileAnalysis
237
+ attr_reader dest_analysis: FileAnalysis
238
+ attr_reader signature_match_preference: (Symbol | Hash[Symbol, Symbol])
239
+ attr_reader add_template_only_nodes: bool
240
+
241
+ def initialize: (
242
+ FileAnalysis template_analysis,
243
+ FileAnalysis dest_analysis,
244
+ ?signature_match_preference: (Symbol | Hash[Symbol, Symbol]),
245
+ ?add_template_only_nodes: bool
246
+ ) -> void
247
+
248
+ def resolve: (untyped boundary, MergeResult result) -> void
249
+ end
250
+
251
+ # Emitter for reconstructing Bash output
252
+ class Emitter
253
+ attr_reader result: MergeResult
254
+
255
+ def initialize: (MergeResult result) -> void
256
+
257
+ def emit: () -> String
258
+ end
259
+ end
260
+ end
data.tar.gz.sig ADDED
Binary file
metadata ADDED
@@ -0,0 +1,353 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bash-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: tree_haver
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '3.2'
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: 3.2.2
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: '3.2'
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: 3.2.2
60
+ - !ruby/object:Gem::Dependency
61
+ name: ast-merge
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: '2.0'
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: 2.0.6
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '2.0'
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: 2.0.6
80
+ - !ruby/object:Gem::Dependency
81
+ name: version_gem
82
+ requirement: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - "~>"
85
+ - !ruby/object:Gem::Version
86
+ version: '1.1'
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: 1.1.9
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.1'
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: 1.1.9
100
+ - !ruby/object:Gem::Dependency
101
+ name: kettle-dev
102
+ requirement: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - "~>"
105
+ - !ruby/object:Gem::Version
106
+ version: '1.1'
107
+ type: :development
108
+ prerelease: false
109
+ version_requirements: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - "~>"
112
+ - !ruby/object:Gem::Version
113
+ version: '1.1'
114
+ - !ruby/object:Gem::Dependency
115
+ name: bundler-audit
116
+ requirement: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - "~>"
119
+ - !ruby/object:Gem::Version
120
+ version: 0.9.2
121
+ type: :development
122
+ prerelease: false
123
+ version_requirements: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - "~>"
126
+ - !ruby/object:Gem::Version
127
+ version: 0.9.2
128
+ - !ruby/object:Gem::Dependency
129
+ name: rake
130
+ requirement: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - "~>"
133
+ - !ruby/object:Gem::Version
134
+ version: '13.0'
135
+ type: :development
136
+ prerelease: false
137
+ version_requirements: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - "~>"
140
+ - !ruby/object:Gem::Version
141
+ version: '13.0'
142
+ - !ruby/object:Gem::Dependency
143
+ name: require_bench
144
+ requirement: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - "~>"
147
+ - !ruby/object:Gem::Version
148
+ version: '1.0'
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: 1.0.4
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: '1.0'
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ version: 1.0.4
162
+ - !ruby/object:Gem::Dependency
163
+ name: appraisal2
164
+ requirement: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - "~>"
167
+ - !ruby/object:Gem::Version
168
+ version: '3.0'
169
+ type: :development
170
+ prerelease: false
171
+ version_requirements: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - "~>"
174
+ - !ruby/object:Gem::Version
175
+ version: '3.0'
176
+ - !ruby/object:Gem::Dependency
177
+ name: kettle-soup-cover
178
+ requirement: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - "~>"
181
+ - !ruby/object:Gem::Version
182
+ version: '1.1'
183
+ - - ">="
184
+ - !ruby/object:Gem::Version
185
+ version: 1.1.1
186
+ type: :development
187
+ prerelease: false
188
+ version_requirements: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - "~>"
191
+ - !ruby/object:Gem::Version
192
+ version: '1.1'
193
+ - - ">="
194
+ - !ruby/object:Gem::Version
195
+ version: 1.1.1
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: '1.0'
203
+ - - ">="
204
+ - !ruby/object:Gem::Version
205
+ version: 1.0.7
206
+ type: :development
207
+ prerelease: false
208
+ version_requirements: !ruby/object:Gem::Requirement
209
+ requirements:
210
+ - - "~>"
211
+ - !ruby/object:Gem::Version
212
+ version: '1.0'
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: 1.0.7
216
+ - !ruby/object:Gem::Dependency
217
+ name: ruby-progressbar
218
+ requirement: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - "~>"
221
+ - !ruby/object:Gem::Version
222
+ version: '1.13'
223
+ type: :development
224
+ prerelease: false
225
+ version_requirements: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: '1.13'
230
+ - !ruby/object:Gem::Dependency
231
+ name: stone_checksums
232
+ requirement: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - "~>"
235
+ - !ruby/object:Gem::Version
236
+ version: '1.0'
237
+ - - ">="
238
+ - !ruby/object:Gem::Version
239
+ version: 1.0.2
240
+ type: :development
241
+ prerelease: false
242
+ version_requirements: !ruby/object:Gem::Requirement
243
+ requirements:
244
+ - - "~>"
245
+ - !ruby/object:Gem::Version
246
+ version: '1.0'
247
+ - - ">="
248
+ - !ruby/object:Gem::Version
249
+ version: 1.0.2
250
+ - !ruby/object:Gem::Dependency
251
+ name: gitmoji-regex
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.3
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.3
270
+ description: "☯️ Bash::Merge provides smart Bash script merging that preserves comments,
271
+ understands shell structure, and supports freeze blocks for protecting destination
272
+ content. Perfect for merging configuration scripts and shell templates with customized
273
+ destination files."
274
+ email:
275
+ - floss@galtzo.com
276
+ executables: []
277
+ extensions: []
278
+ extra_rdoc_files:
279
+ - CHANGELOG.md
280
+ - CITATION.cff
281
+ - CODE_OF_CONDUCT.md
282
+ - CONTRIBUTING.md
283
+ - FUNDING.md
284
+ - LICENSE.txt
285
+ - README.md
286
+ - REEK
287
+ - RUBOCOP.md
288
+ - SECURITY.md
289
+ files:
290
+ - CHANGELOG.md
291
+ - CITATION.cff
292
+ - CODE_OF_CONDUCT.md
293
+ - CONTRIBUTING.md
294
+ - FUNDING.md
295
+ - LICENSE.txt
296
+ - README.md
297
+ - REEK
298
+ - RUBOCOP.md
299
+ - SECURITY.md
300
+ - lib/bash-merge.rb
301
+ - lib/bash/merge.rb
302
+ - lib/bash/merge/comment_tracker.rb
303
+ - lib/bash/merge/conflict_resolver.rb
304
+ - lib/bash/merge/debug_logger.rb
305
+ - lib/bash/merge/emitter.rb
306
+ - lib/bash/merge/file_analysis.rb
307
+ - lib/bash/merge/freeze_node.rb
308
+ - lib/bash/merge/merge_result.rb
309
+ - lib/bash/merge/node_wrapper.rb
310
+ - lib/bash/merge/smart_merger.rb
311
+ - lib/bash/merge/version.rb
312
+ - sig/bash/merge.rbs
313
+ homepage: https://github.com/kettle-rb/bash-merge
314
+ licenses:
315
+ - MIT
316
+ metadata:
317
+ homepage_uri: https://bash-merge.galtzo.com/
318
+ source_code_uri: https://github.com/kettle-rb/bash-merge/tree/v1.0.0
319
+ changelog_uri: https://github.com/kettle-rb/bash-merge/blob/v1.0.0/CHANGELOG.md
320
+ bug_tracker_uri: https://github.com/kettle-rb/bash-merge/issues
321
+ documentation_uri: https://www.rubydoc.info/gems/bash-merge/1.0.0
322
+ funding_uri: https://github.com/sponsors/pboling
323
+ wiki_uri: https://github.com/kettle-rb/bash-merge/wiki
324
+ news_uri: https://www.railsbling.com/tags/bash-merge
325
+ discord_uri: https://discord.gg/3qme4XHNKN
326
+ rubygems_mfa_required: 'true'
327
+ rdoc_options:
328
+ - "--title"
329
+ - bash-merge - ☯️ Intelligent Bash script merging using tree-sitter AST analysis
330
+ - "--main"
331
+ - README.md
332
+ - "--exclude"
333
+ - "^sig/"
334
+ - "--line-numbers"
335
+ - "--inline-source"
336
+ - "--quiet"
337
+ require_paths:
338
+ - lib
339
+ required_ruby_version: !ruby/object:Gem::Requirement
340
+ requirements:
341
+ - - ">="
342
+ - !ruby/object:Gem::Version
343
+ version: 3.2.0
344
+ required_rubygems_version: !ruby/object:Gem::Requirement
345
+ requirements:
346
+ - - ">="
347
+ - !ruby/object:Gem::Version
348
+ version: '0'
349
+ requirements: []
350
+ rubygems_version: 4.0.3
351
+ specification_version: 4
352
+ summary: "☯️ Intelligent Bash script merging using tree-sitter AST analysis"
353
+ test_files: []
metadata.gz.sig ADDED
@@ -0,0 +1,3 @@
1
+ &XC�=�U-qtU����*X]��5w<��Є�Lp�0_����XD���@k>���(iD/��o���:z���4**LD������;}i��G�ޯ���Sj�)�����|���"�eDE�O,͘ �\��G��X�����H�?p$���m�O�t�������ʒ1�;���~BVz+�7 ����\Vo��g��*��t�w�0�*�j`mf̾�-_q��?���C��6�}�ʔ_��d4�F
2
+ ��ݔxM�{��
3
+ �+��IZѸ��8E�}��خ�9�E� �f�mMZ�z�[1w��0�a6vu��&��KI!@W�ʦ