env_parser 1.6.2 → 1.7.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 (56) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +6 -4
  3. data/Gemfile.lock +104 -30
  4. data/README.md +2 -2
  5. data/env_parser.gemspec +19 -12
  6. data/lib/env_parser/types/chronology_types.rb +1 -1
  7. data/lib/env_parser/types/internet_types.rb +3 -2
  8. data/lib/env_parser/version.rb +1 -1
  9. data/lib/env_parser.rb +18 -18
  10. metadata +5 -119
  11. data/.circleci/config.yml +0 -63
  12. data/.gitignore +0 -14
  13. data/.rspec +0 -3
  14. data/.rubocop.yml +0 -64
  15. data/.ruby-version +0 -1
  16. data/.yardopts +0 -1
  17. data/bin/console +0 -14
  18. data/bin/setup +0 -8
  19. data/docs/EnvParser/AutoregisterFileNotFound.html +0 -143
  20. data/docs/EnvParser/Error.html +0 -138
  21. data/docs/EnvParser/TypeAlreadyDefined.html +0 -143
  22. data/docs/EnvParser/TypeAlreadyDefinedError.html +0 -142
  23. data/docs/EnvParser/Types/BaseTypes.html +0 -179
  24. data/docs/EnvParser/Types/ChronologyTypes.html +0 -160
  25. data/docs/EnvParser/Types/InternetTypes.html +0 -172
  26. data/docs/EnvParser/Types.html +0 -128
  27. data/docs/EnvParser/UnknownTypeError.html +0 -142
  28. data/docs/EnvParser/UnparseableAutoregisterSpec.html +0 -143
  29. data/docs/EnvParser/ValueNotAllowed.html +0 -144
  30. data/docs/EnvParser/ValueNotAllowedError.html +0 -144
  31. data/docs/EnvParser/ValueNotConvertibleError.html +0 -142
  32. data/docs/EnvParser.html +0 -1240
  33. data/docs/EnvParserTypes/BaseTypes.html +0 -178
  34. data/docs/EnvParserTypes/ChronologyTypes.html +0 -159
  35. data/docs/EnvParserTypes/InternetTypes.html +0 -159
  36. data/docs/EnvParserTypes/TimeTypes.html +0 -158
  37. data/docs/EnvParserTypes.html +0 -129
  38. data/docs/_index.html +0 -243
  39. data/docs/class_list.html +0 -54
  40. data/docs/css/common.css +0 -1
  41. data/docs/css/full_list.css +0 -58
  42. data/docs/css/style.css +0 -503
  43. data/docs/file.README.html +0 -419
  44. data/docs/file_list.html +0 -59
  45. data/docs/frames.html +0 -22
  46. data/docs/index.html +0 -419
  47. data/docs/js/app.js +0 -344
  48. data/docs/js/full_list.js +0 -242
  49. data/docs/js/jquery.js +0 -4
  50. data/docs/method_list.html +0 -94
  51. data/docs/top-level-namespace.html +0 -110
  52. data/spec/env_parser/types/base_types_spec.rb +0 -98
  53. data/spec/env_parser/types/chronology_types_spec.rb +0 -49
  54. data/spec/env_parser/types/internet_types_spec.rb +0 -95
  55. data/spec/env_parser_spec.rb +0 -214
  56. data/spec/spec_helper.rb +0 -14
@@ -1,95 +0,0 @@
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
-
46
- it 'can parse version numbers' do
47
- %i[version semver].each do |type|
48
- expect(EnvParser.parse(nil, as: type)).to eq(nil)
49
- expect(EnvParser.parse('', as: type)).to eq(nil)
50
-
51
- # Our list of valid version strings is a subset of those in the official semver.org-provided regex suite.
52
- # rubocop:disable Layout
53
- #
54
- valid_version_strings = {
55
- '0.0.4' => { major: '0' , minor: '0', patch: '4', prerelease: nil , buildmetadata: nil },
56
- '1.2.3' => { major: '1' , minor: '2', patch: '3', prerelease: nil , buildmetadata: nil },
57
- '1.1.2-prerelease+meta' => { major: '1' , minor: '1', patch: '2', prerelease: 'prerelease' , buildmetadata: 'meta' },
58
- '1.1.2+meta' => { major: '1' , minor: '1', patch: '2', prerelease: nil , buildmetadata: 'meta' },
59
- '1.1.2+meta-valid' => { major: '1' , minor: '1', patch: '2', prerelease: nil , buildmetadata: 'meta-valid' },
60
- '1.0.0-alpha' => { major: '1' , minor: '0', patch: '0', prerelease: 'alpha' , buildmetadata: nil },
61
- '1.0.0-beta' => { major: '1' , minor: '0', patch: '0', prerelease: 'beta' , buildmetadata: nil },
62
- '1.0.0-alpha.beta' => { major: '1' , minor: '0', patch: '0', prerelease: 'alpha.beta' , buildmetadata: nil },
63
- '1.0.0-alpha.beta.1' => { major: '1' , minor: '0', patch: '0', prerelease: 'alpha.beta.1', buildmetadata: nil },
64
- '1.0.0-alpha.1' => { major: '1' , minor: '0', patch: '0', prerelease: 'alpha.1' , buildmetadata: nil },
65
- '1.0.0-alpha0.valid' => { major: '1' , minor: '0', patch: '0', prerelease: 'alpha0.valid', buildmetadata: nil },
66
- '1.0.0-alpha.0valid' => { major: '1' , minor: '0', patch: '0', prerelease: 'alpha.0valid', buildmetadata: nil },
67
- '1.0.0-rc.1+build.1' => { major: '1' , minor: '0', patch: '0', prerelease: 'rc.1' , buildmetadata: 'build.1' },
68
- '2.0.0-rc.1+build.123' => { major: '2' , minor: '0', patch: '0', prerelease: 'rc.1' , buildmetadata: 'build.123' },
69
- '1.2.3-beta' => { major: '1' , minor: '2', patch: '3', prerelease: 'beta' , buildmetadata: nil },
70
- '10.2.3-DEV-SNAPSHOT' => { major: '10', minor: '2', patch: '3', prerelease: 'DEV-SNAPSHOT', buildmetadata: nil },
71
- '1.2.3-SNAPSHOT-123' => { major: '1' , minor: '2', patch: '3', prerelease: 'SNAPSHOT-123', buildmetadata: nil },
72
- '2.0.0+build.1848' => { major: '2' , minor: '0', patch: '0', prerelease: nil , buildmetadata: 'build.1848' },
73
- '2.0.1-alpha.1227' => { major: '2' , minor: '0', patch: '1', prerelease: 'alpha.1227' , buildmetadata: nil },
74
- '1.0.0-alpha+beta' => { major: '1' , minor: '0', patch: '0', prerelease: 'alpha' , buildmetadata: 'beta' },
75
- '1.0.0-0A.is.legal' => { major: '1' , minor: '0', patch: '0', prerelease: '0A.is.legal' , buildmetadata: nil }
76
- }
77
- # rubocop:enable Layout
78
-
79
- valid_version_strings.each do |version, expected_matches|
80
- parsed_value = EnvParser.parse(version, as: type)
81
-
82
- expect(parsed_value).to_not eq(nil)
83
- expected_matches.each { |match_name, expected_value| expect(parsed_value[match_name]).to eq(expected_value) }
84
- end
85
-
86
- # Our list of invalid version strings is a subset of those in the official semver.org-provided regex suite.
87
- #
88
- invalid_version_strings = ['1', '1.2', '1.2.3-0123', '1.2.3-0123.0123', '1.1.2+.123', '+invalid', '-invalid', '-invalid+invalid',
89
- '-invalid.01', 'alpha', 'alpha.1', 'alpha+beta', '1.0.0-alpha..', '1.0.0-alpha..1', '01.1.1', '1.01.1',
90
- '1.1.01', '1.2.3.DEV', '1.2-SNAPSHOT', '+justmeta', '9.8.7+meta+meta', '9.8.7-whatever+meta+meta']
91
-
92
- invalid_version_strings.each { |version| expect { EnvParser.parse(version, as: type) }.to raise_error(EnvParser::ValueNotConvertibleError) }
93
- end
94
- end
95
- end
@@ -1,214 +0,0 @@
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 = { DEF: '456' }
64
- EnvParser.register(:DEF, from: source_hash, as: :integer, within: Sample)
65
- expect(Sample::DEF).to eq(456)
66
- end
67
-
68
- it 'creates named module constants' do
69
- source_hash = { GHI: '789' }
70
- EnvParser.register(:GHI, from: source_hash, as: :integer, named: :JKL, within: Sample)
71
- expect { Sample::GHI }.to raise_error(NameError)
72
- expect(Sample::JKL).to eq(789)
73
- end
74
-
75
- it 'will accept a hash keyed by variable names' do
76
- source_hash = { FIRST: 'first', SECOND: '99', THIRD: 'third' }
77
- EnvParser.register(
78
- FIRST: { from: source_hash, as: :string, if_unset: 'no first' },
79
- SECOND: { from: source_hash, as: :integer, if_unset: 'no second' },
80
- THIRD: { from: source_hash, as: :string, if_unset: 'no third' },
81
- FOURTH: { from: source_hash, as: :boolean, if_unset: 'no fourth' }
82
- )
83
-
84
- expect(FIRST).to eq('first')
85
- expect(SECOND).to eq(99)
86
- expect(THIRD).to eq('third')
87
- expect(FOURTH).to eq('no fourth')
88
- end
89
- end
90
-
91
- describe 'EnvParser.add_env_bindings' do
92
- before(:context) { EnvParser.add_env_bindings }
93
-
94
- it 'exists' do
95
- expect(EnvParser).to respond_to(:add_env_bindings)
96
- end
97
-
98
- describe 'ENV.parse' do
99
- it 'now exists' do
100
- expect(ENV).to respond_to(:parse)
101
- end
102
-
103
- it 'interprets input values as ENV keys' do
104
- ENV['ABC'] = '123'
105
- expect(ENV.parse('ABC', as: :integer)).to eq(123)
106
- expect(ENV.parse(:ABC, as: :integer)).to eq(123)
107
- end
108
- end
109
-
110
- describe 'ENV.register' do
111
- it 'now exists' do
112
- expect(ENV).to respond_to(:register)
113
- end
114
-
115
- it 'ceates global constants' do
116
- ENV['ABCD'] = '1234'
117
- ENV.register(:ABCD, as: :integer)
118
- expect(ABCD).to eq(1234)
119
- end
120
-
121
- it 'creates module constants' do
122
- ENV['WXYZ'] = '5678'
123
- ENV.register(:WXYZ, as: :integer, within: Sample)
124
- expect(Sample::WXYZ).to eq(5678)
125
- end
126
-
127
- it 'creates module constants' do
128
- ENV['ORIGINAL_NAME'] = '9999'
129
- ENV.register(:ORIGINAL_NAME, as: :integer, named: :DIFFERENT_NAME, within: Sample)
130
- expect { Sample::ORIGINAL_NAME }.to raise_error(NameError)
131
- expect(Sample::DIFFERENT_NAME).to eq(9999)
132
- end
133
-
134
- it 'will accept a hash keyed by variable names' do
135
- ENV['FIFTH'] = 'fifth'
136
- ENV['SIXTH'] = '99'
137
- ENV['SEVENTH'] = 'seventh'
138
-
139
- ENV.register(
140
- FIFTH: { as: :string, if_unset: 'no fifth' },
141
- SIXTH: { as: :integer, if_unset: 'no sixth' },
142
- SEVENTH: { as: :string, if_unset: 'no seventh' },
143
- EIGHTH: { as: :boolean, if_unset: 'no eighth' }
144
- )
145
-
146
- expect(FIFTH).to eq('fifth')
147
- expect(SIXTH).to eq(99)
148
- expect(SEVENTH).to eq('seventh')
149
- expect(EIGHTH).to eq('no eighth')
150
- end
151
- end
152
- end
153
-
154
- describe 'EnvParser.autoregister' do
155
- it 'exists' do
156
- expect(EnvParser).to respond_to(:autoregister)
157
- end
158
-
159
- it 'can autoregister constants' do
160
- filename = Tempfile.open('EnvParser.autoregister.') do |file|
161
- file.write <<~YAML.chomp
162
- SOME_INT:
163
- as: :integer
164
- if_unset: 25
165
-
166
- SOME_STRING:
167
- as: :string
168
- if_unset: "unexpected"
169
-
170
- CLASS_CONSTANT:
171
- as: :string
172
- within: String
173
-
174
- NAMED_CLASS_CONSTANT:
175
- as: :string
176
- named: :OTHER_CLASS_CONSTANT
177
- within: String
178
- YAML
179
-
180
- file.path
181
- end
182
-
183
- ENV['SOME_INT'] = '99'
184
- ENV['SOME_STRING'] = 'twelve'
185
- ENV['CLASS_CONSTANT'] = 'tricky'
186
- ENV['NAMED_CLASS_CONSTANT'] = 'quizzical'
187
- EnvParser.autoregister filename
188
-
189
- expect(SOME_INT).to eq(99)
190
- expect(SOME_STRING).to eq('twelve')
191
- expect(String::CLASS_CONSTANT).to eq('tricky')
192
- expect { String::NAMED_CLASS_CONSTANT }.to raise_error(NameError)
193
- expect(String::OTHER_CLASS_CONSTANT).to eq('quizzical')
194
- end
195
-
196
- it 'properly handles file-not-found' do
197
- expect { EnvParser.autoregister 'nonexistent filename' }.to raise_error(EnvParser::AutoregisterFileNotFound)
198
- end
199
-
200
- it 'properly handles unparseable YAML' do
201
- filename = Tempfile.open('EnvParser.autoregister.') do |file|
202
- file.write <<~MALFORMED_YAML.chomp
203
- SOME_INT:
204
- as:
205
- hello
206
- MALFORMED_YAML
207
-
208
- file.path
209
- end
210
-
211
- expect { EnvParser.autoregister filename }.to raise_error(EnvParser::UnparseableAutoregisterSpec)
212
- end
213
- end
214
- end
data/spec/spec_helper.rb DELETED
@@ -1,14 +0,0 @@
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