json-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,201 @@
1
+ # Type signatures for json-merge gem
2
+ # Smart merge for JSON files using tree-sitter AST analysis
3
+
4
+ module Json
5
+ module Merge
6
+ VERSION: String
7
+
8
+ # Base error class for json-merge errors
9
+ class Error < StandardError
10
+ end
11
+
12
+ # Error raised when template JSON 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 JSON 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 Json::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
+ # Wrapper for tree-sitter JSON nodes
45
+ class NodeWrapper
46
+ attr_reader node: untyped
47
+ attr_reader start_line: Integer
48
+ attr_reader end_line: Integer
49
+ attr_reader analysis: FileAnalysis?
50
+
51
+ def initialize: (
52
+ untyped node,
53
+ String source,
54
+ ?analysis: FileAnalysis?
55
+ ) -> void
56
+
57
+ def location: () -> Ast::Merge::FreezeNode::Location
58
+ def signature: () -> Array[untyped]
59
+ def object?: () -> bool
60
+ def array?: () -> bool
61
+ def pair?: () -> bool
62
+ def key: () -> String?
63
+ def value: () -> untyped
64
+ def slice: () -> String?
65
+ def text: () -> String
66
+ def inspect: () -> String
67
+ end
68
+
69
+ # File analysis for JSON files
70
+ class FileAnalysis
71
+ include Ast::Merge::FileAnalysisBase
72
+
73
+ PARSER_SEARCH_PATHS: Array[String]
74
+
75
+ attr_reader source: String
76
+ attr_reader lines: Array[String]
77
+ attr_reader ast: untyped
78
+ attr_reader statements: Array[NodeWrapper]
79
+ attr_reader signature_generator: (^(untyped) -> Array[untyped]?)?
80
+ attr_reader errors: Array[untyped]
81
+
82
+ def self.find_parser_path: () -> String?
83
+
84
+ def initialize: (
85
+ String source,
86
+ ?signature_generator: (^(untyped) -> Array[untyped]?)?,
87
+ ?parser_path: String?
88
+ ) -> void
89
+
90
+ def valid?: () -> bool
91
+ def line_at: (Integer line_num) -> String?
92
+ def normalized_line: (Integer line_num) -> String?
93
+ def signature_at: (Integer index) -> Array[untyped]?
94
+ def generate_signature: (untyped statement) -> Array[untyped]?
95
+ def compute_node_signature: (untyped statement) -> Array[untyped]?
96
+
97
+ private
98
+
99
+ def parse_json: () -> void
100
+ def extract_nodes: (untyped tree_node) -> Array[NodeWrapper]
101
+ def integrate_nodes: () -> Array[NodeWrapper]
102
+ end
103
+
104
+ # Result of a JSON merge operation
105
+ class MergeResult < Ast::Merge::MergeResult
106
+ DECISION_KEPT_TEMPLATE: Symbol
107
+ DECISION_KEPT_DEST: Symbol
108
+ DECISION_MERGED: Symbol
109
+ DECISION_ADDED: Symbol
110
+
111
+ attr_reader lines: Array[Hash[Symbol, untyped]]
112
+ attr_reader decisions: Array[Hash[Symbol, untyped]]
113
+ attr_reader statistics: Hash[Symbol, Integer]
114
+
115
+ def initialize: (
116
+ ?template_analysis: FileAnalysis?,
117
+ ?dest_analysis: FileAnalysis?,
118
+ ?conflicts: Array[Hash[Symbol, untyped]],
119
+ ?stats: Hash[Symbol, untyped]
120
+ ) -> void
121
+
122
+ def add_line: (
123
+ String line,
124
+ decision: Symbol,
125
+ source: Symbol,
126
+ ?original_line: Integer?
127
+ ) -> void
128
+
129
+ def add_lines: (
130
+ Array[String] lines,
131
+ decision: Symbol,
132
+ source: Symbol,
133
+ ?start_line: Integer?
134
+ ) -> void
135
+
136
+ def add_blank_line: (?decision: Symbol, ?source: Symbol) -> void
137
+ def to_json: () -> String
138
+ def content: () -> Array[Hash[Symbol, untyped]]
139
+ def content_string: () -> String
140
+ def empty?: () -> bool
141
+
142
+ private
143
+
144
+ def track_statistics: (Symbol decision, Symbol source) -> void
145
+ end
146
+
147
+ # Smart merger for JSON files
148
+ class SmartMerger
149
+ include Ast::Merge::MergerConfig
150
+
151
+ attr_reader template_analysis: FileAnalysis
152
+ attr_reader dest_analysis: FileAnalysis
153
+ attr_reader signature_match_preference: (Symbol | Hash[Symbol, Symbol])
154
+ attr_reader add_template_only_nodes: bool
155
+
156
+ def initialize: (
157
+ String template_content,
158
+ String dest_content,
159
+ ?signature_match_preference: (Symbol | Hash[Symbol, Symbol]),
160
+ ?add_template_only_nodes: bool,
161
+ ?signature_generator: (^(untyped) -> Array[untyped]?)?,
162
+ ?node_splitter: Hash[Symbol, untyped]?,
163
+ ?parser_path: String?
164
+ ) -> void
165
+
166
+ def merge: () -> MergeResult
167
+
168
+ private
169
+
170
+ def perform_merge: () -> MergeResult
171
+ def merge_nodes: (MergeResult result) -> void
172
+ end
173
+
174
+ # Conflict resolver for JSON merges
175
+ class ConflictResolver
176
+ attr_reader template_analysis: FileAnalysis
177
+ attr_reader dest_analysis: FileAnalysis
178
+ attr_reader signature_match_preference: (Symbol | Hash[Symbol, Symbol])
179
+ attr_reader add_template_only_nodes: bool
180
+
181
+ def initialize: (
182
+ FileAnalysis template_analysis,
183
+ FileAnalysis dest_analysis,
184
+ ?signature_match_preference: (Symbol | Hash[Symbol, Symbol]),
185
+ ?add_template_only_nodes: bool
186
+ ) -> void
187
+
188
+ def resolve: (untyped boundary, MergeResult result) -> void
189
+ end
190
+
191
+ # Emitter for reconstructing JSON output
192
+ class Emitter
193
+ attr_reader result: MergeResult
194
+ attr_reader indent: Integer
195
+
196
+ def initialize: (MergeResult result, ?indent: Integer) -> void
197
+
198
+ def emit: () -> String
199
+ end
200
+ end
201
+ end
data.tar.gz.sig ADDED
Binary file
metadata ADDED
@@ -0,0 +1,332 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: json-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.6
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.6
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: '3.0'
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: 3.0.0
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '3.0'
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: 3.0.0
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-test
178
+ requirement: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - "~>"
181
+ - !ruby/object:Gem::Version
182
+ version: '1.0'
183
+ - - ">="
184
+ - !ruby/object:Gem::Version
185
+ version: 1.0.6
186
+ type: :development
187
+ prerelease: false
188
+ version_requirements: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - "~>"
191
+ - !ruby/object:Gem::Version
192
+ version: '1.0'
193
+ - - ">="
194
+ - !ruby/object:Gem::Version
195
+ version: 1.0.6
196
+ - !ruby/object:Gem::Dependency
197
+ name: ruby-progressbar
198
+ requirement: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - "~>"
201
+ - !ruby/object:Gem::Version
202
+ version: '1.13'
203
+ type: :development
204
+ prerelease: false
205
+ version_requirements: !ruby/object:Gem::Requirement
206
+ requirements:
207
+ - - "~>"
208
+ - !ruby/object:Gem::Version
209
+ version: '1.13'
210
+ - !ruby/object:Gem::Dependency
211
+ name: stone_checksums
212
+ requirement: !ruby/object:Gem::Requirement
213
+ requirements:
214
+ - - "~>"
215
+ - !ruby/object:Gem::Version
216
+ version: '1.0'
217
+ - - ">="
218
+ - !ruby/object:Gem::Version
219
+ version: 1.0.2
220
+ type: :development
221
+ prerelease: false
222
+ version_requirements: !ruby/object:Gem::Requirement
223
+ requirements:
224
+ - - "~>"
225
+ - !ruby/object:Gem::Version
226
+ version: '1.0'
227
+ - - ">="
228
+ - !ruby/object:Gem::Version
229
+ version: 1.0.2
230
+ - !ruby/object:Gem::Dependency
231
+ name: gitmoji-regex
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.3
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.3
250
+ description: "☯️ Json::Merge provides smart JSON file merging that understands JSON
251
+ structure. Perfect for merging strict JSON configuration files like package.json,
252
+ tsconfig.json (without comments), and other standard JSON files. For JSON with Comments
253
+ (JSONC) files like devcontainer.json and VS Code settings, use jsonc-merge instead."
254
+ email:
255
+ - floss@galtzo.com
256
+ executables: []
257
+ extensions: []
258
+ extra_rdoc_files:
259
+ - CHANGELOG.md
260
+ - CITATION.cff
261
+ - CODE_OF_CONDUCT.md
262
+ - CONTRIBUTING.md
263
+ - FUNDING.md
264
+ - LICENSE.txt
265
+ - README.md
266
+ - REEK
267
+ - RUBOCOP.md
268
+ - SECURITY.md
269
+ files:
270
+ - CHANGELOG.md
271
+ - CITATION.cff
272
+ - CODE_OF_CONDUCT.md
273
+ - CONTRIBUTING.md
274
+ - FUNDING.md
275
+ - LICENSE.txt
276
+ - README.md
277
+ - REEK
278
+ - RUBOCOP.md
279
+ - SECURITY.md
280
+ - lib/json-merge.rb
281
+ - lib/json/merge.rb
282
+ - lib/json/merge/conflict_resolver.rb
283
+ - lib/json/merge/debug_logger.rb
284
+ - lib/json/merge/emitter.rb
285
+ - lib/json/merge/file_analysis.rb
286
+ - lib/json/merge/merge_result.rb
287
+ - lib/json/merge/node_wrapper.rb
288
+ - lib/json/merge/object_match_refiner.rb
289
+ - lib/json/merge/smart_merger.rb
290
+ - lib/json/merge/version.rb
291
+ - sig/json/merge.rbs
292
+ homepage: https://github.com/kettle-rb/json-merge
293
+ licenses:
294
+ - MIT
295
+ metadata:
296
+ homepage_uri: https://json-merge.galtzo.com/
297
+ source_code_uri: https://github.com/kettle-rb/json-merge/tree/v1.0.0
298
+ changelog_uri: https://github.com/kettle-rb/json-merge/blob/v1.0.0/CHANGELOG.md
299
+ bug_tracker_uri: https://github.com/kettle-rb/json-merge/issues
300
+ documentation_uri: https://www.rubydoc.info/gems/json-merge/1.0.0
301
+ funding_uri: https://github.com/sponsors/pboling
302
+ wiki_uri: https://github.com/kettle-rb/json-merge/wiki
303
+ news_uri: https://www.railsbling.com/tags/json-merge
304
+ discord_uri: https://discord.gg/3qme4XHNKN
305
+ rubygems_mfa_required: 'true'
306
+ rdoc_options:
307
+ - "--title"
308
+ - json-merge - ☯️ Intelligent JSON file merging using tree-sitter AST analysis
309
+ - "--main"
310
+ - README.md
311
+ - "--exclude"
312
+ - "^sig/"
313
+ - "--line-numbers"
314
+ - "--inline-source"
315
+ - "--quiet"
316
+ require_paths:
317
+ - lib
318
+ required_ruby_version: !ruby/object:Gem::Requirement
319
+ requirements:
320
+ - - ">="
321
+ - !ruby/object:Gem::Version
322
+ version: 3.2.0
323
+ required_rubygems_version: !ruby/object:Gem::Requirement
324
+ requirements:
325
+ - - ">="
326
+ - !ruby/object:Gem::Version
327
+ version: '0'
328
+ requirements: []
329
+ rubygems_version: 4.0.3
330
+ specification_version: 4
331
+ summary: "☯️ Intelligent JSON file merging using tree-sitter AST analysis"
332
+ test_files: []
metadata.gz.sig ADDED
Binary file