env_parser 1.3.1 → 1.3.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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +2 -2
  3. data/.gitignore +3 -0
  4. data/.rubocop.yml +22 -35
  5. data/.ruby-version +1 -1
  6. data/Gemfile.lock +44 -42
  7. data/README.md +1 -1
  8. data/docs/EnvParser/AutoregisterFileNotFound.html +6 -6
  9. data/docs/EnvParser/Error.html +5 -6
  10. data/docs/EnvParser/TypeAlreadyDefinedError.html +5 -6
  11. data/docs/EnvParser/Types/BaseTypes.html +9 -7
  12. data/docs/EnvParser/Types/ChronologyTypes.html +7 -6
  13. data/docs/EnvParser/Types/InternetTypes.html +7 -6
  14. data/docs/EnvParser/Types.html +6 -6
  15. data/docs/EnvParser/UnknownTypeError.html +5 -6
  16. data/docs/EnvParser/UnparseableAutoregisterSpec.html +6 -6
  17. data/docs/EnvParser/ValueNotAllowedError.html +7 -6
  18. data/docs/EnvParser/ValueNotConvertibleError.html +5 -6
  19. data/docs/EnvParser.html +117 -126
  20. data/docs/_index.html +5 -7
  21. data/docs/file.README.html +241 -143
  22. data/docs/frames.html +1 -1
  23. data/docs/index.html +241 -143
  24. data/docs/method_list.html +1 -9
  25. data/docs/top-level-namespace.html +4 -82
  26. data/env_parser.gemspec +14 -14
  27. data/lib/env_parser/errors.rb +18 -18
  28. data/lib/env_parser/types/base_types.rb +69 -69
  29. data/lib/env_parser/types/chronology_types.rb +54 -54
  30. data/lib/env_parser/types/internet_types.rb +50 -50
  31. data/lib/env_parser/types.rb +2 -2
  32. data/lib/env_parser/version.rb +1 -1
  33. data/lib/env_parser.rb +205 -213
  34. data/spec/env_parser/types/base_types_spec.rb +98 -0
  35. data/spec/env_parser/types/chronology_types_spec.rb +49 -0
  36. data/spec/env_parser/types/internet_types_spec.rb +45 -0
  37. data/spec/env_parser_spec.rb +192 -0
  38. data/spec/spec_helper.rb +14 -0
  39. metadata +61 -47
  40. data/.travis.yml +0 -5
@@ -0,0 +1,45 @@
1
+ RSpec.describe EnvParser::Types::InternetTypes do
2
+ it 'can parse ipv4 addresses' do
3
+ expect(EnvParser.parse(nil, as: :ipv4_address)).to eq(nil)
4
+ expect(EnvParser.parse('', as: :ipv4_address)).to eq(nil)
5
+
6
+ expect(EnvParser.parse('localhost', as: :ipv4_address)).to eq('127.0.0.1')
7
+ expect(EnvParser.parse('192.168.000.001', as: :ipv4_address)).to eq('192.168.0.1')
8
+
9
+ expect { EnvParser.parse('not an ip address', as: :ipv4_address) }.to raise_error(EnvParser::ValueNotConvertibleError)
10
+ end
11
+
12
+ it 'can parse ipv6 addresses' do
13
+ expect(EnvParser.parse(nil, as: :ipv6_address)).to eq(nil)
14
+ expect(EnvParser.parse('', as: :ipv6_address)).to eq(nil)
15
+
16
+ expect(EnvParser.parse('::', as: :ipv6_address)).to eq('::')
17
+ expect(EnvParser.parse('::1', as: :ipv6_address)).to eq('::1')
18
+ expect(EnvParser.parse('abcd::abcd:abcd', as: :ipv6_address)).to eq('abcd::abcd:abcd')
19
+
20
+ expect { EnvParser.parse('not an ip address', as: :ipv6_address) }.to raise_error(EnvParser::ValueNotConvertibleError)
21
+ end
22
+
23
+ it 'can parse network ports' do
24
+ %i[network_port port].each do |type|
25
+ expect(EnvParser.parse(nil, as: type)).to eq(nil)
26
+ expect(EnvParser.parse('', as: type)).to eq(nil)
27
+
28
+ expect(EnvParser.parse('80', as: type)).to eq(80)
29
+ expect(EnvParser.parse('8080', as: type)).to eq(8080)
30
+
31
+ expect { EnvParser.parse('99999999', as: type) }.to raise_error(EnvParser::ValueNotAllowedError)
32
+ expect { EnvParser.parse('not a port number', as: type) }.to raise_error(EnvParser::ValueNotConvertibleError)
33
+ end
34
+ end
35
+
36
+ it 'can parse email addresses' do
37
+ expect(EnvParser.parse(nil, as: :email_address)).to eq(nil)
38
+ expect(EnvParser.parse('', as: :email_address)).to eq(nil)
39
+
40
+ expect(EnvParser.parse('email@example.com', as: :email_address)).to eq('email@example.com')
41
+ expect(EnvParser.parse('some.user@gmail.com', as: :email_address)).to eq('some.user@gmail.com')
42
+
43
+ expect { EnvParser.parse('not an email address', as: :email_address) }.to raise_error(EnvParser::ValueNotConvertibleError)
44
+ end
45
+ end
@@ -0,0 +1,192 @@
1
+ require 'tempfile'
2
+
3
+ module Sample; end
4
+
5
+ RSpec.describe EnvParser do
6
+ it 'has a version number' do
7
+ expect(EnvParser::VERSION).not_to be nil
8
+ end
9
+
10
+ describe 'EnvParser.define_type' do
11
+ it 'exists' do
12
+ expect(EnvParser).to respond_to(:define_type)
13
+ end
14
+
15
+ it 'can register new types' do
16
+ EnvParser.define_type(:thirty) { |_| 30 }
17
+ expect(EnvParser.parse('dummy value', as: :thirty)).to eq(30)
18
+ end
19
+ end
20
+
21
+ describe 'EnvParser.parse' do
22
+ it 'exists' do
23
+ expect(EnvParser).to respond_to(:parse)
24
+ end
25
+
26
+ it 'returns the requested default when necessary' do
27
+ expect(EnvParser.parse(nil, as: :integer, if_unset: 25)).to eq(25)
28
+ expect(EnvParser.parse('', as: :integer, if_unset: 25)).to eq(25)
29
+
30
+ expect(EnvParser.parse('99', as: :float, if_unset: 25.0)).to eq(99.0)
31
+ end
32
+
33
+ it 'only allows values from a limited set' do
34
+ expect(EnvParser.parse('25', as: :integer, from_set: [20, 25, 30])).to eq(25)
35
+ expect { EnvParser.parse('25', as: :integer, from_set: [1, 2, 3]) }.to raise_error(EnvParser::ValueNotAllowedError)
36
+
37
+ expect(EnvParser.parse(nil, as: :integer, if_unset: 9, from_set: [1, 2, 3])).to eq(9)
38
+ end
39
+
40
+ it 'only allows values that pass user-defined validation' do
41
+ expect(EnvParser.parse('abc', as: :string)).to eq('abc')
42
+ expect(EnvParser.parse('abc', as: :string) { |_| true }).to eq('abc')
43
+ expect { EnvParser.parse('abc', as: :string) { |_| false } }.to raise_error(EnvParser::ValueNotAllowedError)
44
+
45
+ expect(EnvParser.parse('abc', as: :string)).to eq('abc')
46
+ expect(EnvParser.parse('abc', as: :string, validated_by: ->(_) { true })).to eq('abc')
47
+ expect { EnvParser.parse('abc', as: :string, validated_by: ->(_) { false }) }.to raise_error(EnvParser::ValueNotAllowedError)
48
+ end
49
+ end
50
+
51
+ describe 'EnvParse.register' do
52
+ it 'exists' do
53
+ expect(EnvParser).to respond_to(:register)
54
+ end
55
+
56
+ it 'ceates global constants' do
57
+ source_hash = { ABC: '123' }
58
+ EnvParser.register(:ABC, from: source_hash, as: :integer)
59
+ expect(ABC).to eq(123)
60
+ end
61
+
62
+ it 'creates module constants' do
63
+ source_hash = { XYZ: '456' }
64
+ EnvParser.register(:XYZ, from: source_hash, as: :integer, within: Sample)
65
+ expect(Sample::XYZ).to eq(456)
66
+ end
67
+
68
+ it 'will accept a hash keyed by variable names' do
69
+ source_hash = { FIRST: 'first', SECOND: '99', THIRD: 'third' }
70
+ EnvParser.register(
71
+ FIRST: { from: source_hash, as: :string, if_unset: 'no first' },
72
+ SECOND: { from: source_hash, as: :integer, if_unset: 'no second' },
73
+ THIRD: { from: source_hash, as: :string, if_unset: 'no third' },
74
+ FOURTH: { from: source_hash, as: :boolean, if_unset: 'no fourth' }
75
+ )
76
+
77
+ expect(FIRST).to eq('first')
78
+ expect(SECOND).to eq(99)
79
+ expect(THIRD).to eq('third')
80
+ expect(FOURTH).to eq('no fourth')
81
+ end
82
+ end
83
+
84
+ describe 'EnvParser.add_env_bindings' do
85
+ before(:context) { EnvParser.add_env_bindings }
86
+
87
+ it 'exists' do
88
+ expect(EnvParser).to respond_to(:add_env_bindings)
89
+ end
90
+
91
+ describe 'ENV.parse' do
92
+ it 'now exists' do
93
+ expect(ENV).to respond_to(:parse)
94
+ end
95
+
96
+ it 'interprets input values as ENV keys' do
97
+ ENV['ABC'] = '123'
98
+ expect(ENV.parse('ABC', as: :integer)).to eq(123)
99
+ expect(ENV.parse(:ABC, as: :integer)).to eq(123)
100
+ end
101
+ end
102
+
103
+ describe 'ENV.register' do
104
+ it 'now exists' do
105
+ expect(ENV).to respond_to(:register)
106
+ end
107
+
108
+ it 'ceates global constants' do
109
+ ENV['ABCD'] = '1234'
110
+ ENV.register(:ABCD, as: :integer)
111
+ expect(ABCD).to eq(1234)
112
+ end
113
+
114
+ it 'creates module constants' do
115
+ ENV['WXYZ'] = '5678'
116
+ ENV.register(:WXYZ, as: :integer, within: Sample)
117
+ expect(Sample::WXYZ).to eq(5678)
118
+ end
119
+
120
+ it 'will accept a hash keyed by variable names' do
121
+ ENV['FIFTH'] = 'fifth'
122
+ ENV['SIXTH'] = '99'
123
+ ENV['SEVENTH'] = 'seventh'
124
+
125
+ ENV.register(
126
+ FIFTH: { as: :string, if_unset: 'no fifth' },
127
+ SIXTH: { as: :integer, if_unset: 'no sixth' },
128
+ SEVENTH: { as: :string, if_unset: 'no seventh' },
129
+ EIGHTH: { as: :boolean, if_unset: 'no eighth' }
130
+ )
131
+
132
+ expect(FIFTH).to eq('fifth')
133
+ expect(SIXTH).to eq(99)
134
+ expect(SEVENTH).to eq('seventh')
135
+ expect(EIGHTH).to eq('no eighth')
136
+ end
137
+ end
138
+ end
139
+
140
+ describe 'EnvParser.autoregister' do
141
+ it 'exists' do
142
+ expect(EnvParser).to respond_to(:autoregister)
143
+ end
144
+
145
+ it 'can autoregister constants' do
146
+ filename = Tempfile.open('EnvParser.autoregister.') do |file|
147
+ file.write <<~YAML.chomp
148
+ SOME_INT:
149
+ as: :integer
150
+ if_unset: 25
151
+
152
+ SOME_STRING:
153
+ as: :string
154
+ if_unset: "unexpected"
155
+
156
+ CLASS_CONSTANT:
157
+ as: :string
158
+ within: String
159
+ YAML
160
+
161
+ file.path
162
+ end
163
+
164
+ ENV['SOME_INT'] = '99'
165
+ ENV['SOME_STRING'] = 'twelve'
166
+ ENV['CLASS_CONSTANT'] = 'tricky'
167
+ EnvParser.autoregister filename
168
+
169
+ expect(SOME_INT).to eq(99)
170
+ expect(SOME_STRING).to eq('twelve')
171
+ expect(String::CLASS_CONSTANT).to eq('tricky')
172
+ end
173
+
174
+ it 'properly handles file-not-found' do
175
+ expect { EnvParser.autoregister 'nonexistent filename' }.to raise_error(EnvParser::AutoregisterFileNotFound)
176
+ end
177
+
178
+ it 'properly handles unparseable YAML' do
179
+ filename = Tempfile.open('EnvParser.autoregister.') do |file|
180
+ file.write <<~MALFORMED_YAML.chomp
181
+ SOME_INT:
182
+ as:
183
+ hello
184
+ MALFORMED_YAML
185
+
186
+ file.path
187
+ end
188
+
189
+ expect { EnvParser.autoregister filename }.to raise_error(EnvParser::UnparseableAutoregisterSpec)
190
+ end
191
+ end
192
+ end
@@ -0,0 +1,14 @@
1
+ require 'bundler/setup'
2
+ require 'env_parser'
3
+
4
+ RSpec.configure do |config|
5
+ # Enable flags like --only-failures and --next-failure
6
+ config.example_status_persistence_file_path = '.rspec_status'
7
+
8
+ # Disable RSpec exposing methods globally on `Module` and `main`
9
+ config.disable_monkey_patching!
10
+
11
+ config.expect_with :rspec do |c|
12
+ c.syntax = :expect
13
+ end
14
+ end
metadata CHANGED
@@ -1,37 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: env_parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 1.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nestor Custodio
8
- autorequire:
9
- bindir: exe
8
+ autorequire:
9
+ bindir: bin
10
10
  cert_chain: []
11
- date: 2021-01-02 00:00:00.000000000 Z
11
+ date: 2022-12-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: bundler
14
+ name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '2.0'
20
- type: :development
19
+ version: 6.1.0
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '7.1'
23
+ type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - "~>"
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 6.1.0
30
+ - - "<"
25
31
  - !ruby/object:Gem::Version
26
- version: '2.0'
32
+ version: '7.1'
27
33
  - !ruby/object:Gem::Dependency
28
- name: rake
34
+ name: chronic
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
37
  - - ">="
32
38
  - !ruby/object:Gem::Version
33
39
  version: '0'
34
- type: :development
40
+ type: :runtime
35
41
  prerelease: false
36
42
  version_requirements: !ruby/object:Gem::Requirement
37
43
  requirements:
@@ -39,21 +45,35 @@ dependencies:
39
45
  - !ruby/object:Gem::Version
40
46
  version: '0'
41
47
  - !ruby/object:Gem::Dependency
42
- name: rspec
48
+ name: chronic_duration
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: bundler
43
63
  requirement: !ruby/object:Gem::Requirement
44
64
  requirements:
45
65
  - - "~>"
46
66
  - !ruby/object:Gem::Version
47
- version: '3.0'
67
+ version: '2'
48
68
  type: :development
49
69
  prerelease: false
50
70
  version_requirements: !ruby/object:Gem::Requirement
51
71
  requirements:
52
72
  - - "~>"
53
73
  - !ruby/object:Gem::Version
54
- version: '3.0'
74
+ version: '2'
55
75
  - !ruby/object:Gem::Dependency
56
- name: rspec_junit_formatter
76
+ name: rake
57
77
  requirement: !ruby/object:Gem::Requirement
58
78
  requirements:
59
79
  - - ">="
@@ -67,21 +87,21 @@ dependencies:
67
87
  - !ruby/object:Gem::Version
68
88
  version: '0'
69
89
  - !ruby/object:Gem::Dependency
70
- name: rubocop
90
+ name: rspec
71
91
  requirement: !ruby/object:Gem::Requirement
72
92
  requirements:
73
- - - '='
93
+ - - "~>"
74
94
  - !ruby/object:Gem::Version
75
- version: '1.7'
95
+ version: '3'
76
96
  type: :development
77
97
  prerelease: false
78
98
  version_requirements: !ruby/object:Gem::Requirement
79
99
  requirements:
80
- - - '='
100
+ - - "~>"
81
101
  - !ruby/object:Gem::Version
82
- version: '1.7'
102
+ version: '3'
83
103
  - !ruby/object:Gem::Dependency
84
- name: yard
104
+ name: rspec_junit_formatter
85
105
  requirement: !ruby/object:Gem::Requirement
86
106
  requirements:
87
107
  - - ">="
@@ -95,27 +115,13 @@ dependencies:
95
115
  - !ruby/object:Gem::Version
96
116
  version: '0'
97
117
  - !ruby/object:Gem::Dependency
98
- name: activesupport
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: 5.0.0
104
- type: :runtime
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: 5.0.0
111
- - !ruby/object:Gem::Dependency
112
- name: chronic
118
+ name: rubocop
113
119
  requirement: !ruby/object:Gem::Requirement
114
120
  requirements:
115
121
  - - ">="
116
122
  - !ruby/object:Gem::Version
117
123
  version: '0'
118
- type: :runtime
124
+ type: :development
119
125
  prerelease: false
120
126
  version_requirements: !ruby/object:Gem::Requirement
121
127
  requirements:
@@ -123,20 +129,20 @@ dependencies:
123
129
  - !ruby/object:Gem::Version
124
130
  version: '0'
125
131
  - !ruby/object:Gem::Dependency
126
- name: chronic_duration
132
+ name: yard
127
133
  requirement: !ruby/object:Gem::Requirement
128
134
  requirements:
129
135
  - - ">="
130
136
  - !ruby/object:Gem::Version
131
137
  version: '0'
132
- type: :runtime
138
+ type: :development
133
139
  prerelease: false
134
140
  version_requirements: !ruby/object:Gem::Requirement
135
141
  requirements:
136
142
  - - ">="
137
143
  - !ruby/object:Gem::Version
138
144
  version: '0'
139
- description:
145
+ description:
140
146
  email:
141
147
  - sakimorix@gmail.com
142
148
  executables: []
@@ -148,7 +154,6 @@ files:
148
154
  - ".rspec"
149
155
  - ".rubocop.yml"
150
156
  - ".ruby-version"
151
- - ".travis.yml"
152
157
  - ".yardopts"
153
158
  - Gemfile
154
159
  - Gemfile.lock
@@ -199,11 +204,17 @@ files:
199
204
  - lib/env_parser/types/chronology_types.rb
200
205
  - lib/env_parser/types/internet_types.rb
201
206
  - lib/env_parser/version.rb
207
+ - spec/env_parser/types/base_types_spec.rb
208
+ - spec/env_parser/types/chronology_types_spec.rb
209
+ - spec/env_parser/types/internet_types_spec.rb
210
+ - spec/env_parser_spec.rb
211
+ - spec/spec_helper.rb
202
212
  homepage: https://github.com/nestor-custodio/env_parser
203
213
  licenses:
204
214
  - MIT
205
- metadata: {}
206
- post_install_message:
215
+ metadata:
216
+ rubygems_mfa_required: 'true'
217
+ post_install_message:
207
218
  rdoc_options: []
208
219
  require_paths:
209
220
  - lib
@@ -211,15 +222,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
211
222
  requirements:
212
223
  - - ">="
213
224
  - !ruby/object:Gem::Version
214
- version: '0'
225
+ version: '3.0'
226
+ - - "<"
227
+ - !ruby/object:Gem::Version
228
+ version: '3.2'
215
229
  required_rubygems_version: !ruby/object:Gem::Requirement
216
230
  requirements:
217
231
  - - ">="
218
232
  - !ruby/object:Gem::Version
219
233
  version: '0'
220
234
  requirements: []
221
- rubygems_version: 3.1.4
222
- signing_key:
235
+ rubygems_version: 3.2.33
236
+ signing_key:
223
237
  specification_version: 4
224
238
  summary: A tool for painless parsing and validation of environment variables.
225
239
  test_files: []
data/.travis.yml DELETED
@@ -1,5 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- rvm:
4
- - 2.4.2
5
- before_install: gem install bundler -v 1.16.0