env_parser 1.2.0 → 1.3.0

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.
@@ -54,13 +54,21 @@
54
54
 
55
55
  <li class="even ">
56
56
  <div class="item">
57
- <span class='object_link'><a href="EnvParser.html#define_type-class_method" title="EnvParser.define_type (method)">define_type</a></span>
57
+ <span class='object_link'><a href="EnvParser.html#autoregister-class_method" title="EnvParser.autoregister (method)">autoregister</a></span>
58
58
  <small>EnvParser</small>
59
59
  </div>
60
60
  </li>
61
61
 
62
62
 
63
63
  <li class="odd ">
64
+ <div class="item">
65
+ <span class='object_link'><a href="EnvParser.html#define_type-class_method" title="EnvParser.define_type (method)">define_type</a></span>
66
+ <small>EnvParser</small>
67
+ </div>
68
+ </li>
69
+
70
+
71
+ <li class="even ">
64
72
  <div class="item">
65
73
  <span class='object_link'><a href="top-level-namespace.html#filename-instance_method" title="#filename (method)">#filename</a></span>
66
74
  <small>Top Level Namespace</small>
@@ -68,7 +76,7 @@
68
76
  </li>
69
77
 
70
78
 
71
- <li class="even ">
79
+ <li class="odd ">
72
80
  <div class="item">
73
81
  <span class='object_link'><a href="EnvParser.html#parse-class_method" title="EnvParser.parse (method)">parse</a></span>
74
82
  <small>EnvParser</small>
@@ -76,7 +84,7 @@
76
84
  </li>
77
85
 
78
86
 
79
- <li class="odd ">
87
+ <li class="even ">
80
88
  <div class="item">
81
89
  <span class='object_link'><a href="EnvParser.html#register-class_method" title="EnvParser.register (method)">register</a></span>
82
90
  <small>EnvParser</small>
@@ -178,7 +178,7 @@
178
178
  </div>
179
179
 
180
180
  <div id="footer">
181
- Generated on Mon Oct 21 00:33:12 2019 by
181
+ Generated on Sun Nov 3 21:30:37 2019 by
182
182
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
183
183
  0.9.20 (ruby-2.4.2).
184
184
  </div>
@@ -24,6 +24,8 @@ Gem::Specification.new do |spec|
24
24
  spec.add_development_dependency 'rake', '~> 10.0'
25
25
  spec.add_development_dependency 'rspec', '~> 3.0'
26
26
  spec.add_development_dependency 'rspec_junit_formatter'
27
+ spec.add_development_dependency 'rubocop'
28
+ spec.add_development_dependency 'yard'
27
29
 
28
30
  spec.add_dependency 'activesupport', '>= 5.0.0'
29
31
  spec.add_dependency 'chronic'
@@ -1,10 +1,15 @@
1
1
  require 'env_parser/errors'
2
2
  require 'env_parser/version'
3
3
  require 'active_support/all'
4
+ require 'psych'
4
5
 
5
6
  ## The EnvParser class simplifies parsing of environment variables as different data types.
6
7
  ##
7
8
  class EnvParser
9
+ ## The default filename to use for {.autoregister} requests.
10
+ ##
11
+ AUTOREGISTER_FILE = '.env_parser.yml'.freeze
12
+
8
13
  class << self
9
14
  ## Defines a new type for use as the "as" option on a subsequent {.parse} or {.register} call.
10
15
  ##
@@ -189,9 +194,7 @@ class EnvParser
189
194
  name = name.to_s
190
195
  end
191
196
 
192
- unless from.is_a? Hash
193
- raise ArgumentError, "invalid `from` parameter: #{from.class}"
194
- end
197
+ raise ArgumentError, "invalid `from` parameter: #{from.class}" unless from.is_a? Hash
195
198
 
196
199
  unless within.is_a?(Module) || within.is_a?(Class)
197
200
  raise ArgumentError, "invalid `within` parameter: #{within.inspect}"
@@ -227,6 +230,47 @@ class EnvParser
227
230
  ENV
228
231
  end
229
232
 
233
+ ## Reads an "autoregister" file and registers the ENV constants defined therein.
234
+ ##
235
+ ## The "autoregister" file is read, parsed as YAML, sanitized for use as a parameter to
236
+ ## {.register_all}, and then passed along for processing. The return value from that
237
+ ## {.register_all} call is passed through.
238
+ ##
239
+ ## @param filename [String]
240
+ ## A path for the autoregister file to parse and process. Defaults to
241
+ ## {EnvParser::AUTOREGISTER_FILE} if unset.
242
+ ##
243
+ ## @return [Hash]
244
+ ## The return value from the {.register_all} call that handles the actual registration.
245
+ ##
246
+ ## @raise [EnvParser::AutoregisterFileNotFound, EnvParser::UnparseableAutoregisterSpec]
247
+ ##
248
+ def autoregister(filename = nil)
249
+ filename ||= AUTOREGISTER_FILE
250
+ autoregister_spec = Psych.load_file(filename)
251
+
252
+ autoregister_spec.deep_symbolize_keys!
253
+ autoregister_spec.transform_values! do |spec|
254
+ sanitized = spec.slice(:as, :within, :if_unset, :from_set)
255
+ sanitized[:as] = sanitized[:as].to_sym if sanitized.key? :as
256
+ sanitized[:within] = sanitized[:within].constantize if sanitized.key? :within
257
+
258
+ sanitized
259
+ end
260
+
261
+ register_all autoregister_spec
262
+
263
+ ## Psych raises an Errno::ENOENT on file-not-found.
264
+ ##
265
+ rescue Errno::ENOENT
266
+ raise EnvParser::AutoregisterFileNotFound, %(file not found: "#{filename}")
267
+
268
+ ## Psych raises a Psych::SyntaxError on unparseable YAML.
269
+ ##
270
+ rescue Psych::SyntaxError => e
271
+ raise EnvParser::UnparseableAutoregisterSpec, "malformed YAML in spec file: #{e.message}"
272
+ end
273
+
230
274
  private
231
275
 
232
276
  ## Class instance variable for storing known type data.
@@ -0,0 +1,3 @@
1
+ require 'env_parser'
2
+
3
+ EnvParser.autoregister
@@ -25,4 +25,16 @@ class EnvParser
25
25
  ##
26
26
  class ValueNotAllowedError < Error
27
27
  end
28
+
29
+ ## Error class used to indicate a missing auto-registration spec file (used by the "autoregister"
30
+ ## feature).
31
+ ##
32
+ class AutoregisterFileNotFound < Error
33
+ end
34
+
35
+ ## Error class used to indicate an unparseable auto-registration spec (used by the "autoregister"
36
+ ## feature).
37
+ ##
38
+ class UnparseableAutoregisterSpec < Error
39
+ end
28
40
  end
@@ -88,7 +88,7 @@ module EnvParser::Types
88
88
  ## With `raise_exceptions` set, ChronicDuration will fail on the "P" and "T" in ISO8601
89
89
  ## periods, so we have to check for and remove them.
90
90
  ##
91
- iso_period = %r{^\s*P(?:[0-9.]Y)?(?:[0-9.]M)?(?:[0-9.]W)?(?:[0-9.]D)?(?:T(?:[0-9.]H)?(?:[0-9.]M)?(?:[0-9.]S)?)?\s*$}
91
+ iso_period = %r{^\s*P(?:[0-9.]Y)?(?:[0-9.]M)?(?:[0-9.]W)?(?:[0-9.]D)?(?:T(?:[0-9.]H)?(?:[0-9.]M)?(?:[0-9.]S)?)?\s*$} ## rubocop:disable Metrics/LineLength
92
92
  value = value.delete 'PT' if value =~ iso_period
93
93
 
94
94
  value = ChronicDuration.parse value, keep_zero: true
@@ -79,7 +79,7 @@ module EnvParser::Types
79
79
  EnvParser.define_type(:network_port, aliases: :port, if_unset: nil) do |value|
80
80
  begin
81
81
  Integer(value)
82
- rescue
82
+ rescue ArgumentError
83
83
  raise(EnvParser::ValueNotConvertibleError, 'non-numeric value')
84
84
  end
85
85
 
@@ -90,7 +90,7 @@ module EnvParser::Types
90
90
  end
91
91
 
92
92
  EnvParser.define_type(:email_address, if_unset: nil) do |value|
93
- simple_email = %r[^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$]i
93
+ simple_email = %r[^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$]i ## rubocop:disable Metrics/LineLength
94
94
  raise(EnvParser::ValueNotConvertibleError, 'not an email') unless value.match?(simple_email)
95
95
 
96
96
  value
@@ -1,3 +1,3 @@
1
1
  class EnvParser
2
- VERSION = '1.2.0'.freeze
2
+ VERSION = '1.3.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: env_parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nestor Custodio
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-10-21 00:00:00.000000000 Z
11
+ date: 2019-11-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,6 +66,34 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: yard
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
69
97
  - !ruby/object:Gem::Dependency
70
98
  name: activesupport
71
99
  requirement: !ruby/object:Gem::Requirement
@@ -130,6 +158,7 @@ files:
130
158
  - bin/console
131
159
  - bin/setup
132
160
  - docs/EnvParser.html
161
+ - docs/EnvParser/AutoregisterFileNotFound.html
133
162
  - docs/EnvParser/Error.html
134
163
  - docs/EnvParser/TypeAlreadyDefined.html
135
164
  - docs/EnvParser/TypeAlreadyDefinedError.html
@@ -138,6 +167,7 @@ files:
138
167
  - docs/EnvParser/Types/ChronologyTypes.html
139
168
  - docs/EnvParser/Types/InternetTypes.html
140
169
  - docs/EnvParser/UnknownTypeError.html
170
+ - docs/EnvParser/UnparseableAutoregisterSpec.html
141
171
  - docs/EnvParser/ValueNotAllowed.html
142
172
  - docs/EnvParser/ValueNotAllowedError.html
143
173
  - docs/EnvParser/ValueNotConvertibleError.html
@@ -162,6 +192,7 @@ files:
162
192
  - docs/top-level-namespace.html
163
193
  - env_parser.gemspec
164
194
  - lib/env_parser.rb
195
+ - lib/env_parser/autoregister.rb
165
196
  - lib/env_parser/errors.rb
166
197
  - lib/env_parser/types.rb
167
198
  - lib/env_parser/types/base_types.rb