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.
@@ -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