env_parser 1.3.1 → 1.3.2

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 (39) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +1 -1
  3. data/.rubocop.yml +22 -35
  4. data/.ruby-version +1 -1
  5. data/Gemfile.lock +44 -42
  6. data/README.md +1 -1
  7. data/docs/EnvParser/AutoregisterFileNotFound.html +6 -6
  8. data/docs/EnvParser/Error.html +5 -6
  9. data/docs/EnvParser/TypeAlreadyDefinedError.html +5 -6
  10. data/docs/EnvParser/Types/BaseTypes.html +9 -7
  11. data/docs/EnvParser/Types/ChronologyTypes.html +7 -6
  12. data/docs/EnvParser/Types/InternetTypes.html +7 -6
  13. data/docs/EnvParser/Types.html +6 -6
  14. data/docs/EnvParser/UnknownTypeError.html +5 -6
  15. data/docs/EnvParser/UnparseableAutoregisterSpec.html +6 -6
  16. data/docs/EnvParser/ValueNotAllowedError.html +7 -6
  17. data/docs/EnvParser/ValueNotConvertibleError.html +5 -6
  18. data/docs/EnvParser.html +117 -121
  19. data/docs/_index.html +5 -7
  20. data/docs/file.README.html +241 -143
  21. data/docs/frames.html +1 -1
  22. data/docs/index.html +241 -143
  23. data/docs/method_list.html +1 -9
  24. data/docs/top-level-namespace.html +4 -82
  25. data/env_parser.gemspec +14 -14
  26. data/lib/env_parser/errors.rb +18 -18
  27. data/lib/env_parser/types/base_types.rb +69 -69
  28. data/lib/env_parser/types/chronology_types.rb +54 -54
  29. data/lib/env_parser/types/internet_types.rb +50 -50
  30. data/lib/env_parser/types.rb +2 -2
  31. data/lib/env_parser/version.rb +1 -1
  32. data/lib/env_parser.rb +205 -213
  33. data/spec/env_parser/types/base_types_spec.rb +98 -0
  34. data/spec/env_parser/types/chronology_types_spec.rb +49 -0
  35. data/spec/env_parser/types/internet_types_spec.rb +45 -0
  36. data/spec/env_parser_spec.rb +192 -0
  37. data/spec/spec_helper.rb +14 -0
  38. metadata +53 -48
  39. 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,37 @@
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.2
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
+ type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '2.0'
26
+ version: 6.1.0
27
27
  - !ruby/object:Gem::Dependency
28
- name: rake
28
+ name: chronic
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
- type: :development
34
+ type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
@@ -39,21 +39,35 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: rspec
42
+ name: chronic_duration
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - "~>"
46
60
  - !ruby/object:Gem::Version
47
- version: '3.0'
61
+ version: '2'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
66
  - - "~>"
53
67
  - !ruby/object:Gem::Version
54
- version: '3.0'
68
+ version: '2'
55
69
  - !ruby/object:Gem::Dependency
56
- name: rspec_junit_formatter
70
+ name: rake
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
73
  - - ">="
@@ -67,21 +81,21 @@ dependencies:
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
- name: rubocop
84
+ name: rspec
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - '='
87
+ - - "~>"
74
88
  - !ruby/object:Gem::Version
75
- version: '1.7'
89
+ version: '3'
76
90
  type: :development
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
- - - '='
94
+ - - "~>"
81
95
  - !ruby/object:Gem::Version
82
- version: '1.7'
96
+ version: '3'
83
97
  - !ruby/object:Gem::Dependency
84
- name: yard
98
+ name: rspec_junit_formatter
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
101
  - - ">="
@@ -95,27 +109,13 @@ dependencies:
95
109
  - !ruby/object:Gem::Version
96
110
  version: '0'
97
111
  - !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
112
+ name: rubocop
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - ">="
116
116
  - !ruby/object:Gem::Version
117
117
  version: '0'
118
- type: :runtime
118
+ type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
@@ -123,20 +123,20 @@ dependencies:
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  - !ruby/object:Gem::Dependency
126
- name: chronic_duration
126
+ name: yard
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - ">="
130
130
  - !ruby/object:Gem::Version
131
131
  version: '0'
132
- type: :runtime
132
+ type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - ">="
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
- description:
139
+ description:
140
140
  email:
141
141
  - sakimorix@gmail.com
142
142
  executables: []
@@ -148,7 +148,6 @@ files:
148
148
  - ".rspec"
149
149
  - ".rubocop.yml"
150
150
  - ".ruby-version"
151
- - ".travis.yml"
152
151
  - ".yardopts"
153
152
  - Gemfile
154
153
  - Gemfile.lock
@@ -199,27 +198,33 @@ files:
199
198
  - lib/env_parser/types/chronology_types.rb
200
199
  - lib/env_parser/types/internet_types.rb
201
200
  - lib/env_parser/version.rb
201
+ - spec/env_parser/types/base_types_spec.rb
202
+ - spec/env_parser/types/chronology_types_spec.rb
203
+ - spec/env_parser/types/internet_types_spec.rb
204
+ - spec/env_parser_spec.rb
205
+ - spec/spec_helper.rb
202
206
  homepage: https://github.com/nestor-custodio/env_parser
203
207
  licenses:
204
208
  - MIT
205
- metadata: {}
206
- post_install_message:
209
+ metadata:
210
+ rubygems_mfa_required: 'true'
211
+ post_install_message:
207
212
  rdoc_options: []
208
213
  require_paths:
209
214
  - lib
210
215
  required_ruby_version: !ruby/object:Gem::Requirement
211
216
  requirements:
212
- - - ">="
217
+ - - "~>"
213
218
  - !ruby/object:Gem::Version
214
- version: '0'
219
+ version: '3.0'
215
220
  required_rubygems_version: !ruby/object:Gem::Requirement
216
221
  requirements:
217
222
  - - ">="
218
223
  - !ruby/object:Gem::Version
219
224
  version: '0'
220
225
  requirements: []
221
- rubygems_version: 3.1.4
222
- signing_key:
226
+ rubygems_version: 3.2.33
227
+ signing_key:
223
228
  specification_version: 4
224
229
  summary: A tool for painless parsing and validation of environment variables.
225
230
  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