inquisitive 2.0.1 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +3 -6
- data/LICENSE.md +1 -1
- data/README.md +104 -107
- data/Rakefile +13 -2
- data/inquisitive.gemspec +4 -5
- data/lib/inquisitive.rb +6 -3
- data/lib/inquisitive/array.rb +5 -1
- data/lib/inquisitive/environment.rb +27 -25
- data/lib/inquisitive/hash.rb +5 -3
- data/lib/inquisitive/nil_class.rb +48 -0
- data/lib/inquisitive/string.rb +4 -0
- data/test/inquisitive/combinatorial_environment_test.rb +15 -3
- data/test/inquisitive/environment_test.rb +0 -35
- data/test/inquisitive/nil_object_test.rb +11 -0
- data/test/inquisitive_test.rb +26 -6
- data/test/shared/array_tests.rb +4 -3
- data/test/shared/combinatorial_environment_tests.rb +8 -2
- data/test/shared/hash_tests.rb +23 -3
- data/test/shared/nil_object_tests.rb +56 -0
- data/test/shared/string_tests.rb +4 -3
- data/test/test_helper.rb +14 -10
- metadata +14 -5
- data/.gitignore +0 -18
- data/CHANGELOG.md +0 -80
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 80d236d855c6c33b3ec287fcd2c3a302388608f3
|
4
|
+
data.tar.gz: bd301adffafcbc757db422e5e0adeb780a06b5e4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e19cf79e18d77f23a58ee9c6dfc6d87af7262e4fd828f271e9cfe3694c67b38d11ea6c10764a14b6483ce037accac1491348a9a25ef6351c5d7332b6f0cd1d6a
|
7
|
+
data.tar.gz: 5e287d046ac747a2f27391bb6c38046b33c3123c93e953546948a06d16500cacde4629fcb77b66c39cfee4941eebb8e1d8df6ba7e4ca41ae6313d7c5989cadd3
|
data/.travis.yml
CHANGED
@@ -4,10 +4,11 @@ rvm:
|
|
4
4
|
- 1.9.3
|
5
5
|
- 2.0.0
|
6
6
|
- 2.1
|
7
|
+
- 2.2
|
7
8
|
- ruby-head
|
8
9
|
- rbx-2
|
9
10
|
- jruby
|
10
|
-
|
11
|
+
|
11
12
|
gemfile:
|
12
13
|
- Gemfile
|
13
14
|
- Gemfile.ActiveSupport
|
@@ -20,10 +21,6 @@ env:
|
|
20
21
|
|
21
22
|
matrix:
|
22
23
|
fast_finish: true
|
23
|
-
allow_failures:
|
24
|
-
- rvm: rbx-2
|
25
|
-
- rvm: jruby
|
26
|
-
- rvm: ruby-head
|
27
24
|
exclude:
|
28
25
|
- gemfile: Gemfile.ActiveSupport
|
29
26
|
env: ""
|
@@ -33,7 +30,7 @@ matrix:
|
|
33
30
|
env: "activesupport=4.1.1"
|
34
31
|
- gemfile: Gemfile
|
35
32
|
env: "activesupport=master"
|
36
|
-
|
33
|
+
|
37
34
|
branches:
|
38
35
|
except:
|
39
36
|
- gh-pages
|
data/LICENSE.md
CHANGED
data/README.md
CHANGED
@@ -4,6 +4,7 @@ Inquisitive
|
|
4
4
|
> **Predicate methods for those curious about their datastructures.**
|
5
5
|
|
6
6
|
|
7
|
+
|
7
8
|
Synopsis
|
8
9
|
--------
|
9
10
|
|
@@ -14,10 +15,12 @@ It also allows you to auto-instanciate and read inquisitive datastructures strai
|
|
14
15
|
Inquisitive will try to use ActiveSupport's `HashWithIndifferentAccess`, but if that cannot be found it will bootstrap itself with a minimal, well-tested version extracted from ActiveSupport 4.0.
|
15
16
|
|
16
17
|
|
18
|
+
|
17
19
|
Status
|
18
20
|
------
|
19
21
|
|
20
|
-
[status]:
|
22
|
+
[status]: https://travis-ci.org/christhekeele/inquisitive
|
23
|
+
[coverage]: https://rawgit.com/christhekeele/inquisitive/master/coverage/index.html
|
21
24
|
|
22
25
|
[version]: https://rubygems.org/gems/inquisitive/versions
|
23
26
|
[version-image]: https://badge.fury.io/rb/inquisitive@2x.svg
|
@@ -38,12 +41,13 @@ Status
|
|
38
41
|
|
39
42
|
[![Version][version-image]][version] [![Quality][quality-image]][quality] [![Dependencies][dependencies-image]][dependencies]
|
40
43
|
|
41
|
-
| :thumbsup: | [Continuous Integration][status] |
|
44
|
+
| :thumbsup: | [Continuous Integration][status] | [Test Coverage][coverage] |
|
42
45
|
|:--------------------------:|:-----------------------------------:|:----------------------------------------:|
|
43
46
|
| [Master][master] | ![Build Status][master-status] | ![Coverage Status][master-coverage] |
|
44
47
|
| [Development][development] | ![Build Status][development-status] | ![Coverage Status][development-coverage] |
|
45
48
|
|
46
49
|
|
50
|
+
|
47
51
|
Installation
|
48
52
|
------------
|
49
53
|
|
@@ -61,9 +65,11 @@ $ gem install inquisitive
|
|
61
65
|
```
|
62
66
|
|
63
67
|
|
68
|
+
|
64
69
|
Usage
|
65
70
|
-----
|
66
71
|
|
72
|
+
|
67
73
|
### String
|
68
74
|
|
69
75
|
`Inquisitive::String` tests equality:
|
@@ -77,6 +83,7 @@ environment.not.development?
|
|
77
83
|
#=> false
|
78
84
|
```
|
79
85
|
|
86
|
+
|
80
87
|
### Array
|
81
88
|
|
82
89
|
`Inquisitive::Array` tests inclusion:
|
@@ -92,6 +99,7 @@ supported_databases.exclude.sql_server?
|
|
92
99
|
#=> true
|
93
100
|
```
|
94
101
|
|
102
|
+
|
95
103
|
### Hash
|
96
104
|
|
97
105
|
`Inquisitive::Hash` provides struct-like access to its values, wrapped in other inquisitive objects:
|
@@ -101,11 +109,13 @@ stubbed = Inquisitive::Hash.new(
|
|
101
109
|
authentication: true,
|
102
110
|
in: 'development',
|
103
111
|
services: %w[database api],
|
112
|
+
api: {protocol: 'https', subdomains: %w[app web db]},
|
104
113
|
ignorable: { junk: [ "" ] }
|
105
114
|
)
|
106
115
|
#=> {"authentication"=>true,
|
107
116
|
#=> "in"=>"development",
|
108
117
|
#=> "services"=>["database", "api"],
|
118
|
+
#=> "api"=>{"protocol"=>"https", "subdomains"=>["app", "web", "db"]},
|
109
119
|
#=> "ignorable"=>{"junk"=>[""]}}
|
110
120
|
|
111
121
|
stubbed.authentication?
|
@@ -114,6 +124,8 @@ stubbed.registration?
|
|
114
124
|
#=> false
|
115
125
|
stubbed.services?
|
116
126
|
#=> true
|
127
|
+
stubbed.api?
|
128
|
+
#=> true
|
117
129
|
stubbed.ignorable?
|
118
130
|
#=> false
|
119
131
|
|
@@ -121,10 +133,18 @@ stubbed.in.development?
|
|
121
133
|
#=> true
|
122
134
|
stubbed.in.production?
|
123
135
|
#=> false
|
136
|
+
|
124
137
|
stubbed.services.database?
|
125
138
|
#=> true
|
126
139
|
stubbed.services.sidekiq?
|
127
140
|
#=> false
|
141
|
+
|
142
|
+
stubbed.api.protocol?
|
143
|
+
#=> true
|
144
|
+
stubbed.api.protocol.http?
|
145
|
+
#=> false
|
146
|
+
stubbed.api.domains.web?
|
147
|
+
#=> true
|
128
148
|
```
|
129
149
|
|
130
150
|
`Inquisitive::Hash` also allows negation with the `no` method:
|
@@ -143,6 +163,56 @@ config.no.api?
|
|
143
163
|
#=> true
|
144
164
|
```
|
145
165
|
|
166
|
+
Empty keys and nil values become instances of `Inquisitive::NilClass`, which is a black-hole null object that respects the Inquisitive interface, allowing you to inquire on non-existant nested datastructures as if there was one there, negated methods included:
|
167
|
+
|
168
|
+
```ruby
|
169
|
+
stubbed = Inquisitive::Hash.new
|
170
|
+
#=> {}
|
171
|
+
|
172
|
+
# We can query it as if we assumed we had:
|
173
|
+
#=> {"authentication"=>true,
|
174
|
+
#=> "in"=>"development",
|
175
|
+
#=> "services"=>["database", "api"],
|
176
|
+
#=> "api"=>{"protocol"=>"https", "subdomains"=>["app", "web", "db"]}}
|
177
|
+
|
178
|
+
stubbed.authentication?
|
179
|
+
#=> false
|
180
|
+
stubbed.registration?
|
181
|
+
#=> false
|
182
|
+
stubbed.services?
|
183
|
+
#=> false
|
184
|
+
stubbed.api?
|
185
|
+
#=> false
|
186
|
+
stubbed.ignorable?
|
187
|
+
#=> false
|
188
|
+
stubbed.no.ignorable?
|
189
|
+
#=> true
|
190
|
+
|
191
|
+
stubbed.in.development?
|
192
|
+
#=> false
|
193
|
+
stubbed.in.production?
|
194
|
+
#=> false
|
195
|
+
stubbed.in.not.production?
|
196
|
+
#=> true
|
197
|
+
|
198
|
+
stubbed.services.database?
|
199
|
+
#=> false
|
200
|
+
stubbed.services.sidekiq?
|
201
|
+
#=> false
|
202
|
+
stubbed.services.exclude.sidekiq?
|
203
|
+
#=> true
|
204
|
+
|
205
|
+
stubbed.api.protocol?
|
206
|
+
#=> false
|
207
|
+
stubbed.api.no.protocol?
|
208
|
+
#=> true
|
209
|
+
stubbed.api.protocol.http?
|
210
|
+
#=> false
|
211
|
+
stubbed.api.domains.web?
|
212
|
+
#=> false
|
213
|
+
```
|
214
|
+
|
215
|
+
|
146
216
|
### Inquisitive Environment
|
147
217
|
|
148
218
|
`Inquisitive::Environment` can be used in your modules and classes to more easily interrogate `ENV` variables with inquisitive objects:
|
@@ -151,59 +221,69 @@ config.no.api?
|
|
151
221
|
|
152
222
|
```ruby
|
153
223
|
ENV['ENVIRONMENT'] = "development"
|
154
|
-
class
|
224
|
+
class MyApp
|
155
225
|
extend Inquisitive::Environment
|
156
226
|
inquires_about 'ENVIRONMENT'
|
157
227
|
end
|
158
228
|
|
159
|
-
|
229
|
+
MyApp.environment
|
160
230
|
#=> "development"
|
161
|
-
|
231
|
+
MyApp.environment.development?
|
162
232
|
#=> true
|
163
|
-
|
233
|
+
MyApp.environment.production?
|
164
234
|
#=> false
|
165
235
|
```
|
166
236
|
|
167
237
|
#### Arrays
|
168
238
|
|
239
|
+
Arrays are recognized when environment variables contain commas:
|
240
|
+
|
169
241
|
```ruby
|
170
242
|
ENV['SUPPORTED_DATABASES'] = "mysql,postgres,sqlite"
|
171
|
-
class
|
243
|
+
class MyApp
|
172
244
|
extend Inquisitive::Environment
|
173
245
|
inquires_about 'SUPPORTED_DATABASES'
|
174
246
|
end
|
175
247
|
|
176
|
-
|
248
|
+
MyApp.supported_databases
|
177
249
|
#=> ["mysql", "postgres", "sqlite"]
|
178
|
-
|
250
|
+
MyApp.supported_databases.sqlite?
|
179
251
|
#=> true
|
180
|
-
|
252
|
+
MyApp.supported_databases.sql_server?
|
181
253
|
#=> false
|
182
254
|
```
|
183
255
|
|
184
256
|
#### Hashes
|
185
257
|
|
258
|
+
Hashes are recognized when environment variables names contain double underscores:
|
259
|
+
|
186
260
|
```ruby
|
187
261
|
ENV['STUB__AUTHENTICATION'] = 'true'
|
188
262
|
ENV['STUB__IN'] = "development"
|
189
263
|
ENV['STUB__SERVICES'] = "database,api"
|
190
|
-
|
264
|
+
ENV['STUB__API__PROTOCOL'] = "https"
|
265
|
+
ENV['STUB__API__SUBDOMAINS'] = "app,web,db"
|
266
|
+
class MyApp
|
191
267
|
extend Inquisitive::Environment
|
192
268
|
inquires_about 'STUB'
|
193
269
|
end
|
194
270
|
|
195
|
-
|
271
|
+
MyApp.stub.authentication?
|
196
272
|
#=> true
|
197
|
-
|
273
|
+
MyApp.stub.registration?
|
198
274
|
#=> false
|
199
|
-
|
275
|
+
MyApp.stub.in.development?
|
200
276
|
#=> true
|
201
|
-
|
277
|
+
MyApp.stub.in.production?
|
202
278
|
#=> false
|
203
|
-
|
279
|
+
MyApp.stub.services.exclude.sidekiq?
|
204
280
|
#=> true
|
205
|
-
|
281
|
+
MyApp.stub.services.sidekiq?
|
282
|
+
#=> false
|
283
|
+
MyApp.stub.api.protocol.http?
|
206
284
|
#=> false
|
285
|
+
MyApp.stub.api.subdomains.web?
|
286
|
+
#=> true
|
207
287
|
```
|
208
288
|
|
209
289
|
#### Naming
|
@@ -212,100 +292,16 @@ You can name your environment inquirers with `:with`:
|
|
212
292
|
|
213
293
|
```ruby
|
214
294
|
ENV['ENVIRONMENT'] = "development"
|
215
|
-
class
|
295
|
+
class MyApp
|
216
296
|
extend Inquisitive::Environment
|
217
297
|
inquires_about 'ENVIRONMENT', with: :env
|
218
298
|
end
|
219
299
|
|
220
|
-
|
300
|
+
MyApp.env
|
221
301
|
#=> "development"
|
222
|
-
|
223
|
-
#=> true
|
224
|
-
MyGame.env.production?
|
225
|
-
#=> false
|
226
|
-
```
|
227
|
-
|
228
|
-
#### Presence
|
229
|
-
|
230
|
-
Environment inquirers can have explicit presence checks, circumventing a common pitfall when reasoning about environment variables. Borrowing from the example above:
|
231
|
-
|
232
|
-
```ruby
|
233
|
-
ENV['STUB__AUTHENTICATION'] = 'false'
|
234
|
-
class MyGame
|
235
|
-
extend Inquisitive::Environment
|
236
|
-
inquires_about 'STUB'
|
237
|
-
end
|
238
|
-
|
239
|
-
MyGame.stub.authentication
|
240
|
-
#=> "false"
|
241
|
-
MyGame.stub.authentication?
|
302
|
+
MyApp.env.development?
|
242
303
|
#=> true
|
243
|
-
|
244
|
-
#=> false
|
245
|
-
```
|
246
|
-
|
247
|
-
It's common to use the presence of environment variables as runtime booleans. This is frequently done by setting the environment variable to the string `"true"` when you want it to be true, and not at all otherwise. As demonstrated, this pattern can lead to ambiguity when the string is other values.
|
248
|
-
|
249
|
-
By default such variables will be parsed as an `Inquisitive::String`, so predicate methods will return true whatever their contents, as long as they exist. You can bind the predicate method tighter to an explicit value if you prefer:
|
250
|
-
|
251
|
-
```ruby
|
252
|
-
ENV['STUB_AUTHENTICATION'] = 'false'
|
253
|
-
ENV['STUB_REGISTRATION'] = 'true'
|
254
|
-
class MyGame
|
255
|
-
extend Inquisitive::Environment
|
256
|
-
inquires_about 'STUB_AUTHENTICATION', present_if: 'true'
|
257
|
-
inquires_about 'STUB_REGISTRATION', present_if: 'true'
|
258
|
-
end
|
259
|
-
|
260
|
-
MyGame.stub_authentication
|
261
|
-
#=> "false"
|
262
|
-
MyGame.stub_authentication?
|
263
|
-
#=> false
|
264
|
-
|
265
|
-
MyGame.stub_registration
|
266
|
-
#=> "true"
|
267
|
-
MyGame.stub_registration?
|
268
|
-
#=> true
|
269
|
-
```
|
270
|
-
|
271
|
-
This only works on top-level inquirers, so there's no way to get our nested `MyGame.stubbed.authentication?` to behave as expected (currently).
|
272
|
-
|
273
|
-
The `present_if` check uses `===` under the covers for maximum expressiveness, so you can also use it to match against regexs, classes, and other constructs.
|
274
|
-
|
275
|
-
##### Truthy Booleans
|
276
|
-
|
277
|
-
`Inquisitive::Environment.truthy` contains a regex useful for reading booleans from environment variables.
|
278
|
-
|
279
|
-
```ruby
|
280
|
-
ENV['NO'] = 'no'
|
281
|
-
ENV['YES'] = 'yes'
|
282
|
-
ENV['TRUTHY'] = 'TrUe'
|
283
|
-
ENV['FALSEY'] = 'FaLsE'
|
284
|
-
ENV['BOOLEAN'] = '1'
|
285
|
-
ENV['BOOLENOPE'] = '0'
|
286
|
-
class MyCli
|
287
|
-
extend Inquisitive::Environment
|
288
|
-
inquires_about 'NO', present_if: truthy
|
289
|
-
inquires_about 'YES', present_if: truthy
|
290
|
-
inquires_about 'TRUTHY', present_if: truthy
|
291
|
-
inquires_about 'FALSEY', present_if: truthy
|
292
|
-
inquires_about 'BOOLEAN', present_if: truthy
|
293
|
-
inquires_about 'BOOLENOPE', present_if: truthy
|
294
|
-
end
|
295
|
-
|
296
|
-
MyGame.no?
|
297
|
-
#=> false
|
298
|
-
MyGame.yes?
|
299
|
-
#=> true
|
300
|
-
|
301
|
-
MyGame.truthy?
|
302
|
-
#=> true
|
303
|
-
MyGame.falsey?
|
304
|
-
#=> false
|
305
|
-
|
306
|
-
MyGame.boolean?
|
307
|
-
#=> true
|
308
|
-
MyGame.boolenope?
|
304
|
+
MyApp.env.production?
|
309
305
|
#=> false
|
310
306
|
```
|
311
307
|
|
@@ -314,7 +310,7 @@ MyGame.boolenope?
|
|
314
310
|
Environment inquirers have three configurable modes, defaulting to `:static`.
|
315
311
|
|
316
312
|
```ruby
|
317
|
-
class
|
313
|
+
class MyApp
|
318
314
|
extend Inquisitive::Environment
|
319
315
|
inquires_about 'STUB', mode: %i[dynamic lazy static].sample
|
320
316
|
end
|
@@ -336,7 +332,8 @@ end
|
|
336
332
|
|
337
333
|
Environment inquiries use the contents of `ENV` at the moment `inquires_about` was invoked.
|
338
334
|
|
339
|
-
Use if your application is well-behaved and doesn't go mucking around with the environment at
|
335
|
+
Use if your application is well-behaved and doesn't go mucking around with the environment at runtim.
|
336
|
+
|
340
337
|
|
341
338
|
|
342
339
|
Contributing
|
data/Rakefile
CHANGED
@@ -7,6 +7,17 @@ Rake::TestTask.new do |t|
|
|
7
7
|
end
|
8
8
|
task default: :test
|
9
9
|
|
10
|
-
|
11
|
-
|
10
|
+
desc "Open a pry console preloaded with this library"
|
11
|
+
task console: 'console:pry'
|
12
|
+
|
13
|
+
namespace :console do
|
14
|
+
|
15
|
+
task :pry do
|
16
|
+
sh "bundle exec pry -I lib -r inquisitive.rb"
|
17
|
+
end
|
18
|
+
|
19
|
+
task :irb do
|
20
|
+
sh "bundle exec irb -I lib -r inquisitive.rb"
|
21
|
+
end
|
22
|
+
|
12
23
|
end
|
data/inquisitive.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = "inquisitive"
|
7
|
-
spec.version = "
|
7
|
+
spec.version = "3.0.0"
|
8
8
|
spec.authors = ["Chris Keele"]
|
9
9
|
spec.email = ["dev@chriskeele.com"]
|
10
10
|
spec.summary = "Predicate methods for those curious about their datastructures."
|
@@ -18,11 +18,10 @@ Gem::Specification.new do |spec|
|
|
18
18
|
Also allows you to auto-instanciate and read inquisitive datastructures straight
|
19
19
|
from your `ENV` hash.
|
20
20
|
DESC
|
21
|
-
spec.homepage = "
|
21
|
+
spec.homepage = "http://christhekeele.github.io/inquisitive"
|
22
22
|
spec.license = "MIT"
|
23
|
-
|
24
|
-
spec.
|
25
|
-
spec.test_files = spec.files.grep(%r{^(test)/})
|
23
|
+
spec.files = `git ls-files lib README.md LICENSE.md`.split($/)
|
24
|
+
spec.test_files = `git ls-files test inquisitive.gemspec Gemfile Gemfile.lock Gemfile.ActiveSupport Rakefile .travis.yml .coveralls.yml`.split($/)
|
26
25
|
spec.require_paths = ["lib"]
|
27
26
|
|
28
27
|
spec.add_development_dependency "bundler", ">= 1.3"
|
data/lib/inquisitive.rb
CHANGED
@@ -10,16 +10,18 @@ module Inquisitive
|
|
10
10
|
|
11
11
|
def present?(object)
|
12
12
|
case object
|
13
|
-
when ::String
|
13
|
+
when ::String, String
|
14
14
|
not object.empty?
|
15
|
-
when ::Array
|
15
|
+
when ::Array, Array
|
16
16
|
object.any? do |value|
|
17
17
|
Inquisitive.present? value
|
18
18
|
end
|
19
|
-
when ::Hash
|
19
|
+
when ::Hash, Hash
|
20
20
|
object.values.any? do |value|
|
21
21
|
Inquisitive.present? value
|
22
22
|
end
|
23
|
+
when ::NilClass, NilClass
|
24
|
+
false
|
23
25
|
else
|
24
26
|
!!object
|
25
27
|
end
|
@@ -39,6 +41,7 @@ private
|
|
39
41
|
|
40
42
|
end
|
41
43
|
|
44
|
+
require "inquisitive/nil_class"
|
42
45
|
require "inquisitive/string"
|
43
46
|
require "inquisitive/array"
|
44
47
|
unless Object.const_defined? :HashWithIndifferentAccess
|
data/lib/inquisitive/array.rb
CHANGED
@@ -1,12 +1,16 @@
|
|
1
1
|
module Inquisitive
|
2
2
|
class Array < ::Array
|
3
3
|
include Inquisitive
|
4
|
-
attr_accessor :negated, :array
|
5
4
|
|
5
|
+
attr_accessor :negated
|
6
6
|
def exclude
|
7
7
|
self.dup.tap{ |a| a.negated = !a.negated }
|
8
8
|
end
|
9
9
|
|
10
|
+
def === other
|
11
|
+
other.class == Class and other == ::Array or super
|
12
|
+
end
|
13
|
+
|
10
14
|
private
|
11
15
|
|
12
16
|
def respond_to_missing?(method_name, include_private = false)
|
@@ -2,10 +2,6 @@ module Inquisitive
|
|
2
2
|
module Environment
|
3
3
|
include Inquisitive
|
4
4
|
|
5
|
-
def truthy
|
6
|
-
/true|yes|1/i
|
7
|
-
end
|
8
|
-
|
9
5
|
def inquires_about(env_var, opts={})
|
10
6
|
|
11
7
|
env_accessor = opts.fetch(:with, env_var.downcase[/(.*?)(?=(?:_$|$))/])
|
@@ -35,19 +31,6 @@ module Inquisitive
|
|
35
31
|
|
36
32
|
end
|
37
33
|
|
38
|
-
present_if = opts.fetch(:present_if, nil)
|
39
|
-
|
40
|
-
@__env_presence__ ||= HashWithIndifferentAccess.new
|
41
|
-
@__env_presence__["#{env_accessor}?"] = present_if if present_if
|
42
|
-
|
43
|
-
define_singleton_method :"#{env_accessor}?" do
|
44
|
-
if @__env_presence__.has_key? __method__
|
45
|
-
@__env_presence__[__method__] === send(predication(__method__))
|
46
|
-
else
|
47
|
-
Inquisitive.present? send(predication(__method__))
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
34
|
end
|
52
35
|
|
53
36
|
private
|
@@ -56,7 +39,7 @@ module Inquisitive
|
|
56
39
|
class << self
|
57
40
|
|
58
41
|
def [](var_name)
|
59
|
-
if ENV.has_key? var_name
|
42
|
+
result = if ENV.has_key? var_name
|
60
43
|
|
61
44
|
env_var = ENV[var_name]
|
62
45
|
if env_var.include? ','
|
@@ -67,14 +50,15 @@ module Inquisitive
|
|
67
50
|
|
68
51
|
elsif env_vars = can_find_env_keys_from(var_name)
|
69
52
|
|
70
|
-
|
71
|
-
|
72
|
-
|
53
|
+
Hash[].tap do |hash|
|
54
|
+
env_vars.each do |key|
|
55
|
+
set_hash_value_of hash, key
|
56
|
+
end
|
73
57
|
end
|
74
58
|
|
75
|
-
else
|
76
|
-
""
|
77
59
|
end
|
60
|
+
|
61
|
+
replace_empty result
|
78
62
|
end
|
79
63
|
|
80
64
|
def can_find_env_keys_from(var_name)
|
@@ -88,8 +72,26 @@ module Inquisitive
|
|
88
72
|
end
|
89
73
|
end
|
90
74
|
|
91
|
-
def
|
92
|
-
|
75
|
+
def set_hash_value_of(hash, var)
|
76
|
+
keypath = var.split('__').map(&:downcase)
|
77
|
+
keypath.shift
|
78
|
+
hash.tap do |hash|
|
79
|
+
keypath.reduce(hash) do |namespace, key|
|
80
|
+
namespace[key] = if key == keypath.last
|
81
|
+
replace_empty Inquisitive[Parser[var]]
|
82
|
+
else
|
83
|
+
if namespace[key].respond_to? :store
|
84
|
+
namespace[key]
|
85
|
+
else
|
86
|
+
Hash.new
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def replace_empty(value)
|
94
|
+
value == "" or value.nil? ? NilClass.new(nil) : value
|
93
95
|
end
|
94
96
|
|
95
97
|
end
|
data/lib/inquisitive/hash.rb
CHANGED
@@ -11,6 +11,10 @@ module Inquisitive
|
|
11
11
|
super(Inquisitive[value], options)
|
12
12
|
end
|
13
13
|
|
14
|
+
def === other
|
15
|
+
other.class == Class and other == ::Hash or super
|
16
|
+
end
|
17
|
+
|
14
18
|
private
|
15
19
|
|
16
20
|
def dup
|
@@ -27,10 +31,8 @@ module Inquisitive
|
|
27
31
|
else
|
28
32
|
false
|
29
33
|
end ^ negated
|
30
|
-
elsif has_key? method_name
|
31
|
-
self[method_name]
|
32
34
|
else
|
33
|
-
|
35
|
+
Inquisitive[self[method_name]]
|
34
36
|
end
|
35
37
|
end
|
36
38
|
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Inquisitive
|
2
|
+
class NilClass
|
3
|
+
include Inquisitive
|
4
|
+
|
5
|
+
def initialize(object=nil); end
|
6
|
+
|
7
|
+
attr_accessor :negated
|
8
|
+
def not
|
9
|
+
self.dup.tap{ |s| s.negated = !s.negated }
|
10
|
+
end
|
11
|
+
alias_method :exclude, :not
|
12
|
+
alias_method :no, :not
|
13
|
+
|
14
|
+
undef_method :nil?, :inspect, :to_s
|
15
|
+
|
16
|
+
# Since we can't subclass NilClass
|
17
|
+
# (it has no allocate method)
|
18
|
+
# we fake its identity.
|
19
|
+
def instance_of?(klass)
|
20
|
+
klass == ::NilClass or super
|
21
|
+
end
|
22
|
+
alias_method :kind_of?, :instance_of?
|
23
|
+
alias_method :is_a?, :instance_of?
|
24
|
+
|
25
|
+
def == other
|
26
|
+
other.nil?
|
27
|
+
end
|
28
|
+
def === other
|
29
|
+
other.class == Class and other == ::NilClass or super
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def respond_to_missing?(method_name, include_private = false)
|
35
|
+
true # nil.respond_to? method_name or predicate_method? method_name
|
36
|
+
end
|
37
|
+
def method_missing(method_name, *arguments)
|
38
|
+
if nil.respond_to? method_name
|
39
|
+
nil.send method_name, *arguments
|
40
|
+
elsif predicate_method? method_name
|
41
|
+
false ^ negated
|
42
|
+
else
|
43
|
+
self
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
data/lib/inquisitive/string.rb
CHANGED
@@ -4,22 +4,31 @@ class InquisitiveCombinatorialEnvironmentTest < EnvironmentTest
|
|
4
4
|
|
5
5
|
def setup
|
6
6
|
super
|
7
|
+
ENV['NIL_OBJECT'] = @raw_nil_object
|
7
8
|
ENV['STRING'] = @raw_string
|
8
9
|
ENV['ARRAY'] = @raw_array.join(',')
|
10
|
+
ENV['HASH__NOTHING'] = @raw_hash[:nothing]
|
9
11
|
ENV['HASH__AUTHENTICATION'] = @raw_hash[:authentication].to_s
|
10
12
|
ENV['HASH__IN'] = @raw_hash[:in]
|
11
13
|
ENV['HASH__DATABASES'] = @raw_hash[:databases].join(',')
|
14
|
+
ENV['HASH__NESTED__KEY'] = @raw_hash[:nested][:key]
|
15
|
+
ENV['HASH__NESTED__ARRAY'] = @raw_hash[:nested][:array].join(',')
|
12
16
|
end
|
13
17
|
def teardown
|
14
18
|
super
|
15
19
|
ENV.delete 'STRING'
|
16
20
|
ENV.delete 'ARRAY'
|
21
|
+
ENV.delete 'HASH__NOTHING'
|
17
22
|
ENV.delete 'HASH__AUTHENTICATION'
|
18
23
|
ENV.delete 'HASH__IN'
|
19
24
|
ENV.delete 'HASH__DATABASES'
|
25
|
+
ENV.delete 'HASH__NESTED__KEY'
|
20
26
|
ENV.delete 'HASH__SOMETHING_NEW'
|
21
27
|
end
|
22
28
|
|
29
|
+
def change_nil_object_variable
|
30
|
+
ENV['NIL_OBJECT'] = 'something_new'
|
31
|
+
end
|
23
32
|
def change_string_variable
|
24
33
|
ENV['STRING'] = 'something_new'
|
25
34
|
end
|
@@ -33,10 +42,10 @@ class InquisitiveCombinatorialEnvironmentTest < EnvironmentTest
|
|
33
42
|
end
|
34
43
|
|
35
44
|
%w[dynamic lazy static].each do |mode|
|
36
|
-
%w[string array hash].each do |type|
|
45
|
+
%w[nil_object string array hash].each do |type|
|
37
46
|
|
38
47
|
Inquisitive.const_set(
|
39
|
-
:"Inquisitive#{mode.capitalize}#{type.capitalize}EnvironmentTest",
|
48
|
+
:"Inquisitive#{mode.capitalize}#{type.split('_').map(&:capitalize).join}EnvironmentTest",
|
40
49
|
Class.new(InquisitiveCombinatorialEnvironmentTest) do
|
41
50
|
|
42
51
|
class << self
|
@@ -50,6 +59,9 @@ end
|
|
50
59
|
App.inquires_about @type.upcase, mode: @mode
|
51
60
|
end
|
52
61
|
|
62
|
+
def nil_object
|
63
|
+
App.nil_object
|
64
|
+
end
|
53
65
|
def string
|
54
66
|
App.string
|
55
67
|
end
|
@@ -66,7 +78,7 @@ end
|
|
66
78
|
).tap do |klass|
|
67
79
|
klass.mode = mode
|
68
80
|
klass.type = type
|
69
|
-
end.send :include, Object.const_get(:"#{type.capitalize}Tests")
|
81
|
+
end.send :include, Object.const_get(:"#{type.split('_').map(&:capitalize).join}Tests")
|
70
82
|
# Mixes in type-specific tests to ensure lookup behaves normally
|
71
83
|
# when accessed through the modes of App getters
|
72
84
|
|
@@ -2,15 +2,6 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
class InquisitiveEnvironmentTest < EnvironmentTest
|
4
4
|
|
5
|
-
def test_missing_variable_responses
|
6
|
-
App.inquires_about 'DOES_NOT_EXIST', with: :exists
|
7
|
-
assert_equal "", App.exists
|
8
|
-
end
|
9
|
-
def test_missing_variable_predicates
|
10
|
-
App.inquires_about 'DOES_NOT_EXIST', with: :exists
|
11
|
-
refute App.exists?
|
12
|
-
end
|
13
|
-
|
14
5
|
def test_autonaming_of_inquirers
|
15
6
|
App.inquires_about 'NAME_NOT_SPECIFIED'
|
16
7
|
assert App.respond_to? :name_not_specified
|
@@ -25,30 +16,4 @@ class InquisitiveEnvironmentTest < EnvironmentTest
|
|
25
16
|
assert App.defaults_to.static?
|
26
17
|
end
|
27
18
|
|
28
|
-
def test_custom_string_presence
|
29
|
-
ENV['AUTHORIZABLE'] = 'false'
|
30
|
-
App.inquires_about 'AUTHORIZABLE', present_if: 'true'
|
31
|
-
refute App.authorizable?
|
32
|
-
end
|
33
|
-
|
34
|
-
def test_custom_regex_presence
|
35
|
-
ENV['AUTHORIZABLE'] = 'not at all'
|
36
|
-
App.inquires_about 'AUTHORIZABLE', present_if: /yes/
|
37
|
-
refute App.authorizable?
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_custom_class_presence
|
41
|
-
ENV['AUTHORIZABLE'] = 'not at all'
|
42
|
-
App.inquires_about 'AUTHORIZABLE', present_if: Array
|
43
|
-
refute App.authorizable?
|
44
|
-
end
|
45
|
-
|
46
|
-
%w[true True TrUe TRUE yes Yes YeS YES 1].each do |truthy_var|
|
47
|
-
define_method :"test_truthy_var_#{truthy_var}" do
|
48
|
-
ENV['TRUTHY'] = truthy_var
|
49
|
-
App.inquires_about 'TRUTHY', present_if: App.truthy
|
50
|
-
assert App.truthy?
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
19
|
end
|
data/test/inquisitive_test.rb
CHANGED
@@ -19,9 +19,6 @@ class InquisitiveTest < Test
|
|
19
19
|
####
|
20
20
|
# CONVERSION
|
21
21
|
##
|
22
|
-
def test_converted_nil_equality
|
23
|
-
assert_equal Inquisitive[nil], nil
|
24
|
-
end
|
25
22
|
def test_converted_false_equality
|
26
23
|
assert_equal Inquisitive[false], false
|
27
24
|
end
|
@@ -41,22 +38,45 @@ class InquisitiveTest < Test
|
|
41
38
|
assert_equal Inquisitive[@object], @object
|
42
39
|
end
|
43
40
|
|
41
|
+
def test_converted_nil_object_ancestry
|
42
|
+
assert_kind_of NilClass, Inquisitive[nil]
|
43
|
+
assert Inquisitive[nil] === NilClass
|
44
|
+
end
|
45
|
+
def test_converted_nil_object_instanciation
|
46
|
+
assert_kind_of Inquisitive::NilClass, Inquisitive[nil]
|
47
|
+
end
|
48
|
+
def test_converted_nil_object_equality
|
49
|
+
assert_equal Inquisitive[nil], @raw_nil_object
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_converted_string_ancestry
|
53
|
+
assert_kind_of String, Inquisitive[@raw_string]
|
54
|
+
assert Inquisitive[@raw_string] === String
|
55
|
+
end
|
44
56
|
def test_converted_string_instanciation
|
45
|
-
|
57
|
+
assert_kind_of Inquisitive::String, Inquisitive[@raw_string]
|
46
58
|
end
|
47
59
|
def test_converted_string_equality
|
48
60
|
assert_equal Inquisitive[@raw_string], @raw_string
|
49
61
|
end
|
50
62
|
|
63
|
+
def test_converted_array_ancestry
|
64
|
+
assert_kind_of Array, Inquisitive[@raw_array]
|
65
|
+
assert Inquisitive[@raw_array] === Array
|
66
|
+
end
|
51
67
|
def test_converted_array_instanciation
|
52
|
-
|
68
|
+
assert_kind_of Inquisitive::Array, Inquisitive[@raw_array]
|
53
69
|
end
|
54
70
|
def test_converted_array_equality
|
55
71
|
assert_equal Inquisitive[@raw_array], @raw_array
|
56
72
|
end
|
57
73
|
|
74
|
+
def test_converted_hash_ancestry
|
75
|
+
assert_kind_of Hash, Inquisitive[@raw_hash]
|
76
|
+
assert Inquisitive[@raw_hash] === Hash
|
77
|
+
end
|
58
78
|
def test_converted_hash_instanciation
|
59
|
-
|
79
|
+
assert_kind_of Inquisitive::Hash, Inquisitive[@raw_hash]
|
60
80
|
end
|
61
81
|
def test_converted_hash_equality
|
62
82
|
assert_equal Inquisitive[@raw_hash], HashWithIndifferentAccess.new(@raw_hash)
|
data/test/shared/array_tests.rb
CHANGED
@@ -2,27 +2,28 @@ module ArrayTests
|
|
2
2
|
def test_array_value_type
|
3
3
|
assert_instance_of Inquisitive::Array, array
|
4
4
|
end
|
5
|
+
|
5
6
|
def test_array_match
|
6
7
|
assert array.postgres?
|
7
8
|
end
|
8
9
|
def test_array_miss
|
9
10
|
refute array.sql_server?
|
10
11
|
end
|
12
|
+
|
11
13
|
def test_array_negative_match
|
12
14
|
assert array.exclude.sql_server?
|
13
15
|
end
|
14
16
|
def test_array_negative_miss
|
15
17
|
refute array.exclude.postgres?
|
16
18
|
end
|
19
|
+
|
17
20
|
def test_array_double_negative_match
|
18
21
|
assert array.exclude.exclude.postgres?
|
19
22
|
end
|
20
23
|
def test_array_double_negative_miss
|
21
24
|
refute array.exclude.exclude.sql_server?
|
22
25
|
end
|
23
|
-
|
24
|
-
assert_raises(NoMethodError) { array.postgres }
|
25
|
-
end
|
26
|
+
|
26
27
|
def test_array_respond_to
|
27
28
|
assert_respond_to array, :postgres?
|
28
29
|
end
|
@@ -2,14 +2,14 @@ module CombinatorialEnvironmentTests
|
|
2
2
|
|
3
3
|
def test_type_is_parsed_correctly
|
4
4
|
assert_kind_of(
|
5
|
-
Object.const_get(:"#{
|
5
|
+
Object.const_get(:"#{type_const_name}"),
|
6
6
|
App.send(@type)
|
7
7
|
)
|
8
8
|
end
|
9
9
|
|
10
10
|
def test_type_is_converted_correctly
|
11
11
|
assert_kind_of(
|
12
|
-
Inquisitive.const_get(:"#{
|
12
|
+
Inquisitive.const_get(:"#{type_const_name}"),
|
13
13
|
App.send(@type)
|
14
14
|
)
|
15
15
|
end
|
@@ -30,4 +30,10 @@ module CombinatorialEnvironmentTests
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
+
private
|
34
|
+
|
35
|
+
def type_const_name
|
36
|
+
@type == 'nil_object' ? 'NilClass' : @type.capitalize
|
37
|
+
end
|
38
|
+
|
33
39
|
end
|
data/test/shared/hash_tests.rb
CHANGED
@@ -1,26 +1,46 @@
|
|
1
1
|
module HashTests
|
2
|
+
def test_hash_value_type
|
3
|
+
assert_instance_of Inquisitive::Hash, hash
|
4
|
+
end
|
5
|
+
|
2
6
|
def test_hash_match
|
3
7
|
assert hash.authentication?
|
4
8
|
end
|
5
9
|
def test_hash_miss
|
6
10
|
refute hash.registration?
|
7
11
|
end
|
12
|
+
|
13
|
+
def test_hash_access_implicit_nil
|
14
|
+
assert_instance_of Inquisitive::NilClass, hash.missing_key
|
15
|
+
end
|
16
|
+
def test_hash_access_explicit_nil
|
17
|
+
assert_instance_of Inquisitive::NilClass, hash.nothing
|
18
|
+
end
|
19
|
+
def test_hash_access_string
|
20
|
+
assert_instance_of Inquisitive::String, hash.in
|
21
|
+
end
|
22
|
+
def test_hash_access_array
|
23
|
+
assert_instance_of Inquisitive::Array, hash.databases
|
24
|
+
end
|
25
|
+
def test_hash_access_hash
|
26
|
+
assert_instance_of Inquisitive::Hash, hash.nested
|
27
|
+
end
|
28
|
+
|
8
29
|
def test_hash_negative_match
|
9
30
|
assert hash.no.registration?
|
10
31
|
end
|
11
32
|
def test_hash_negative_miss
|
12
33
|
refute hash.no.authentication?
|
13
34
|
end
|
35
|
+
|
14
36
|
def test_hash_double_negative_match
|
15
37
|
assert hash.no.no.authentication?
|
16
38
|
end
|
17
39
|
def test_hash_double_negative_miss
|
18
40
|
refute hash.no.no.registration?
|
19
41
|
end
|
42
|
+
|
20
43
|
def test_hash_respond_to
|
21
44
|
assert_respond_to hash, :authentication?
|
22
45
|
end
|
23
|
-
def test_hash_method_missing
|
24
|
-
assert_raises(NoMethodError) { hash.undefined }
|
25
|
-
end
|
26
46
|
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module NilObjectTests
|
2
|
+
def test_nil_object_value_type
|
3
|
+
assert_instance_of Inquisitive::NilClass, nil_object
|
4
|
+
end
|
5
|
+
|
6
|
+
def test_nil_object_chains
|
7
|
+
assert_instance_of Inquisitive::NilClass, nil_object.chain
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_nil_object_match
|
11
|
+
assert nil_object.nil?
|
12
|
+
end
|
13
|
+
def test_nil_object_miss
|
14
|
+
refute nil_object.anything_else?
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_nil_object_string_interface
|
18
|
+
string = nil_object
|
19
|
+
refute string.production?
|
20
|
+
end
|
21
|
+
def test_nil_object_string_interface_negative
|
22
|
+
string = nil_object
|
23
|
+
assert string.not.development?
|
24
|
+
end
|
25
|
+
def test_nil_object_string_interface_double_negative
|
26
|
+
string = nil_object
|
27
|
+
refute string.not.not.development?
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_nil_object_array_interface
|
31
|
+
array = nil_object
|
32
|
+
refute array.production?
|
33
|
+
end
|
34
|
+
def test_nil_object_array_interface_negative
|
35
|
+
array = nil_object
|
36
|
+
assert array.exclude.development?
|
37
|
+
end
|
38
|
+
def test_nil_object_array_interface_double_negative
|
39
|
+
array = nil_object
|
40
|
+
refute array.exclude.exclude.development?
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_nil_object_hash_interface
|
44
|
+
hash = nil_object
|
45
|
+
refute hash.production?
|
46
|
+
end
|
47
|
+
def test_nil_object_hash_interface_negative
|
48
|
+
hash = nil_object
|
49
|
+
assert hash.no.development?
|
50
|
+
end
|
51
|
+
def test_nil_object_hash_interface_double_negative
|
52
|
+
hash = nil_object
|
53
|
+
refute hash.no.no.development?
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
data/test/shared/string_tests.rb
CHANGED
@@ -2,27 +2,28 @@ module StringTests
|
|
2
2
|
def test_string_value_type
|
3
3
|
assert_instance_of Inquisitive::String, string
|
4
4
|
end
|
5
|
+
|
5
6
|
def test_string_match
|
6
7
|
assert string.production?
|
7
8
|
end
|
8
9
|
def test_string_miss
|
9
10
|
refute string.development?
|
10
11
|
end
|
12
|
+
|
11
13
|
def test_string_negative_match
|
12
14
|
assert string.not.development?
|
13
15
|
end
|
14
16
|
def test_string_negative_miss
|
15
17
|
refute string.not.production?
|
16
18
|
end
|
19
|
+
|
17
20
|
def test_string_double_negative_match
|
18
21
|
assert string.not.not.production?
|
19
22
|
end
|
20
23
|
def test_string_double_negative_miss
|
21
24
|
refute string.not.not.development?
|
22
25
|
end
|
23
|
-
|
24
|
-
assert_raises(NoMethodError) { string.production }
|
25
|
-
end
|
26
|
+
|
26
27
|
def test_string_respond_to
|
27
28
|
assert_respond_to string, :development?
|
28
29
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
-
require
|
1
|
+
require 'rubygems'
|
2
|
+
require 'pry'
|
2
3
|
|
3
4
|
begin
|
4
5
|
require 'simplecov'
|
5
|
-
SimpleCov.coverage_dir '
|
6
|
+
SimpleCov.coverage_dir 'coverage'
|
6
7
|
if ENV['CI']
|
7
8
|
require 'coveralls'
|
8
9
|
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
@@ -12,11 +13,10 @@ begin
|
|
12
13
|
end
|
13
14
|
SimpleCov.start do
|
14
15
|
add_filter "/test"
|
15
|
-
add_filter "/vendor"
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
require
|
19
|
+
require 'minitest/autorun'
|
20
20
|
|
21
21
|
class Test < MiniTest::Test
|
22
22
|
|
@@ -46,12 +46,15 @@ class Test < MiniTest::Test
|
|
46
46
|
end
|
47
47
|
|
48
48
|
def setup
|
49
|
+
@raw_nil_object = nil
|
49
50
|
@raw_string = 'production'
|
50
51
|
@raw_array = %w[mysql postgres sqlite]
|
51
52
|
@raw_hash = {
|
53
|
+
nothing: @raw_nil_object,
|
52
54
|
authentication: true,
|
53
55
|
in: @raw_string,
|
54
|
-
databases: @raw_array
|
56
|
+
databases: @raw_array,
|
57
|
+
nested: {key: 'value', array: %w[foo bar]}
|
55
58
|
}
|
56
59
|
end
|
57
60
|
|
@@ -71,9 +74,10 @@ class EnvironmentTest < Test
|
|
71
74
|
|
72
75
|
end
|
73
76
|
|
74
|
-
require
|
75
|
-
require
|
76
|
-
require
|
77
|
-
require
|
77
|
+
require 'shared/nil_object_tests'
|
78
|
+
require 'shared/string_tests'
|
79
|
+
require 'shared/array_tests'
|
80
|
+
require 'shared/hash_tests'
|
81
|
+
require 'shared/combinatorial_environment_tests'
|
78
82
|
|
79
|
-
require
|
83
|
+
require 'inquisitive'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: inquisitive
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Keele
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-02-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -68,9 +68,7 @@ extensions: []
|
|
68
68
|
extra_rdoc_files: []
|
69
69
|
files:
|
70
70
|
- ".coveralls.yml"
|
71
|
-
- ".gitignore"
|
72
71
|
- ".travis.yml"
|
73
|
-
- CHANGELOG.md
|
74
72
|
- Gemfile
|
75
73
|
- Gemfile.ActiveSupport
|
76
74
|
- LICENSE.md
|
@@ -82,20 +80,23 @@ files:
|
|
82
80
|
- lib/inquisitive/environment.rb
|
83
81
|
- lib/inquisitive/hash.rb
|
84
82
|
- lib/inquisitive/hash_with_indifferent_access.rb
|
83
|
+
- lib/inquisitive/nil_class.rb
|
85
84
|
- lib/inquisitive/string.rb
|
86
85
|
- test/inquisitive/array_test.rb
|
87
86
|
- test/inquisitive/combinatorial_environment_test.rb
|
88
87
|
- test/inquisitive/environment_test.rb
|
89
88
|
- test/inquisitive/hash_test.rb
|
90
89
|
- test/inquisitive/hash_with_indifferent_access_test.rb
|
90
|
+
- test/inquisitive/nil_object_test.rb
|
91
91
|
- test/inquisitive/string_test.rb
|
92
92
|
- test/inquisitive_test.rb
|
93
93
|
- test/shared/array_tests.rb
|
94
94
|
- test/shared/combinatorial_environment_tests.rb
|
95
95
|
- test/shared/hash_tests.rb
|
96
|
+
- test/shared/nil_object_tests.rb
|
96
97
|
- test/shared/string_tests.rb
|
97
98
|
- test/test_helper.rb
|
98
|
-
homepage:
|
99
|
+
homepage: http://christhekeele.github.io/inquisitive
|
99
100
|
licenses:
|
100
101
|
- MIT
|
101
102
|
metadata: {}
|
@@ -120,15 +121,23 @@ signing_key:
|
|
120
121
|
specification_version: 4
|
121
122
|
summary: Predicate methods for those curious about their datastructures.
|
122
123
|
test_files:
|
124
|
+
- ".coveralls.yml"
|
125
|
+
- ".travis.yml"
|
126
|
+
- Gemfile
|
127
|
+
- Gemfile.ActiveSupport
|
128
|
+
- Rakefile
|
129
|
+
- inquisitive.gemspec
|
123
130
|
- test/inquisitive/array_test.rb
|
124
131
|
- test/inquisitive/combinatorial_environment_test.rb
|
125
132
|
- test/inquisitive/environment_test.rb
|
126
133
|
- test/inquisitive/hash_test.rb
|
127
134
|
- test/inquisitive/hash_with_indifferent_access_test.rb
|
135
|
+
- test/inquisitive/nil_object_test.rb
|
128
136
|
- test/inquisitive/string_test.rb
|
129
137
|
- test/inquisitive_test.rb
|
130
138
|
- test/shared/array_tests.rb
|
131
139
|
- test/shared/combinatorial_environment_tests.rb
|
132
140
|
- test/shared/hash_tests.rb
|
141
|
+
- test/shared/nil_object_tests.rb
|
133
142
|
- test/shared/string_tests.rb
|
134
143
|
- test/test_helper.rb
|
data/.gitignore
DELETED
data/CHANGELOG.md
DELETED
@@ -1,80 +0,0 @@
|
|
1
|
-
Changes to Inquisitive
|
2
|
-
======================
|
3
|
-
|
4
|
-
> **Please consult this file when upgrading Inquisitive for important information on bugfixes, new features, and backwards incompatible changes.**
|
5
|
-
|
6
|
-
Starting with **[2.0.0](#2.0.0)**, Inquisitive follows [symantic versioning](symver.org) to help inform you of the implications of upgrades.
|
7
|
-
|
8
|
-
Releases
|
9
|
-
--------
|
10
|
-
|
11
|
-
[2.0.1]: https://github.com/christhekeele/inquisitive/tree/2.0.1
|
12
|
-
[2.0.0]: https://github.com/christhekeele/inquisitive/tree/2.0.0
|
13
|
-
[1.2.0]: https://github.com/christhekeele/inquisitive/tree/f314eaf84f7c3d9a2d56ae684d031dd81d2f7b85
|
14
|
-
|
15
|
-
- [2.0.0](#2.0.0)
|
16
|
-
- [1.2.0](#1.2.0)
|
17
|
-
|
18
|
-
2.0.1 - [2014.09.24][2.0.1]
|
19
|
-
---------------------------
|
20
|
-
|
21
|
-
### Non-breaking
|
22
|
-
|
23
|
-
- `Inquisitive::Environment.truthy`: **helper regex**
|
24
|
-
|
25
|
-
The `truthy` method provides an easy way to handle various command-line representations of truthiness.
|
26
|
-
|
27
|
-
|
28
|
-
2.0.0 - [2014.06.19][2.0.0]
|
29
|
-
---------------------------
|
30
|
-
|
31
|
-
### Breaking
|
32
|
-
|
33
|
-
- `Inquisitive::Environment`: **hash detection**
|
34
|
-
|
35
|
-
Previously `inquires_about` needed a special syntax to detect when you want to parse a group of environment variables as a hash. This was accomplished by leaving a trailing `_` in the declaration, such as:
|
36
|
-
|
37
|
-
```ruby
|
38
|
-
ENV['PREFIX_KEY1'] = "value1"
|
39
|
-
ENV['PREFIX_KEY2'] = "value2"
|
40
|
-
module Mine
|
41
|
-
extend Inquisitive::Environment
|
42
|
-
inquires_about 'PREFIX_'
|
43
|
-
end
|
44
|
-
Mine.prefix
|
45
|
-
#=> { 'key1' => 'value1', 'key2' => 'value2' }
|
46
|
-
```
|
47
|
-
|
48
|
-
Now it auto-detects hash groupings by looking for a double-`_` in the key itself:
|
49
|
-
|
50
|
-
```ruby
|
51
|
-
ENV['PREFIX__KEY1'] = "value1"
|
52
|
-
ENV['PREFIX__KEY2'] = "value2"
|
53
|
-
module Mine
|
54
|
-
extend Inquisitive::Environment
|
55
|
-
inquires_about 'PREFIX'
|
56
|
-
end
|
57
|
-
Mine.prefix
|
58
|
-
#=> { 'key1' => 'value1', 'key2' => 'value2' }
|
59
|
-
```
|
60
|
-
|
61
|
-
Nested hashes (through multiple `__`'s) are not yet supported.
|
62
|
-
|
63
|
-
- `Inquisitive::Environment`: **default modes**
|
64
|
-
|
65
|
-
Previously the default mode was `:dynamic`. This was mostly to prevent unexpected behaviour for newcomers.
|
66
|
-
|
67
|
-
Now `:static` is the default. This is because `Inquisitive::Environment` is meant to be loaded immediately after a boot script that prepares your environment variables, and queried often later. `:static` optimizes to this usecase.
|
68
|
-
|
69
|
-
To reproduce the old behaviour, you must explicitly pass `mode: :dynamic` each to `inquires_about` invocation. Alternatively, `mode: :lazy` might be a viable way to get the benefits of `:static` without refactoring your boot process.
|
70
|
-
|
71
|
-
### Non-breaking
|
72
|
-
|
73
|
-
- `Inquisitive::Environment`: **cached mode now lazy mode**
|
74
|
-
|
75
|
-
The `:cached` environment mode is now known as `:lazy`. This is backwards compatible because all logic handling modes explicitly checks for `:static` or `:dynamic`, so any other named mode has the same behaviour as `:lazy`.
|
76
|
-
|
77
|
-
1.2.0 - [2013.11.21][1.2.0]
|
78
|
-
---------------------------
|
79
|
-
|
80
|
-
Everything to date.
|