dotenv-merge 1.0.3 → 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.
data/lib/dotenv-merge.rb CHANGED
@@ -1,4 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # For technical reasons, if we move to Zeitwerk, this cannot be require_relative.
2
4
  # See: https://github.com/fxn/zeitwerk#for_gem_extension
3
5
  # Hook for other libraries to load this library (e.g. via bundler)
4
- require "dotenv/merge"
6
+ require 'dotenv/merge'
7
+ require 'version_gem'
8
+ require_relative 'dotenv/merge/version'
9
+
10
+ Dotenv::Merge::Version.class_eval do
11
+ extend VersionGem::Basic
12
+ end
data/sig/dotenv/merge.rbs CHANGED
@@ -1,212 +1,27 @@
1
- # Type signatures for dotenv-merge gem
2
- # Smart merge for .env files using line-based analysis
3
-
4
1
  module Dotenv
5
2
  module Merge
6
- VERSION: String
7
-
8
- # Base error class for dotenv-merge
9
- class Error < StandardError
10
- end
11
-
12
- # Raised when the template file cannot be parsed
13
- class TemplateParseError < Error
14
- attr_reader errors: Array[String]
15
- attr_reader content: String?
16
-
17
- def initialize: (Array[String] errors, ?content: String?) -> void
18
- end
19
-
20
- # Raised when the destination file cannot be parsed
21
- class DestinationParseError < Error
22
- attr_reader errors: Array[String]
23
- attr_reader content: String?
24
-
25
- def initialize: (Array[String] errors, ?content: String?) -> void
26
- end
27
-
28
- # Debug logging utility for Dotenv::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
- # Represents a single line in a dotenv file
45
- class EnvLine
46
- attr_reader line_number: Integer
47
- attr_reader raw: String
48
- attr_reader key: String?
49
- attr_reader value: String?
50
- attr_reader comment: String?
51
-
52
- def initialize: (
53
- Integer line_number,
54
- String raw,
55
- ?key: String?,
56
- ?value: String?,
57
- ?comment: String?
58
- ) -> void
59
-
60
- def assignment?: () -> bool
61
- def comment?: () -> bool
62
- def blank?: () -> bool
63
- def signature: () -> Array[Symbol | String]
64
- def start_line: () -> Integer
65
- def end_line: () -> Integer
66
- def location: () -> Ast::Merge::FreezeNode::Location
67
- def freeze_node?: () -> bool
68
- def slice: () -> String
69
- def to_s: () -> String
3
+ module Version
4
+ VERSION: String
70
5
  end
6
+ VERSION: String
71
7
 
72
- # Represents a freeze block in a dotenv file
73
- class FreezeNode < Ast::Merge::FreezeNode
74
- InvalidStructureError: singleton(Ast::Merge::FreezeNode::InvalidStructureError)
75
- Location: singleton(Ast::Merge::FreezeNode::Location)
76
-
77
- attr_reader analysis: FileAnalysis
78
- attr_reader lines: Array[EnvLine]
79
- attr_reader reason: String?
8
+ BACKEND_REFERENCE: untyped
80
9
 
81
- def initialize: (
82
- start_line: Integer,
83
- end_line: Integer,
84
- analysis: FileAnalysis,
85
- ?lines: Array[EnvLine]?,
86
- ?reason: String?,
87
- ?pattern_type: Symbol
88
- ) -> void
10
+ def self.merge_provider: () -> Provider
11
+ def self.register_provider!: (?replace: bool) -> untyped
89
12
 
90
- def content: () -> String
91
- def signature: () -> Array[Symbol | String]
92
- def env_lines: () -> Array[EnvLine]
93
- def assignment?: () -> bool
94
- def comment?: () -> bool
95
- def slice: () -> String
96
- def inspect: () -> String
13
+ class Provider
14
+ def provider_id: () -> String
15
+ def family: () -> String
16
+ def capabilities: () -> Hash[Symbol, untyped]
17
+ def analyze: (Hash[Symbol, untyped] request) -> Hash[Symbol, untyped]
18
+ def diff2: (Hash[Symbol, untyped] request) -> Hash[Symbol, untyped]
19
+ def merge2: (Hash[Symbol, untyped] request) -> Hash[Symbol, untyped]
20
+ def merge3: (Hash[Symbol, untyped] request) -> Hash[Symbol, untyped]
97
21
  end
98
22
 
99
- # File analysis for dotenv files
100
23
  class FileAnalysis
101
- include Ast::Merge::FileAnalysisBase
102
-
103
- DEFAULT_FREEZE_TOKEN: String
104
-
105
- attr_reader source: String
106
- attr_reader lines: Array[EnvLine]
107
- attr_reader freeze_token: String
108
- attr_reader signature_generator: (^(EnvLine) -> Array[Symbol | String]?)?
109
- attr_reader statements: Array[EnvLine | FreezeNode]
110
- attr_reader freeze_blocks: Array[FreezeNode]
111
-
112
- def initialize: (
113
- String source,
114
- ?freeze_token: String,
115
- ?signature_generator: (^(EnvLine) -> Array[Symbol | String]?)?
116
- ) -> void
117
-
118
- def valid?: () -> bool
119
- def nodes: () -> Array[EnvLine | FreezeNode]
120
- def assignment_lines: () -> Array[EnvLine]
121
- def line_at: (Integer line_number) -> String?
122
- def normalized_line: (Integer line_num) -> String?
123
- def in_freeze_block?: (Integer line_num) -> bool
124
- def freeze_block_at: (Integer line_num) -> FreezeNode?
125
- def signature_at: (Integer index) -> Array[Symbol | String]?
126
- def generate_signature: (EnvLine | FreezeNode node) -> Array[Symbol | String]?
127
- def compute_node_signature: (untyped node) -> Array[Symbol | String]?
128
-
129
- private
130
-
131
- def parse_lines: () -> Array[EnvLine]
132
- def extract_freeze_blocks: () -> Array[FreezeNode]
133
- def integrate_lines_and_freeze_blocks: () -> Array[EnvLine | FreezeNode]
134
- end
135
-
136
- # Result of a merge operation
137
- class MergeResult < Ast::Merge::MergeResult
138
- DECISION_KEPT_TEMPLATE: Symbol
139
- DECISION_KEPT_DEST: Symbol
140
- DECISION_MERGED: Symbol
141
- DECISION_ADDED: Symbol
142
- DECISION_FREEZE_BLOCK: Symbol
143
-
144
- attr_reader template_analysis: FileAnalysis
145
- attr_reader dest_analysis: FileAnalysis
146
- attr_reader lines: Array[String]
147
- attr_reader provenance: Array[Hash[Symbol, untyped]]
148
- attr_reader decisions: Array[Hash[Symbol, untyped]]
149
-
150
- def initialize: (
151
- ?template_analysis: FileAnalysis?,
152
- ?dest_analysis: FileAnalysis?,
153
- ?conflicts: Array[Hash[Symbol, untyped]],
154
- ?frozen_blocks: Array[FreezeNode],
155
- ?stats: Hash[Symbol, untyped]
156
- ) -> void
157
-
158
- def add_line: (String line, Symbol origin, ?Integer? source_line) -> void
159
- def add_env_line: (EnvLine env_line, Symbol decision) -> void
160
- def add_freeze_block: (FreezeNode freeze_node) -> void
161
- def to_s: () -> String
162
- def to_dotenv: () -> String
163
- def content: () -> Array[String]
164
- def content_string: () -> String
165
- def empty?: () -> bool
166
- end
167
-
168
- # Smart merger for dotenv files
169
- class SmartMerger
170
- include Ast::Merge::MergerConfig
171
-
172
- attr_reader template_analysis: FileAnalysis
173
- attr_reader dest_analysis: FileAnalysis
174
- attr_reader signature_match_preference: (Symbol | Hash[Symbol, Symbol])
175
- attr_reader add_template_only_nodes: bool
176
-
177
- def initialize: (
178
- String template_content,
179
- String dest_content,
180
- ?signature_match_preference: (Symbol | Hash[Symbol, Symbol]),
181
- ?add_template_only_nodes: bool,
182
- ?freeze_token: String,
183
- ?signature_generator: (^(EnvLine) -> Array[Symbol | String]?)?,
184
- ?node_splitter: Hash[Symbol, untyped]?
185
- ) -> void
186
-
187
- def merge: () -> MergeResult
188
-
189
- private
190
-
191
- def perform_merge: () -> MergeResult
192
- def merge_lines: (MergeResult result) -> void
193
- end
194
-
195
- # Conflict resolver for dotenv merges
196
- class ConflictResolver
197
- attr_reader template_analysis: FileAnalysis
198
- attr_reader dest_analysis: FileAnalysis
199
- attr_reader signature_match_preference: (Symbol | Hash[Symbol, Symbol])
200
- attr_reader add_template_only_nodes: bool
201
-
202
- def initialize: (
203
- FileAnalysis template_analysis,
204
- FileAnalysis dest_analysis,
205
- ?signature_match_preference: (Symbol | Hash[Symbol, Symbol]),
206
- ?add_template_only_nodes: bool
207
- ) -> void
208
-
209
- def resolve: (untyped boundary, MergeResult result) -> void
24
+ attr_reader structural_diagnostics: Array[Hash[Symbol, untyped]]
210
25
  end
211
26
  end
212
27
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dotenv-merge
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 7.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -38,45 +38,47 @@ cert_chain:
38
38
  date: 1980-01-02 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
- name: tree_haver
41
+ name: ast-merge
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
- - - "~>"
45
- - !ruby/object:Gem::Version
46
- version: '5.0'
47
- - - ">="
44
+ - - '='
48
45
  - !ruby/object:Gem::Version
49
- version: 5.0.5
46
+ version: 7.1.3
50
47
  type: :runtime
51
48
  prerelease: false
52
49
  version_requirements: !ruby/object:Gem::Requirement
53
50
  requirements:
54
- - - "~>"
55
- - !ruby/object:Gem::Version
56
- version: '5.0'
57
- - - ">="
51
+ - - '='
58
52
  - !ruby/object:Gem::Version
59
- version: 5.0.5
53
+ version: 7.1.3
60
54
  - !ruby/object:Gem::Dependency
61
- name: ast-merge
55
+ name: plain-merge
62
56
  requirement: !ruby/object:Gem::Requirement
63
57
  requirements:
64
- - - "~>"
65
- - !ruby/object:Gem::Version
66
- version: '4.0'
67
- - - ">="
58
+ - - '='
68
59
  - !ruby/object:Gem::Version
69
- version: 4.0.6
60
+ version: 7.1.3
70
61
  type: :runtime
71
62
  prerelease: false
72
63
  version_requirements: !ruby/object:Gem::Requirement
73
64
  requirements:
74
- - - "~>"
65
+ - - '='
75
66
  - !ruby/object:Gem::Version
76
- version: '4.0'
77
- - - ">="
67
+ version: 7.1.3
68
+ - !ruby/object:Gem::Dependency
69
+ name: tree_haver
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - '='
78
73
  - !ruby/object:Gem::Version
79
- version: 4.0.6
74
+ version: 7.1.3
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - '='
80
+ - !ruby/object:Gem::Version
81
+ version: 7.1.3
80
82
  - !ruby/object:Gem::Dependency
81
83
  name: version_gem
82
84
  requirement: !ruby/object:Gem::Requirement
@@ -86,7 +88,7 @@ dependencies:
86
88
  version: '1.1'
87
89
  - - ">="
88
90
  - !ruby/object:Gem::Version
89
- version: 1.1.9
91
+ version: 1.1.15
90
92
  type: :runtime
91
93
  prerelease: false
92
94
  version_requirements: !ruby/object:Gem::Requirement
@@ -96,35 +98,41 @@ dependencies:
96
98
  version: '1.1'
97
99
  - - ">="
98
100
  - !ruby/object:Gem::Version
99
- version: 1.1.9
101
+ version: 1.1.15
100
102
  - !ruby/object:Gem::Dependency
101
103
  name: kettle-dev
102
104
  requirement: !ruby/object:Gem::Requirement
103
105
  requirements:
104
106
  - - "~>"
105
107
  - !ruby/object:Gem::Version
106
- version: '1.1'
108
+ version: '3.0'
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: 3.0.0
107
112
  type: :development
108
113
  prerelease: false
109
114
  version_requirements: !ruby/object:Gem::Requirement
110
115
  requirements:
111
116
  - - "~>"
112
117
  - !ruby/object:Gem::Version
113
- version: '1.1'
118
+ version: '3.0'
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: 3.0.0
114
122
  - !ruby/object:Gem::Dependency
115
123
  name: bundler-audit
116
124
  requirement: !ruby/object:Gem::Requirement
117
125
  requirements:
118
126
  - - "~>"
119
127
  - !ruby/object:Gem::Version
120
- version: 0.9.2
128
+ version: 0.9.3
121
129
  type: :development
122
130
  prerelease: false
123
131
  version_requirements: !ruby/object:Gem::Requirement
124
132
  requirements:
125
133
  - - "~>"
126
134
  - !ruby/object:Gem::Version
127
- version: 0.9.2
135
+ version: 0.9.3
128
136
  - !ruby/object:Gem::Dependency
129
137
  name: rake
130
138
  requirement: !ruby/object:Gem::Requirement
@@ -160,45 +168,85 @@ dependencies:
160
168
  - !ruby/object:Gem::Version
161
169
  version: 1.0.4
162
170
  - !ruby/object:Gem::Dependency
163
- name: appraisal2
171
+ name: anonymous_loader
164
172
  requirement: !ruby/object:Gem::Requirement
165
173
  requirements:
166
174
  - - "~>"
167
175
  - !ruby/object:Gem::Version
168
- version: '3.0'
169
- - - "~>"
176
+ version: '0.1'
177
+ - - ">="
170
178
  - !ruby/object:Gem::Version
171
- version: 3.0.6
179
+ version: 0.1.3
172
180
  type: :development
173
181
  prerelease: false
174
182
  version_requirements: !ruby/object:Gem::Requirement
175
183
  requirements:
176
184
  - - "~>"
177
185
  - !ruby/object:Gem::Version
178
- version: '3.0'
186
+ version: '0.1'
187
+ - - ">="
188
+ - !ruby/object:Gem::Version
189
+ version: 0.1.3
190
+ - !ruby/object:Gem::Dependency
191
+ name: appraisal2
192
+ requirement: !ruby/object:Gem::Requirement
193
+ requirements:
194
+ - - "~>"
195
+ - !ruby/object:Gem::Version
196
+ version: '3.2'
197
+ - - ">="
198
+ - !ruby/object:Gem::Version
199
+ version: 3.2.2
200
+ type: :development
201
+ prerelease: false
202
+ version_requirements: !ruby/object:Gem::Requirement
203
+ requirements:
179
204
  - - "~>"
180
205
  - !ruby/object:Gem::Version
181
- version: 3.0.6
206
+ version: '3.2'
207
+ - - ">="
208
+ - !ruby/object:Gem::Version
209
+ version: 3.2.2
182
210
  - !ruby/object:Gem::Dependency
183
211
  name: kettle-test
184
212
  requirement: !ruby/object:Gem::Requirement
185
213
  requirements:
186
214
  - - "~>"
187
215
  - !ruby/object:Gem::Version
188
- version: '1.0'
216
+ version: '2.0'
189
217
  - - ">="
190
218
  - !ruby/object:Gem::Version
191
- version: 1.0.10
219
+ version: 2.0.19
192
220
  type: :development
193
221
  prerelease: false
194
222
  version_requirements: !ruby/object:Gem::Requirement
195
223
  requirements:
196
224
  - - "~>"
197
225
  - !ruby/object:Gem::Version
198
- version: '1.0'
226
+ version: '2.0'
199
227
  - - ">="
200
228
  - !ruby/object:Gem::Version
201
- version: 1.0.10
229
+ version: 2.0.19
230
+ - !ruby/object:Gem::Dependency
231
+ name: turbo_tests2
232
+ requirement: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - "~>"
235
+ - !ruby/object:Gem::Version
236
+ version: '3.2'
237
+ - - ">="
238
+ - !ruby/object:Gem::Version
239
+ version: 3.2.5
240
+ type: :development
241
+ prerelease: false
242
+ version_requirements: !ruby/object:Gem::Requirement
243
+ requirements:
244
+ - - "~>"
245
+ - !ruby/object:Gem::Version
246
+ version: '3.2'
247
+ - - ">="
248
+ - !ruby/object:Gem::Version
249
+ version: 3.2.5
202
250
  - !ruby/object:Gem::Dependency
203
251
  name: ruby-progressbar
204
252
  requirement: !ruby/object:Gem::Requirement
@@ -222,7 +270,7 @@ dependencies:
222
270
  version: '1.0'
223
271
  - - ">="
224
272
  - !ruby/object:Gem::Version
225
- version: 1.0.3
273
+ version: 1.0.8
226
274
  type: :development
227
275
  prerelease: false
228
276
  version_requirements: !ruby/object:Gem::Requirement
@@ -232,84 +280,69 @@ dependencies:
232
280
  version: '1.0'
233
281
  - - ">="
234
282
  - !ruby/object:Gem::Version
235
- version: 1.0.3
283
+ version: 1.0.8
236
284
  - !ruby/object:Gem::Dependency
237
285
  name: gitmoji-regex
238
286
  requirement: !ruby/object:Gem::Requirement
239
287
  requirements:
240
288
  - - "~>"
241
289
  - !ruby/object:Gem::Version
242
- version: '1.0'
290
+ version: '2.0'
243
291
  - - ">="
244
292
  - !ruby/object:Gem::Version
245
- version: 1.0.3
293
+ version: 2.0.11
246
294
  type: :development
247
295
  prerelease: false
248
296
  version_requirements: !ruby/object:Gem::Requirement
249
297
  requirements:
250
298
  - - "~>"
251
299
  - !ruby/object:Gem::Version
252
- version: '1.0'
300
+ version: '2.0'
253
301
  - - ">="
254
302
  - !ruby/object:Gem::Version
255
- version: 1.0.3
256
- description: "☯️ Dotenv::Merge provides smart .env file merging that preserves comments,
257
- understands variable assignments, and supports freeze blocks for protecting sensitive
258
- configuration. Perfect for merging environment templates with local overrides."
303
+ version: 2.0.11
304
+ description: "☯️ Dotenv assignment, comment, freeze-block, and template merge behavior
305
+ for Structured Merge."
259
306
  email:
260
307
  - floss@galtzo.com
261
308
  executables: []
262
309
  extensions: []
263
- extra_rdoc_files:
264
- - CHANGELOG.md
265
- - CITATION.cff
266
- - CODE_OF_CONDUCT.md
267
- - CONTRIBUTING.md
268
- - FUNDING.md
269
- - LICENSE.txt
270
- - README.md
271
- - REEK
272
- - RUBOCOP.md
273
- - SECURITY.md
310
+ extra_rdoc_files: []
274
311
  files:
275
- - CHANGELOG.md
276
- - CITATION.cff
277
- - CODE_OF_CONDUCT.md
278
- - CONTRIBUTING.md
279
- - FUNDING.md
280
- - LICENSE.txt
312
+ - LICENSE.md
281
313
  - README.md
282
- - REEK
283
- - RUBOCOP.md
284
- - SECURITY.md
285
314
  - lib/dotenv-merge.rb
286
315
  - lib/dotenv/merge.rb
316
+ - lib/dotenv/merge/backend.rb
317
+ - lib/dotenv/merge/comment_tracker.rb
287
318
  - lib/dotenv/merge/debug_logger.rb
288
319
  - lib/dotenv/merge/env_line.rb
289
320
  - lib/dotenv/merge/file_analysis.rb
290
321
  - lib/dotenv/merge/freeze_node.rb
291
322
  - lib/dotenv/merge/merge_result.rb
323
+ - lib/dotenv/merge/provider.rb
292
324
  - lib/dotenv/merge/smart_merger.rb
293
325
  - lib/dotenv/merge/version.rb
294
326
  - sig/dotenv/merge.rbs
295
- - sig/dotenv/merge/env_line.rbs
296
- homepage: https://github.com/kettle-rb/dotenv-merge
327
+ homepage: https://github.com/structuredmerge/structuredmerge-ruby
297
328
  licenses:
298
- - MIT
329
+ - AGPL-3.0-only
330
+ - PolyForm-Small-Business-1.0.0
299
331
  metadata:
300
- homepage_uri: https://dotenv-merge.galtzo.com/
301
- source_code_uri: https://github.com/kettle-rb/dotenv-merge/tree/v1.0.3
302
- changelog_uri: https://github.com/kettle-rb/dotenv-merge/blob/v1.0.3/CHANGELOG.md
303
- bug_tracker_uri: https://github.com/kettle-rb/dotenv-merge/issues
304
- documentation_uri: https://www.rubydoc.info/gems/dotenv-merge/1.0.3
332
+ homepage_uri: https://structuredmerge.org
333
+ source_code_uri: https://github.com/structuredmerge/structuredmerge-ruby/tree/v7.1.3
334
+ changelog_uri: https://github.com/structuredmerge/structuredmerge-ruby/blob/v7.1.3/CHANGELOG.md
335
+ bug_tracker_uri: https://github.com/structuredmerge/structuredmerge-ruby/issues
336
+ documentation_uri: https://www.rubydoc.info/gems/dotenv-merge/7.1.3
305
337
  funding_uri: https://github.com/sponsors/pboling
306
- wiki_uri: https://github.com/kettle-rb/dotenv-merge/wiki
338
+ wiki_uri: https://github.com/structuredmerge/structuredmerge-ruby/wiki
307
339
  news_uri: https://www.railsbling.com/tags/dotenv-merge
308
340
  discord_uri: https://discord.gg/3qme4XHNKN
341
+ mailing_list_uri: https://www.rubyforum.org/tag/structuredmerge
309
342
  rubygems_mfa_required: 'true'
310
343
  rdoc_options:
311
344
  - "--title"
312
- - dotenv-merge - ☯️ Intelligent .env file merging using structured parsing
345
+ - dotenv-merge - ☯️ Structured Merge dotenv analysis and merge for Ruby
313
346
  - "--main"
314
347
  - README.md
315
348
  - "--exclude"
@@ -323,14 +356,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
323
356
  requirements:
324
357
  - - ">="
325
358
  - !ruby/object:Gem::Version
326
- version: 3.2.0
359
+ version: 4.0.0
327
360
  required_rubygems_version: !ruby/object:Gem::Requirement
328
361
  requirements:
329
362
  - - ">="
330
363
  - !ruby/object:Gem::Version
331
364
  version: '0'
332
365
  requirements: []
333
- rubygems_version: 4.0.5
366
+ rubygems_version: 4.0.17
334
367
  specification_version: 4
335
- summary: "☯️ Intelligent .env file merging using structured parsing"
368
+ summary: "☯️ Structured Merge dotenv analysis and merge for Ruby"
336
369
  test_files: []
metadata.gz.sig CHANGED
Binary file