opdotenv 1.0.2 → 1.0.5

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ab16f9144c5c1ce14ba72552fb42fabdfa649be3fd30888cf9778cb85a107dca
4
- data.tar.gz: 93da9bbea0c621726e3d9df051efeeb1dc3e9647653d11cb28501aa1bda3f901
3
+ metadata.gz: 681b84ce04a08dea4ef5bb4645ecf47071922f63288f5d6b26fcc558d2b181fd
4
+ data.tar.gz: d6706fb654448e9d4efa404d373d54d5f9ef5b5f5553a73c5335c28b6a7f9508
5
5
  SHA512:
6
- metadata.gz: 82046c290a5d56508f7c51b49481d8c0442d41093da3a8fac56edc65361a58070ec629d8c3d52c866bab1fff93f7f04c953b54ef5cf999222f94f1b050aeca36
7
- data.tar.gz: d8f041eaf6f2f309b9c2a5f7fda1dc50b5295c7d54f51c7897d1f96410a5667cc9b6a3a1ff700e06b8b05944cc8797ce88b9b0dc43d684ff927a042629161120
6
+ metadata.gz: 43741125e5322870b2f11d57d6b7c2a1d6ea695d69209b93938a546b5ac44f785064b21cdaf2ca6ead5a232b5e36d6d0035f90a4fa9e2f668af0b53aa1c34f8d
7
+ data.tar.gz: 0b1855b8e5804b98dd8bf4936a218a69bfb415073e38b78f25102744b979674f9afda9baec9570c4dbf67deeee46e226be78073ab9a51105f9e989e9a2f8a522
data/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 1.0.5 (2026-07-06)
4
+
5
+ - Improve `OPDOTENV_DEBUG` field summary logging in Anyway Config integration to build messages only when Rails debug logging is active
6
+ - Skip field summary debug output when a 1Password item has no fields
7
+
8
+ ## 1.0.4 (2026-07-05)
9
+
10
+ - Move `railties` from runtime to development dependency in gemspec
11
+ - Non-Rails installs no longer pull in the Rails gem tree; Rails apps already provide `railties`
12
+
13
+ ## 1.0.3 (2025-11-07)
14
+
15
+ - Fix exit code handling in OpClient by using Open3.capture2e instead of IO.popen for reliable process status
16
+ - Improve load_all_fields to filter out empty keys and only include fields from 1Password items
17
+ - Strip whitespace from field labels and treat empty labels (after stripping) as nil
18
+ - Filter out fields with empty or whitespace-only values
19
+
3
20
  ## 1.0.2 (2025-11-05)
4
21
 
5
22
  - Enhance error handling and security measures across the codebase
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # opdotenv
2
2
 
3
- [![Gem Version](https://badge.fury.io/rb/opdotenv.svg?v=1.0.2)](https://badge.fury.io/rb/opdotenv) [![Test Status](https://github.com/amkisko/opdotenv.rb/actions/workflows/ci.yml/badge.svg)](https://github.com/amkisko/opdotenv.rb/actions/workflows/ci.yml) [![codecov](https://codecov.io/gh/amkisko/opdotenv.rb/graph/badge.svg?token=U4FMVZGO8R)](https://codecov.io/gh/amkisko/opdotenv.rb)
3
+ [![Gem Version](https://badge.fury.io/rb/opdotenv.svg?v=1.0.3)](https://badge.fury.io/rb/opdotenv) [![Test Status](https://github.com/amkisko/opdotenv.rb/actions/workflows/test.yml/badge.svg)](https://github.com/amkisko/opdotenv.rb/actions/workflows/test.yml) [![codecov](https://codecov.io/gh/amkisko/opdotenv.rb/graph/badge.svg?token=U4FMVZGO8R)](https://codecov.io/gh/amkisko/opdotenv.rb) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=amkisko_opdotenv.rb&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=amkisko_opdotenv.rb)
4
4
 
5
5
  Load environment variables from 1Password using the `op` CLI or 1Password Connect Server API. Supports dotenv, JSON, and YAML formats.
6
6
 
@@ -350,6 +350,24 @@ bundle exec rbs validate
350
350
  bundle exec standardrb --fix
351
351
  ```
352
352
 
353
+ ## Contributing
354
+
355
+ Bug reports and pull requests are welcome on GitHub at https://github.com/amkisko/opdotenv.rb.
356
+
357
+ Contribution policy:
358
+ - New features are not necessarily added to the gem
359
+ - Pull request should have test coverage for affected parts
360
+ - Pull request should have changelog entry
361
+
362
+ Review policy:
363
+ - It might take up to 2 calendar weeks to review and merge critical fixes
364
+ - It might take up to 6 calendar months to review and merge pull request
365
+ - It might take up to 1 calendar year to review an issue
366
+
367
+ ## Security
368
+
369
+ If you discover a security vulnerability, please report it responsibly. See [SECURITY.md](SECURITY.md) for details.
370
+
353
371
  ## License
354
372
 
355
- MIT
373
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/bin/opdotenv CHANGED
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
2
 
4
3
  $LOAD_PATH.unshift(File.expand_path("../lib", __dir__))
5
4
  require "opdotenv"
@@ -79,26 +79,38 @@ module Opdotenv
79
79
  def log_available_fields(original_data, env_prefix, matched_data)
80
80
  return unless ENV["OPDOTENV_DEBUG"] == "true"
81
81
  return unless defined?(Rails) && Rails.logger
82
+ return if original_data.keys.empty?
82
83
 
83
84
  prefix_upper = env_prefix.upcase
84
85
  prefix_with_underscore = "#{prefix_upper}_"
85
-
86
86
  available_fields = original_data.keys.map(&:to_s)
87
87
  matched_fields = matched_data.keys.map(&:to_s)
88
+ unmatched = unmatched_fields(available_fields, prefix_upper, prefix_with_underscore)
89
+
90
+ log_field_summary(available_fields, matched_fields, env_prefix, prefix_with_underscore)
91
+ log_unmatched_fields(unmatched, prefix_with_underscore) if unmatched.any?
92
+ end
88
93
 
89
- # Find fields that were available but didn't match the prefix (case-insensitive)
90
- unmatched = available_fields.reject do |field|
94
+ def unmatched_fields(available_fields, prefix_upper, prefix_with_underscore)
95
+ available_fields.reject do |field|
91
96
  field_upper = field.to_s.upcase
92
97
  field_upper.start_with?(prefix_with_underscore) || field_upper == prefix_upper
93
98
  end
99
+ end
94
100
 
95
- if available_fields.any?
96
- Rails.logger.debug("[opdotenv] Available fields from 1Password: #{available_fields.join(", ")}")
97
- Rails.logger.debug("[opdotenv] Matched fields for #{env_prefix} (prefixed with #{prefix_with_underscore}, case-insensitive): #{matched_fields.join(", ")}")
98
- if unmatched.any?
99
- Rails.logger.debug("[opdotenv] Unmatched fields (must be prefixed with #{prefix_with_underscore}, case-insensitive): #{unmatched.join(", ")}")
100
- Rails.logger.debug("[opdotenv] To use these fields, rename them in 1Password to include the #{prefix_with_underscore} prefix")
101
- end
101
+ def log_field_summary(available_fields, matched_fields, env_prefix, prefix_with_underscore)
102
+ Rails.logger.debug { "[opdotenv] Available fields from 1Password: #{available_fields.join(", ")}" }
103
+ Rails.logger.debug do
104
+ "[opdotenv] Matched fields for #{env_prefix} (prefixed with #{prefix_with_underscore}, case-insensitive): #{matched_fields.join(", ")}"
105
+ end
106
+ end
107
+
108
+ def log_unmatched_fields(unmatched, prefix_with_underscore)
109
+ Rails.logger.debug do
110
+ "[opdotenv] Unmatched fields (must be prefixed with #{prefix_with_underscore}, case-insensitive): #{unmatched.join(", ")}"
111
+ end
112
+ Rails.logger.debug do
113
+ "[opdotenv] To use these fields, rename them in 1Password to include the #{prefix_with_underscore} prefix"
102
114
  end
103
115
  end
104
116
  end
@@ -86,28 +86,7 @@ module Opdotenv
86
86
  existing = item_by_title_in_vault(vault_id, item)
87
87
 
88
88
  if existing
89
- # Update using PATCH
90
- fields_array = fields.map do |k, v|
91
- existing_field = existing["fields"]&.find { |f| f["label"] == k.to_s }
92
- if existing_field
93
- {
94
- "op" => "replace",
95
- "path" => "/fields/#{existing_field["id"]}/value",
96
- "value" => v.to_s
97
- }
98
- else
99
- {
100
- "op" => "add",
101
- "path" => "/fields",
102
- "value" => {
103
- "type" => "CONCEALED",
104
- "label" => k.to_s,
105
- "value" => v.to_s
106
- }
107
- }
108
- end
109
- end
110
-
89
+ fields_array = build_patch_fields(existing, fields)
111
90
  api_request(:patch, "/v1/vaults/#{vault_id}/items/#{existing["id"]}", fields_array)
112
91
  else
113
92
  # Create new item
@@ -132,6 +111,29 @@ module Opdotenv
132
111
 
133
112
  private
134
113
 
114
+ def build_patch_fields(existing, fields)
115
+ fields.map do |key, value|
116
+ existing_field = existing["fields"]&.find { |field| field["label"] == key.to_s }
117
+ if existing_field
118
+ {
119
+ "op" => "replace",
120
+ "path" => "/fields/#{existing_field["id"]}/value",
121
+ "value" => value.to_s
122
+ }
123
+ else
124
+ {
125
+ "op" => "add",
126
+ "path" => "/fields",
127
+ "value" => {
128
+ "type" => "CONCEALED",
129
+ "label" => key.to_s,
130
+ "value" => value.to_s
131
+ }
132
+ }
133
+ end
134
+ end
135
+ end
136
+
135
137
  def parse_path(path)
136
138
  # op://Vault/Item or connect://Vault/Item
137
139
  match = path.match(/\A(?:op|connect):\/\/([^\/]+)\/([^\/]+)(?:\/(.+))?\z/)
@@ -26,13 +26,26 @@ module Opdotenv
26
26
  item_hash = parse_json_safe(raw_json)
27
27
 
28
28
  item_hash["fields"]&.each_with_object({}) do |field, env_data|
29
- label = field["label"] || field["id"]
30
- next unless label
31
- next if field["purpose"] == NOTES_PURPOSE # skip notesPlain when fetching all
32
- env_data[label.to_s] = (field["value"] || "").to_s
29
+ entry = field_env_entry(field)
30
+ next unless entry
31
+
32
+ env_data[entry[:key]] = entry[:value]
33
33
  end || {}
34
34
  end
35
35
 
36
+ def self.field_env_entry(field)
37
+ return nil unless field.is_a?(Hash)
38
+
39
+ label = (field["label"] || field["id"])&.strip
40
+ return nil if label.nil? || label.empty?
41
+ return nil if field["purpose"] == NOTES_PURPOSE
42
+
43
+ value = field["value"]
44
+ return nil if value.nil? || (value.is_a?(String) && value.strip.empty?)
45
+
46
+ {key: label.to_s, value: value.to_s}
47
+ end
48
+
36
49
  def self.build_field_path(path, field_name)
37
50
  # op CLI requires vault/item/field format
38
51
  # Avoid duplication if field name already in path
@@ -1,4 +1,5 @@
1
1
  require "json"
2
+ require "open3"
2
3
 
3
4
  module Opdotenv
4
5
  class OpClient
@@ -71,11 +72,8 @@ module Opdotenv
71
72
 
72
73
  def capture(args)
73
74
  # Use exec-style array to prevent shell injection
74
- # IO.popen with array arguments avoids shell interpretation
75
- out = IO.popen(args, err: [:child, :out]) do |io|
76
- io.read
77
- end
78
- status = $CHILD_STATUS
75
+ # Open3.capture2e captures both stdout and stderr, and properly returns exit status
76
+ out, status = Open3.capture2e(*args)
79
77
 
80
78
  # For JSON output, try to parse even if exit code is non-zero
81
79
  # Some op commands may return non-zero but still output valid JSON
@@ -88,10 +86,10 @@ module Opdotenv
88
86
  end
89
87
  end
90
88
 
91
- if status.nil? || !status.success?
89
+ unless status.success?
92
90
  # Never leak command output in error messages for security
93
91
  # Extract safe error information without exposing secrets
94
- exit_code = status&.exitstatus || "unknown"
92
+ exit_code = status.exitstatus
95
93
  command_name = args.first || "op"
96
94
  raise OpError, "Command failed: #{command_name} (exit code: #{exit_code})"
97
95
  end
@@ -2,26 +2,33 @@ module Opdotenv
2
2
  module Parsers
3
3
  class DotenvParser
4
4
  def self.parse(text)
5
- env = {}
6
- text.to_s.each_line do |line|
7
- line = line.strip
8
- next if line.empty? || line.start_with?("#")
9
- # Support KEY=VALUE and KEY="VALUE"; ignore export prefix
10
- line = line.sub(/^export\s+/, "")
11
- if (m = line.match(/^([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)\z/))
12
- key = m[1]
13
- raw = m[2]
14
- value = if raw.start_with?("\"") && raw.end_with?("\"")
15
- raw[1..-2].gsub('\\"', '"')
16
- elsif raw.start_with?("'") && raw.end_with?("'")
17
- raw[1..-2]
18
- else
19
- raw
20
- end
21
- env[key] = value
22
- end
5
+ text.to_s.each_line.with_object({}) do |line, env|
6
+ entry = parse_line(line)
7
+ next unless entry
8
+
9
+ env[entry[:key]] = entry[:value]
10
+ end
11
+ end
12
+
13
+ def self.parse_line(line)
14
+ line = line.strip
15
+ return nil if line.empty? || line.start_with?("#")
16
+
17
+ line = line.sub(/^export\s+/, "")
18
+ match = line.match(/^([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)\z/)
19
+ return nil unless match
20
+
21
+ {key: match[1], value: unquote_value(match[2])}
22
+ end
23
+
24
+ def self.unquote_value(raw)
25
+ if raw.start_with?("\"") && raw.end_with?("\"")
26
+ raw[1..-2].gsub('\\"', '"')
27
+ elsif raw.start_with?("'") && raw.end_with?("'")
28
+ raw[1..-2]
29
+ else
30
+ raw
23
31
  end
24
- env
25
32
  end
26
33
  end
27
34
  end
@@ -19,18 +19,17 @@ module Opdotenv
19
19
 
20
20
  path = source.to_s
21
21
  _, item = parse_op_path(path)
22
-
23
- # Extract item name and potential field name
24
- # Handle paths like "op://Vault/Item" or "op://Vault/Item Name/field"
25
22
  item_parts = item.split("/")
26
23
  item_name = item_parts.first
27
24
  field_name = (item_parts.length > 1) ? item_parts[1] : nil
28
25
 
29
- # First check if field name is provided with extension in the path
26
+ build_parsed_source(path, item_name, field_name)
27
+ end
28
+
29
+ def build_parsed_source(path, item_name, field_name)
30
30
  if field_name
31
31
  field_type = FormatInferrer.infer_from_name(field_name)
32
32
  {path: path, field_name: field_name, field_type: field_type}
33
- # If no field name in path, infer from item name patterns
34
33
  elsif (field_type = FormatInferrer.infer_from_name(item_name))
35
34
  {path: path, field_name: NOTES_PLAIN_FIELD, field_type: field_type}
36
35
  else
@@ -66,6 +65,6 @@ module Opdotenv
66
65
  }
67
66
  end
68
67
 
69
- module_function :normalize_hash
68
+ module_function :normalize_hash, :build_parsed_source
70
69
  end
71
70
  end
@@ -1,3 +1,3 @@
1
1
  module Opdotenv
2
- VERSION = "1.0.2"
2
+ VERSION = "1.0.5"
3
3
  end
metadata CHANGED
@@ -1,10 +1,10 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opdotenv
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.0.5
5
5
  platform: ruby
6
6
  authors:
7
- - amkisko
7
+ - Andrei Makarov
8
8
  bindir: bin
9
9
  cert_chain: []
10
10
  date: 1980-01-02 00:00:00.000000000 Z
@@ -19,7 +19,7 @@ dependencies:
19
19
  - - "<"
20
20
  - !ruby/object:Gem::Version
21
21
  version: '9.0'
22
- type: :runtime
22
+ type: :development
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
@@ -35,42 +35,56 @@ dependencies:
35
35
  requirements:
36
36
  - - "~>"
37
37
  - !ruby/object:Gem::Version
38
- version: '13.0'
38
+ version: '13'
39
39
  type: :development
40
40
  prerelease: false
41
41
  version_requirements: !ruby/object:Gem::Requirement
42
42
  requirements:
43
43
  - - "~>"
44
44
  - !ruby/object:Gem::Version
45
- version: '13.0'
45
+ version: '13'
46
46
  - !ruby/object:Gem::Dependency
47
47
  name: rspec
48
48
  requirement: !ruby/object:Gem::Requirement
49
49
  requirements:
50
50
  - - "~>"
51
51
  - !ruby/object:Gem::Version
52
- version: '3.12'
52
+ version: '3'
53
+ type: :development
54
+ prerelease: false
55
+ version_requirements: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '3'
60
+ - !ruby/object:Gem::Dependency
61
+ name: polyrun
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: 1.5.0
53
67
  type: :development
54
68
  prerelease: false
55
69
  version_requirements: !ruby/object:Gem::Requirement
56
70
  requirements:
57
71
  - - "~>"
58
72
  - !ruby/object:Gem::Version
59
- version: '3.12'
73
+ version: 1.5.0
60
74
  - !ruby/object:Gem::Dependency
61
75
  name: simplecov
62
76
  requirement: !ruby/object:Gem::Requirement
63
77
  requirements:
64
78
  - - "~>"
65
79
  - !ruby/object:Gem::Version
66
- version: '0.21'
80
+ version: '0.22'
67
81
  type: :development
68
82
  prerelease: false
69
83
  version_requirements: !ruby/object:Gem::Requirement
70
84
  requirements:
71
85
  - - "~>"
72
86
  - !ruby/object:Gem::Version
73
- version: '0.21'
87
+ version: '0.22'
74
88
  - !ruby/object:Gem::Dependency
75
89
  name: rspec_junit_formatter
76
90
  requirement: !ruby/object:Gem::Requirement
@@ -101,6 +115,20 @@ dependencies:
101
115
  version: '3'
102
116
  - !ruby/object:Gem::Dependency
103
117
  name: standard
118
+ requirement: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - "~>"
121
+ - !ruby/object:Gem::Version
122
+ version: '1.52'
123
+ type: :development
124
+ prerelease: false
125
+ version_requirements: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - "~>"
128
+ - !ruby/object:Gem::Version
129
+ version: '1.52'
130
+ - !ruby/object:Gem::Dependency
131
+ name: standard-custom
104
132
  requirement: !ruby/object:Gem::Requirement
105
133
  requirements:
106
134
  - - "~>"
@@ -113,20 +141,104 @@ dependencies:
113
141
  - - "~>"
114
142
  - !ruby/object:Gem::Version
115
143
  version: '1.0'
144
+ - !ruby/object:Gem::Dependency
145
+ name: standard-performance
146
+ requirement: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - "~>"
149
+ - !ruby/object:Gem::Version
150
+ version: '1.8'
151
+ type: :development
152
+ prerelease: false
153
+ version_requirements: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - "~>"
156
+ - !ruby/object:Gem::Version
157
+ version: '1.8'
158
+ - !ruby/object:Gem::Dependency
159
+ name: standard-rails
160
+ requirement: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - "~>"
163
+ - !ruby/object:Gem::Version
164
+ version: '1.5'
165
+ type: :development
166
+ prerelease: false
167
+ version_requirements: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - "~>"
170
+ - !ruby/object:Gem::Version
171
+ version: '1.5'
172
+ - !ruby/object:Gem::Dependency
173
+ name: standard-rspec
174
+ requirement: !ruby/object:Gem::Requirement
175
+ requirements:
176
+ - - "~>"
177
+ - !ruby/object:Gem::Version
178
+ version: '0.3'
179
+ type: :development
180
+ prerelease: false
181
+ version_requirements: !ruby/object:Gem::Requirement
182
+ requirements:
183
+ - - "~>"
184
+ - !ruby/object:Gem::Version
185
+ version: '0.3'
186
+ - !ruby/object:Gem::Dependency
187
+ name: rubocop-rails
188
+ requirement: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - "~>"
191
+ - !ruby/object:Gem::Version
192
+ version: '2.33'
193
+ type: :development
194
+ prerelease: false
195
+ version_requirements: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - "~>"
198
+ - !ruby/object:Gem::Version
199
+ version: '2.33'
200
+ - !ruby/object:Gem::Dependency
201
+ name: rubocop-rspec
202
+ requirement: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - "~>"
205
+ - !ruby/object:Gem::Version
206
+ version: '3.8'
207
+ type: :development
208
+ prerelease: false
209
+ version_requirements: !ruby/object:Gem::Requirement
210
+ requirements:
211
+ - - "~>"
212
+ - !ruby/object:Gem::Version
213
+ version: '3.8'
214
+ - !ruby/object:Gem::Dependency
215
+ name: rubocop-thread_safety
216
+ requirement: !ruby/object:Gem::Requirement
217
+ requirements:
218
+ - - "~>"
219
+ - !ruby/object:Gem::Version
220
+ version: '0.7'
221
+ type: :development
222
+ prerelease: false
223
+ version_requirements: !ruby/object:Gem::Requirement
224
+ requirements:
225
+ - - "~>"
226
+ - !ruby/object:Gem::Version
227
+ version: '0.7'
116
228
  - !ruby/object:Gem::Dependency
117
229
  name: appraisal
118
230
  requirement: !ruby/object:Gem::Requirement
119
231
  requirements:
120
232
  - - "~>"
121
233
  - !ruby/object:Gem::Version
122
- version: '2.4'
234
+ version: '2'
123
235
  type: :development
124
236
  prerelease: false
125
237
  version_requirements: !ruby/object:Gem::Requirement
126
238
  requirements:
127
239
  - - "~>"
128
240
  - !ruby/object:Gem::Version
129
- version: '2.4'
241
+ version: '2'
130
242
  - !ruby/object:Gem::Dependency
131
243
  name: webmock
132
244
  requirement: !ruby/object:Gem::Requirement
@@ -147,28 +259,28 @@ dependencies:
147
259
  requirements:
148
260
  - - "~>"
149
261
  - !ruby/object:Gem::Version
150
- version: '0.14'
262
+ version: '0.15'
151
263
  type: :development
152
264
  prerelease: false
153
265
  version_requirements: !ruby/object:Gem::Requirement
154
266
  requirements:
155
267
  - - "~>"
156
268
  - !ruby/object:Gem::Version
157
- version: '0.14'
269
+ version: '0.15'
158
270
  - !ruby/object:Gem::Dependency
159
271
  name: rbs
160
272
  requirement: !ruby/object:Gem::Requirement
161
273
  requirements:
162
274
  - - "~>"
163
275
  - !ruby/object:Gem::Version
164
- version: '3.0'
276
+ version: '3'
165
277
  type: :development
166
278
  prerelease: false
167
279
  version_requirements: !ruby/object:Gem::Requirement
168
280
  requirements:
169
281
  - - "~>"
170
282
  - !ruby/object:Gem::Version
171
- version: '3.0'
283
+ version: '3'
172
284
  - !ruby/object:Gem::Dependency
173
285
  name: anyway_config
174
286
  requirement: !ruby/object:Gem::Requirement
@@ -211,13 +323,13 @@ files:
211
323
  - lib/opdotenv/railtie.rb
212
324
  - lib/opdotenv/source_parser.rb
213
325
  - lib/opdotenv/version.rb
214
- homepage: https://github.com/amkisko/opdotenv
326
+ homepage: https://github.com/amkisko/opdotenv.rb
215
327
  licenses:
216
328
  - MIT
217
329
  metadata:
218
- source_code_uri: https://github.com/amkisko/opdotenv
219
- changelog_uri: https://github.com/amkisko/opdotenv/blob/main/CHANGELOG.md
220
- bug_tracker_uri: https://github.com/amkisko/opdotenv/issues
330
+ source_code_uri: https://github.com/amkisko/opdotenv.rb
331
+ changelog_uri: https://github.com/amkisko/opdotenv.rb/blob/main/CHANGELOG.md
332
+ bug_tracker_uri: https://github.com/amkisko/opdotenv.rb/issues
221
333
  rdoc_options: []
222
334
  require_paths:
223
335
  - lib