env_parser 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f97bc0fe59df6a385baed458ea66fba04b2e79ac
4
- data.tar.gz: 76f851cd5748a48f37e6de45c5cbcd30c6830838
3
+ metadata.gz: c332d39f13b5bc1bb69de8ea62bf563201cf9424
4
+ data.tar.gz: 3f1318fa50244fedf66831472c70482acbfbe8a9
5
5
  SHA512:
6
- metadata.gz: 5730a3a7cc72e96ac94117b554262e59532c3c1f4486e3c1f526f5088ffe1ce5fb32289377ba54541669e428c9739cd64aafb33f1960e1d44de408832ed06e09
7
- data.tar.gz: 8bae60dfa56d806266331d755a96d8f98c095990671d84312564ac1af5e73935d5a5bda83257255061549ca24e9c840a9ab395281d641367bff8c1d4c617947b
6
+ metadata.gz: ded5ae799d4457095e940a2737e95fcc58177fbc574deadc02ddaaee5c52b32a8edfbaf3be2984aef994507f73a4abf4721ef32930e4178ef0fe0c9427ee9598
7
+ data.tar.gz: 8e2330caa387e8425e74453b73a0b7f45251ac60de85adba8f7fa39f58f2080fab9af51c900f30656b35dc937d77e5b68d8ca6f2086a42ba75a977b28f04aa16
@@ -1,78 +1,69 @@
1
1
  AllCops:
2
2
  TargetRubyVersion: 2.4
3
3
  Include:
4
+ - "**/*.rb"
4
5
  - "**/*.rake"
5
6
  - "**/Gemfile"
6
- - "**/Rakefile"
7
- - "**/Capfile"
8
- - "**/Berksfile"
9
- - "**/Cheffile"
10
7
  Exclude:
11
- - "vendor/**/*"
12
- - "db/**/*"
8
+ - ".git/**/*"
13
9
  - "tmp/**/*"
14
10
  - "true/**/*"
15
- Metrics/ClassLength:
16
- Description: Avoid classes longer than 100 lines of code.
11
+ - "vendor/**/*"
12
+
13
+
14
+ Layout/EmptyLineAfterGuardClause:
15
+ # Add empty line after guard clause.
17
16
  Enabled: false
18
- CountComments: false
19
- Max: 100
20
- Metrics/LineLength:
21
- Description: Limit lines to 100 characters.
17
+
18
+
19
+ Metrics/AbcSize:
20
+ # A calculated magnitude based on number of assignments, branches, and conditions.
22
21
  Enabled: false
23
- Max: 100
22
+
24
23
  Metrics/BlockLength:
24
+ # Avoid long blocks with many lines.
25
25
  Exclude:
26
26
  - 'spec/**/*.rb'
27
- Metrics/MethodLength:
28
- Description: Avoid methods longer than 10 lines of code.
29
- StyleGuide: https://github.com/bbatsov/ruby-style-guide#short-methods
30
- Enabled: false
31
- CountComments: false
32
- Max: 10
33
- Metrics/AbcSize:
34
- Description: A calculated magnitude based on number of assignments, branches, and conditions.
35
- Enabled: false
36
- Max: 15
27
+
37
28
  Metrics/CyclomaticComplexity:
38
- Description: A complexity metric that is strongly correlated to the number of test cases needed to validate a method.
39
- Enabled: false
40
- Max: 6
41
- Lint/Debugger:
42
- Description: Warn in debugger entries
43
- Enabled: false
44
- Lint/RescueWithoutErrorClass:
45
- Description: Avoid rescuing without specifying an error class.
46
- Enabled: false
47
- Style/SymbolArray:
48
- Description: Use %i or %I for arrays of symbols.
49
- Enabled: false
50
- Style/RegexpLiteral:
51
- Description: Enforces using / or %r around regular expressions.
52
- EnforcedStyle: percent_r
29
+ # A complexity metric that is strongly correlated to the number of test cases needed to validate a method.
30
+ Max: 10
31
+
32
+ Metrics/LineLength:
33
+ # Limit lines to 100 characters.
34
+ Max: 100
35
+ Exclude:
36
+ - 'spec/**/*.rb'
37
+
38
+ Metrics/MethodLength:
39
+ # Avoid methods longer than 25 lines of code.
40
+ Max: 25
41
+
42
+
53
43
  Style/AsciiComments:
54
- # Disabling this so we can use non-breaking spaces (' ') in documentation comments, preventing browsers from collapsing multiple spaces in code blocks.
55
- Description: This cop checks for non-ascii (non-English) characters in comments.
56
- Enabled: false
57
- Style/NumericLiterals:
58
- Description: This cop checks for big numeric literals without _ between groups of digits in them.
59
- Enabled: false
60
- Style/Documentation:
61
- Description: Document classes and non-namespace modules.
44
+ # This cop checks for non-ascii (non-English) characters in comments.
45
+ #
46
+ # NLC: Disabling this so we can use non-breaking spaces (' ') in documentation comments, preventing browsers from collapsing
47
+ # multiple spaces in code blocks.
62
48
  Enabled: false
49
+
50
+ Style/BlockDelimiters:
51
+ # Check for uses of braces or do/end around single line or multi-line blocks.
52
+ Exclude:
53
+ - 'spec/**/*.rb'
54
+
63
55
  Style/ClassAndModuleChildren:
64
- Description: Use nested modules/class definitions instead of compact style.
56
+ # Use nested modules/class definitions instead of compact style.
65
57
  Enabled: false
58
+
66
59
  Style/FrozenStringLiteralComment:
60
+ # Add the frozen_string_literal comment to the top of files to help transition to frozen string literals by default.
67
61
  Enabled: false
68
- Style/EmptyMethod:
62
+
63
+ Style/NumericLiterals:
64
+ # his cop checks for big numeric literals without _ between groups of digits in them.
69
65
  Enabled: false
70
- Style/StderrPuts:
71
- Enabled: true
72
- Exclude:
73
- - 'bin/**/*'
74
- Style/BlockDelimiters:
75
- Description: Check for uses of braces or do/end around single line or multi-line blocks.
76
- Enabled: true
77
- Exclude:
78
- - 'spec/**/*.rb'
66
+
67
+ Style/RegexpLiteral:
68
+ # Enforces using / or %r around regular expressions.
69
+ EnforcedStyle: percent_r
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- env_parser (1.2.0)
4
+ env_parser (1.3.0)
5
5
  activesupport (>= 5.0.0)
6
6
  chronic
7
7
  chronic_duration
@@ -14,6 +14,7 @@ GEM
14
14
  i18n (>= 0.7, < 2)
15
15
  minitest (~> 5.1)
16
16
  tzinfo (~> 1.1)
17
+ ast (2.4.0)
17
18
  chronic (0.10.2)
18
19
  chronic_duration (0.10.6)
19
20
  numerizer (~> 0.1.1)
@@ -21,8 +22,13 @@ GEM
21
22
  diff-lcs (1.3)
22
23
  i18n (1.7.0)
23
24
  concurrent-ruby (~> 1.0)
25
+ jaro_winkler (1.5.3)
24
26
  minitest (5.12.2)
25
27
  numerizer (0.1.1)
28
+ parallel (1.18.0)
29
+ parser (2.6.5.0)
30
+ ast (~> 2.4.0)
31
+ rainbow (3.0.0)
26
32
  rake (10.5.0)
27
33
  rspec (3.7.0)
28
34
  rspec-core (~> 3.7.0)
@@ -39,9 +45,19 @@ GEM
39
45
  rspec-support (3.7.0)
40
46
  rspec_junit_formatter (0.3.0)
41
47
  rspec-core (>= 2, < 4, != 2.12.0)
48
+ rubocop (0.75.1)
49
+ jaro_winkler (~> 1.5.1)
50
+ parallel (~> 1.10)
51
+ parser (>= 2.6)
52
+ rainbow (>= 2.2.2, < 4.0)
53
+ ruby-progressbar (~> 1.7)
54
+ unicode-display_width (>= 1.4.0, < 1.7)
55
+ ruby-progressbar (1.10.1)
42
56
  thread_safe (0.3.6)
43
57
  tzinfo (1.2.5)
44
58
  thread_safe (~> 0.1)
59
+ unicode-display_width (1.6.0)
60
+ yard (0.9.20)
45
61
 
46
62
  PLATFORMS
47
63
  ruby
@@ -52,6 +68,8 @@ DEPENDENCIES
52
68
  rake (~> 10.0)
53
69
  rspec (~> 3.0)
54
70
  rspec_junit_formatter
71
+ rubocop
72
+ yard
55
73
 
56
74
  BUNDLED WITH
57
75
  1.16.0
data/README.md CHANGED
@@ -1,227 +1,316 @@
1
- # EnvParser [![Gem Version](https://badge.fury.io/rb/env_parser.svg)](https://badge.fury.io/rb/env_parser)
1
+ [![Gem Version](https://img.shields.io/github/v/release/nestor-custodio/env_parser?color=green&label=gem%20version)](https://rubygems.org/gems/env_parser)
2
+ [![MIT License](https://img.shields.io/github/license/nestor-custodio/env_parser)](https://github.com/nestor-custodio/env_parser/blob/master/LICENSE.txt)
3
+
4
+
5
+ # EnvParser
2
6
 
3
7
  If your code uses environment variables, you know that `ENV` will always surface these as strings. Interpreting these strings as the value you *actually* want to see/use takes some work, however: for numbers you need to cast with `to_i` or `to_f` ... for booleans you need to check for a specific value (`ENV['SOME_VAR'] == 'true'`) ... maybe you want to set non-trivial defaults (something other than `0` or `''`)? ... maybe you only want to allow values from a limited set? ...
4
8
 
5
- Things can get out of control pretty fast, especially as the number of environment variables in play grows. Tools like [dotenv](https://github.com/bkeepers/dotenv) help to make sure you're loading the correct **set** of variables, but [EnvParser](https://github.com/nestor-custodio/env_parser) makes ***the values themselves*** usable with a minimum of effort.
9
+ Things can get out of control pretty fast, especially as the number of environment variables in play grows. Tools like [dotenv](https://github.com/bkeepers/dotenv) help to make sure you're loading the correct **set** of variables, but [EnvParser](https://github.com/nestor-custodio/env_parser) makes **the values themselves** usable with a minimum of effort.
10
+
11
+ [Full documentation is available here](http://nestor-custodio.github.io/env_parser/EnvParser.html), but do read below for a crash course on availble featues!
6
12
 
7
13
 
8
14
  ## Installation
9
15
 
10
- Add this line to your application's Gemfile:
16
+ - If your project uses [Bundler](https://github.com/bundler/bundler):
17
+ - Add one of the following to your application's Gemfile:
18
+ ```ruby
19
+ ## For on-demand usage ...
20
+ ##
21
+ gem 'env_parser'
11
22
 
12
- ```ruby
13
- gem 'env_parser'
14
- ```
23
+ ## To automatically register ENV
24
+ ## constants per ".env_parser.yml" ...
25
+ ##
26
+ gem 'env_parser', require: 'env_parser/autoregister'
27
+ ```
28
+ - And then run a:
29
+ ```shell
30
+ $ bundle install
31
+ ```
15
32
 
16
- And then execute:
33
+ - Or, you can keep things simple with a manual install:
34
+ ```shell
35
+ $ gem install env_parser
36
+ ```
17
37
 
18
- $ bundle
19
38
 
20
- Or install it yourself as:
39
+ ## Syntax Cheat Sheet
21
40
 
22
- $ gem install env_parser
41
+ ```ruby
42
+ ## Returns an ENV value parsed "as" a specific type:
43
+ ##
44
+ EnvParser.parse env_key_as_a_symbol
45
+ as: … ## ➜ required
46
+ if_unset: … ## ➜ optional; default value
47
+ from_set: … ## ➜ optional; an Array or Range
48
+ validated_by: ->(value) { … } ## ➜ optional; may also be given as a block
49
+
50
+ ## Parse an ENV value and register it as a constant:
51
+ ##
52
+ EnvParser.register env_key_as_a_symbol
53
+ as: … ## ➜ required
54
+ within: … ## ➜ optional; Class or Module
55
+ if_unset: … ## ➜ optional; default value
56
+ from_set: … ## ➜ optional; an Array or Range
57
+ validated_by: ->(value) { … } ## ➜ optional; may also be given as a block
58
+
59
+ ## Registers all ENV variables as spec'ed in ".env_parser.yml":
60
+ ##
61
+ EnvParser.autoregister ## Note this is automatically called if your
62
+ ## Gemfile included the "env_parser" gem with
63
+ ## the "require: 'env_parser/autoregister'" option.
64
+
65
+ ## Lets you call "parse" and "register" on ENV itself:
66
+ ##
67
+ EnvParser.add_env_bindings ## ENV.parse will now be a proxy for EnvParser.parse
68
+ ## and ENV.register will now be a proxy for EnvParser.register
69
+ ```
23
70
 
24
71
 
25
- ## Using EnvParser
72
+ ## Extended How-To-Use
26
73
 
27
- ### Basic Usage
74
+ #### Basic Usage
28
75
 
29
- #### Parsing ENV Values
76
+ - **Parsing `ENV` Values**
30
77
 
31
- ```ruby
32
- ## Returns ENV['TIMEOUT_MS'] as an Integer,
33
- ## or 0 if ENV['TIMEOUT_MS'] is unset or nil.
78
+ At its core, EnvParser is a straight-forward parser for string values (since that's all `ENV` ever gives you), allowing you to read a given string **_as_** a variety of types.
34
79
 
35
- timeout_ms = EnvParser.parse ENV['TIMEOUT_MS'], as: :integer
80
+ ```ruby
81
+ ## Returns ENV['TIMEOUT_MS'] as an Integer,
82
+ ## or a sensible default (0) if ENV['TIMEOUT_MS'] is unset.
83
+ ##
84
+ timeout_ms = EnvParser.parse ENV['TIMEOUT_MS'], as: :integer
85
+ ```
36
86
 
87
+ You can check the full documentation for [a list of all **_as_** types available right out of the box](http://nestor-custodio.github.io/env_parser/EnvParser/Types.html).
37
88
 
38
- ## LESS TYPING, PLZ! :(
39
- ## If you pass in a Symbol instead of a String, EnvParser
40
- ## will use the value behind the matching String key in ENV.
41
- ## (i.e. passing in ENV['X'] is equivalent to passing in :X)
89
+ - **How About Less Typing?**
42
90
 
43
- timeout_ms = EnvParser.parse :TIMEOUT_MS, as: :integer
44
- ```
91
+ EnvParser is all about ~~simplification~~ ~~less typing~~ *laziness*. If you pass in a symbol instead of a string, EnvParser will look to `ENV` and use the value from the corresponding (string) key.
45
92
 
46
- For a full list of all "as" types available out-of-the-box, [see the documentation for modules listed under EnvParserTypes](http://nestor-custodio.github.io/env_parser/EnvParserTypes.html).
93
+ ```ruby
94
+ ## YAY, LESS TYPING! 😃
95
+ ## These two are the same:
96
+ ##
97
+ more_typing = EnvParser.parse ENV['TIMEOUT_MS'], as: :integer
98
+ less_typing = EnvParser.parse :TIMEOUT_MS, as: :integer
99
+ ```
47
100
 
48
- ---
101
+ - **Registering Constants From `ENV` Values**
49
102
 
50
- #### Setting Non-Trivial Defaults
103
+ The `EnvParser.register` method lets you "promote" `ENV` variables into their own constants, already parsed into the correct type.
51
104
 
52
- ```ruby
53
- ## If the ENV variable you want is unset (nil) or blank (''),
54
- ## the return value is a sensible default for the given "as" type
55
- ## (0 or 0.0 for numbers, an empty tring, an empty Array or Hash, etc).
56
- ## Sometimes you want a non-trivial default, however.
105
+ ```ruby
106
+ ENV['API_KEY'] ## => 'unbreakable p4$$w0rd'
57
107
 
58
- EnvParser.parse :MISSING_ENV_VARIABLE, as: :integer ## => 0
59
- EnvParser.parse :MISSING_ENV_VARIABLE, as: :integer, if_unset: 250 ## => 250
108
+ EnvParser.register :API_KEY, as: :string
109
+ API_KEY ## => 'unbreakable p4$$w0rd'
110
+ ```
60
111
 
112
+ By default, `EnvParser.register` will create the requested constant within the Kernel module (making it available everywhere), but you can specify any class or module you like.
61
113
 
62
- ## Note that "if_unset" values are used as-is, with no type conversion.
114
+ ```ruby
115
+ ENV['BEST_VIDEO'] ## => 'https://youtu.be/L_jWHffIx5E'
63
116
 
64
- EnvParser.parse :MISSING_ENV_VARIABLE, as: :integer, if_unset: 'Careful!' ## => 'Careful!'
65
- ```
117
+ EnvParser.register :BEST_VIDEO, as: :string, within: URI
118
+ URI::BEST_VIDEO ## => 'https://youtu.be/L_jWHffIx5E'
119
+ BEST_VIDEO ## => raises NameError
120
+ ```
66
121
 
67
- ---
122
+ You can also register multiple constants with a single call, which is a bit cleaner.
68
123
 
69
- #### Setting Constants From ENV Values
124
+ ```ruby
125
+ EnvParser.register :USERNAME, as: :string
126
+ EnvParser.register :PASSWORD, as: :string
127
+ EnvParser.register :MOCK_API, as: :boolean, within: MyClassOrModule }
70
128
 
71
- ```ruby
72
- ## Global constants...
129
+ ## ... is equivalent to ... ##
73
130
 
74
- ENV['API_KEY'] ## => 'unbreakable p4$$w0rd'
131
+ EnvParser.register USERNAME: { as: :string },
132
+ PASSWORD: { as: :string },
133
+ MOCK_API: { as: :boolean, within: MyClassOrModule }
134
+ ```
75
135
 
76
- EnvParser.register :API_KEY, as: :string
77
- API_KEY ## => 'unbreakable p4$$w0rd' (registered within the Kernel module, so it's available everywhere)
136
+ - **Okay, But... How About Even Less Typing?**
78
137
 
138
+ Calling `EnvParser.add_env_bindings` binds proxy `parse` and `register` methods onto `ENV`. With these bindings in place, you can call `parse` or `register` on `ENV` itself, which is more legible and feels more straight-forward.
79
139
 
80
- ## ... and class/module-level constants!
140
+ ```ruby
141
+ ENV['SHORT_PI'] ## => '3.1415926'
142
+ ENV['BETTER_PI'] ## => '["flaky crust", "strawberry filling"]'
81
143
 
82
- ENV['ULTIMATE_LINK'] ## => 'https://youtu.be/L_jWHffIx5E'
144
+ ## Bind the proxy methods.
145
+ ##
146
+ EnvParser.add_env_bindings
83
147
 
84
- EnvParser.register :ULTIMATE_LINK, as: :string, within: URI
85
- URI::ULTIMATE_LINK ## => 'https://youtu.be/L_jWHffIx5E'
148
+ ENV.parse :SHORT_PI, as: :float ## => 3.1415926
149
+ ENV.register :BETTER_PI, as: :array ## Your constant is set!
150
+ ```
86
151
 
87
- ULTIMATE_LINK ## => raises NameError (the un-namespaced constant is only in scope within the URI module)
152
+ Note that the proxy `ENV.parse` method will (naturally) *always* interpret the value given as an `ENV` key (converting it to a string, if necessary), which is slightly different from the original `EnvParser.parse` method.
88
153
 
154
+ ```ruby
155
+ ENV['SHORT_PI'] ## => '3.1415926'
89
156
 
157
+ EnvParser.parse 'SHORT_PI', as: :float ## => 'SHORT_PI' as a float: 0.0
158
+ EnvParser.parse :SHORT_PI , as: :float ## => ENV['SHORT_PI'] as a float: 3.1415926
90
159
 
160
+ ## Bind the proxy methods.
161
+ ##
162
+ EnvParser.add_env_bindings
91
163
 
92
- ## You can also set multiple constants in one call, which is considerably cleaner to read:
164
+ ENV.parse 'SHORT_PI', as: :float ## => ENV['SHORT_PI'] as a float: 3.1415926
165
+ ENV.parse :SHORT_PI , as: :float ## => ENV['SHORT_PI'] as a float: 3.1415926
166
+ ```
93
167
 
94
- EnvParser.register :A, as: :string
95
- EnvParser.register :B, as: :integer, if_unset: 25
96
- EnvParser.register :C, as: :boolean, if_unset: true
168
+ Note also that the `ENV.parse` and `ENV.register` binding is done safely and without polluting the method space for other objects.
97
169
 
170
+ **All additional examples below will assume that `ENV` bindings are already in place, for brevity's sake.**
98
171
 
99
- ## ... is equivalent to ...
100
172
 
101
- EnvParser.register(
102
- A: { as: :string },
103
- B: { as: :integer, if_unset: 25 },
104
- C: { as: :boolean, if_unset: true }
105
- )
106
- ```
173
+ #### Ensuring Usable Values
107
174
 
108
- ---
175
+ - **Sensible Defaults**
109
176
 
110
- #### Binding EnvParser Proxies Onto ENV
177
+ If the `ENV` variable you want is unset (`nil`) or blank (`''`), the return value is a sensible default for the given **_as_** type: 0 or 0.0 for numbers, an empty string/array/hash, etc. Sometimes you want a non-trivial default, however. The **_if_unset_** option lets you specify a default that better meets your needs.
111
178
 
112
- ```ruby
113
- ## You can bind proxy "parse" and "register" methods onto ENV.
114
- ## This is done without polluting the method space for other objects.
179
+ ```ruby
180
+ ENV.parse :MISSING_VAR, as: :integer ## => 0
181
+ ENV.parse :MISSING_VAR, as: :integer, if_unset: 250 ## => 250
182
+ ```
115
183
 
116
- EnvParser.add_env_bindings ## Sets up the proxy methods.
184
+ Note these default values are used as-is with no type conversion, so exercise caution.
117
185
 
186
+ ```ruby
187
+ ENV.parse :MISSING_VAR, as: :integer, if_unset: 'Careful!' ## => 'Careful!' (NOT AN INTEGER)
188
+ ```
118
189
 
119
- ## Now you can call "parse" and "register" on ENV itself,
120
- ## which is more legible and feels more straight-forward.
190
+ - **Selecting From A Set**
121
191
 
122
- ENV['SHORT_PI'] ## => '3.1415926'
192
+ Sometimes setting the **_as_** type is a bit too open-ended. The **_from_set_** option lets you restrict the domain of allowed values.
123
193
 
124
- ENV.parse :SHORT_PI, as: :float ## => 3.1415926
125
- ENV.register :SHORT_PI, as: :float ## Your constant is set, my man!
194
+ ```ruby
195
+ ENV.parse :API_TO_USE, as: :symbol, from_set: %i[internal external]
196
+ ENV.parse :NETWORK_PORT, as: :integer, from_set: (1..65535), if_unset: 80
126
197
 
198
+ ## And if the value is not in the allowed set ...
199
+ ##
200
+ ENV.parse :TWELVE, as: :integer, from_set: (1..5) ## => raises EnvParser::ValueNotAllowedError
201
+ ```
127
202
 
128
- ## Note that ENV's proxy "parse" method will *always* interpret the
129
- ## value given as an ENV key (converting to a String, if necessary).
130
- ## This is different from the non-proxy "parse" method, which will use
131
- ## String values as-is and only looks up ENV values when given a Symbol.
132
- ```
203
+ - **Custom Validation Of Parsed Values**
133
204
 
205
+ You can write your own, more complex validations by passing in a **_validated_by_** lambda or an equivalent block. The lambda/block should take one value and return true if the given value passes the custom validation.
134
206
 
135
- ### Advanced Usage
207
+ ```ruby
208
+ ## Via a "validated_by" lambda ...
209
+ ##
210
+ ENV.parse :MUST_BE_LOWERCASE, as: :string, validated_by: ->(value) { value == value.downcase }
136
211
 
137
- #### Custom Validation Of Parsed Values
212
+ ## ... or with a block!
213
+ ##
214
+ ENV.parse(:MUST_BE_LOWERCASE, as: :string) { |value| value == value.downcase }
215
+ ENV.parse(:CONNECTION_RETRIES, as: :integer, &:positive?)
216
+ ```
138
217
 
139
- ```ruby
140
- ## Sometimes setting the type alone is a bit too open-ended.
141
- ## The "from_set" option lets you restrict the set of allowed values.
218
+ - **Defining Your Own EnvParser "*as*" Types**
142
219
 
143
- EnvParser.parse :API_TO_USE, as: :symbol, from_set: %i[internal external]
144
- EnvParser.parse :SOME_CUSTOM_NETWORK_PORT, as: :integer, from_set: (1..65535), if_unset: 80
220
+ If you use a particular validation many times or are often manipulating values in the same way after EnvParser has done its thing, you may want to register a new type altogether. Defining a new type makes your code both more maintainable (all the logic for your special type is only defined once) and more readable (your `parse` calls aren't littered with type-checking cruft).
145
221
 
222
+ Something as repetitive as:
146
223
 
147
- ## And if the value is not allowed...
224
+ ```ruby
225
+ a = ENV.parse :A, as: :int, if_unset: 6
226
+ raise unless passes_all_my_checks?(a)
148
227
 
149
- EnvParser.parse :NEGATIVE_NUMBER, as: :integer, from_set: (1..5) ## => raises EnvParser::ValueNotAllowedError
228
+ b = ENV.parse :B, as: :int, if_unset: 6
229
+ raise unless passes_all_my_checks?(b)
230
+ ```
150
231
 
232
+ ... is perhaps best handled by defining a new type:
151
233
 
234
+ ```ruby
235
+ EnvParser.define_type(:my_special_type_of_number, if_unset: 6) do |value|
236
+ value = value.to_i
237
+ unless passes_all_my_checks?(value)
238
+ raise(EnvParser::ValueNotConvertibleError, 'cannot parse as a "special type number"')
239
+ end
152
240
 
241
+ value
242
+ end
153
243
 
154
- ## The "validated_by" option allows for more complex validation.
244
+ a = ENV.parse :A, as: :my_special_type_of_number
245
+ b = ENV.parse :B, as: :my_special_type_of_number
246
+ ```
155
247
 
156
- EnvParser.parse :MUST_BE_LOWERCASE, as: :string, validated_by: ->(value) { value == value.downcase }
157
248
 
249
+ #### Auto-Registering Constants
158
250
 
159
- ## ... but a block will also do the trick!
251
+ - **The `autoregister` Call**
160
252
 
161
- EnvParser.parse(:MUST_BE_LOWERCASE, as: :string) { |value| value == value.downcase }
162
- EnvParser.parse(:CONNECTION_RETRIES, as: :integer, &:positive?)
163
- ```
253
+ Consolidating all of your `EnvParser.register` calls into a single place only makes sense. A single `EnvParser.autoregister` call take a filename to read and process as a series of constant registration requests. If no filename is given, the default `".env_parser.yml"` is assumed.
164
254
 
165
- ---
255
+ You'll normally want to call `EnvParser.autoregister` as early in your application as possible. For Rails applications (and other frameworks that call `require 'bundler/setup'`), requiring the EnvParser gem via ...
166
256
 
167
- #### Defining Your Own EnvParser "as" Types
257
+ ```ruby
258
+ gem 'env_parser', require: 'env_parser/autoregister'
259
+ ```
168
260
 
169
- ```ruby
170
- ## If you use a particular validation many times,
171
- ## or are often manipulating values in the same way
172
- ## after EnvParser has done its thing, you may want
173
- ## to register a new type altogether.
261
+ ... will automatically make the autoregistration call for you as soon as the gem is loaded (which should be early enough for most uses). If this is *still* not early enough for your needs, you can always `require 'env_parser/autoregister'` yourself even before `bundler/setup` is invoked.
174
262
 
175
- a = EnvParser.parse :A, as: :int, if_unset: nil
176
- raise unless passes_all_my_checks?(a)
263
+ - **The ".env_parser.yml" File**
177
264
 
178
- b = EnvParser.parse :B, as: :int, if_unset: nil
179
- raise unless passes_all_my_checks?(b)
265
+ If you recall, multiple constants can be registered via a single `EnvParser.register` call:
180
266
 
267
+ ```ruby
268
+ EnvParser.register :USERNAME, as: :string
269
+ EnvParser.register :PASSWORD, as: :string
270
+ EnvParser.register :MOCK_API, as: :boolean, within: MyClassOrModule }
181
271
 
182
- ## ... is perhaps best handled by defining a new type:
272
+ ## ... is equivalent to ... ##
183
273
 
184
- EnvParser.define_type(:my_special_type_of_number, if_unset: nil) do |value|
185
- value = value.to_i
186
- unless passes_all_my_checks?(value)
187
- raise(EnvParser::ValueNotConvertibleError, 'cannot parse as a "special type number"')
188
- end
274
+ EnvParser.register USERNAME: { as: :string },
275
+ PASSWORD: { as: :string },
276
+ MOCK_API: { as: :boolean, within: MyClassOrModule }
277
+ ```
189
278
 
190
- value
191
- end
279
+ The autoregistraton file is intended to read as a YAML version of what you'd pass to the single-call version of `EnvParser.register`: a single hash with keys for each of the constants you'd like to register, with each value being the set of options to parse that constant.
192
280
 
193
- a = EnvParser.parse :A, as: :my_special_type_of_number
194
- b = EnvParser.parse :B, as: :my_special_type_of_number
281
+ The equivalent autoregistration file for the above would be:
195
282
 
283
+ ```yaml
284
+ USERNAME:
285
+ as: :string
196
286
 
197
- ## Defining a new type makes your code both more maintainable
198
- ## (all the logic for your special type is only defined once)
199
- ## and more readable (your "parse" calls aren't littered with
200
- ## type-checking cruft).
201
- ```
287
+ PASSWORD:
288
+ as: :string
202
289
 
203
- ---
290
+ MOCK_API:
291
+ as: :boolean
292
+ within: MyClassOrModule
293
+ ```
204
294
 
205
- [Consult the repo docs for the full EnvParser documentation.](http://nestor-custodio.github.io/env_parser/EnvParser.html)
295
+ Because no Ruby *statements* can be safely represented via YAML, the set of `EnvParser.register` options available via autoregistration is limited to **_as_**, **_within_**, **_if_unset_**, and **_from_set_**. As an additional restriction, **_from_set_** (if given) must be an array, as ranges cannot be represented in YAML.
206
296
 
207
297
 
208
298
  ## Feature Roadmap / Future Development
209
299
 
210
- Additional features/options coming in the future:
300
+ Additional features coming in the future:
211
301
 
212
- - Allow for a ".env_parser" file where you can easily type-check and/or register (as constants) any ENV variables you like.
213
- - Continue to round out the "as" type selection as ideas come to mind, suggestions are made, and pull requests are submitted.
302
+ - Continue to round out the **_as_** type selection as ideas come to mind, suggestions are made, and pull requests are submitted.
214
303
 
215
304
 
216
305
  ## Contribution / Development
217
306
 
218
- Bug reports and pull requests are welcome on GitHub at https://github.com/nestor-custodio/env_parser.
307
+ Bug reports and pull requests are welcome at: [https://github.com/nestor-custodio/env_parser](https://github.com/nestor-custodio/env_parser)
219
308
 
220
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
309
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `bundle exec rspec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
221
310
 
222
- Linting is courtesy of [Rubocop](https://github.com/bbatsov/rubocop) and documentation is built using [Yard](https://yardoc.org/). Neither is included in the Gemspec; you'll need to install these locally to take advantage.
311
+ Linting is courtesy of [Rubocop](https://docs.rubocop.org/) (`bundle exec rubocop`) and documentation is built using [Yard](https://yardoc.org/) (`bundle exec yard`). Please ensure you have a clean bill of health from Rubocop and that any new features and/or changes to behaviour are reflected in the documentation before submitting a pull request.
223
312
 
224
313
 
225
314
  ## License
226
315
 
227
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
316
+ EnvParser is available as open source under the terms of the [MIT License](https://tldrlegal.com/license/mit-license).