nenv 0.0.2 → 0.0.3
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.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -0
- data/.rubocop_todo.yml +33 -0
- data/.travis.yml +13 -0
- data/Gemfile +4 -1
- data/Guardfile +18 -20
- data/README.md +39 -10
- data/Rakefile +12 -3
- data/lib/nenv.rb +3 -3
- data/lib/nenv/autoenvironment.rb +2 -2
- data/lib/nenv/environment.rb +4 -4
- data/lib/nenv/environment/loader.rb +3 -3
- data/lib/nenv/version.rb +1 -1
- data/nenv.gemspec +13 -13
- data/spec/lib/nenv/environment/dumper_spec.rb +9 -9
- data/spec/lib/nenv/environment/loader_spec.rb +13 -13
- data/spec/lib/nenv/environment_spec.rb +68 -71
- data/spec/lib/nenv_spec.rb +15 -15
- data/spec/spec_helper.rb +4 -3
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bf78f1e4b9c0b4b0836dcb88c546d8d917506442
|
4
|
+
data.tar.gz: e18492bf894e4951f9e57bee5c343e507cbf7c06
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2370b04d5e91d4817da56f343c36f0e94ababa43073316695c4f3e0f9365073f3031aca40956a4866d0e4b7a8ff6e790a6d3c9dee0596cabbbd56a820e1aa746
|
7
|
+
data.tar.gz: 23245f176a801613181ab0443aad7c1770d4cf879e83ba2cdbfdb392e0abf37a8a43013952a42d686a47de4c6f7cf57d8f71e9f0ab5a8ec2fdaa0ea1df2c608a
|
data/.rubocop.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
inherit_from: .rubocop_todo.yml
|
data/.rubocop_todo.yml
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# This configuration was generated by `rubocop --auto-gen-config`
|
2
|
+
# on 2014-12-13 13:35:53 +0100 using RuboCop version 0.28.0.
|
3
|
+
# The point is for the user to remove these configuration records
|
4
|
+
# one by one as the offenses are removed from the code base.
|
5
|
+
# Note that changes in the inspected code, or installation of new
|
6
|
+
# versions of RuboCop, may require this file to be generated again.
|
7
|
+
|
8
|
+
# Offense count: 1
|
9
|
+
Lint/HandleExceptions:
|
10
|
+
Enabled: false
|
11
|
+
|
12
|
+
# Offense count: 1
|
13
|
+
Metrics/AbcSize:
|
14
|
+
Max: 16
|
15
|
+
|
16
|
+
# Offense count: 1
|
17
|
+
# Configuration parameters: AllowURI, URISchemes.
|
18
|
+
Metrics/LineLength:
|
19
|
+
Max: 112
|
20
|
+
|
21
|
+
# Offense count: 1
|
22
|
+
# Configuration parameters: CountComments.
|
23
|
+
Metrics/MethodLength:
|
24
|
+
Max: 11
|
25
|
+
|
26
|
+
# Offense count: 8
|
27
|
+
Style/Documentation:
|
28
|
+
Enabled: false
|
29
|
+
|
30
|
+
# Offense count: 1
|
31
|
+
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
32
|
+
Style/MethodName:
|
33
|
+
Enabled: false
|
data/.travis.yml
ADDED
data/Gemfile
CHANGED
@@ -3,6 +3,9 @@ source 'https://rubygems.org'
|
|
3
3
|
# Specify your gem's dependencies in nenv.gemspec
|
4
4
|
gemspec development_group: :test
|
5
5
|
|
6
|
+
gem 'coveralls', require: false
|
7
|
+
|
6
8
|
group :development do
|
7
|
-
gem 'guard-rspec', '~> 4.5
|
9
|
+
gem 'guard-rspec', '~> 4.5', require: false
|
10
|
+
gem 'guard-rubocop', require: false
|
8
11
|
end
|
data/Guardfile
CHANGED
@@ -7,28 +7,26 @@ directories(%w(lib spec))
|
|
7
7
|
## Uncomment to clear the screen before every task
|
8
8
|
# clearing :on
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
# * spring: 'bin/rspec' (This will use spring if running and you have
|
15
|
-
# installed the spring binstubs per the docs)
|
16
|
-
# * zeus: 'zeus rspec' (requires the server to be started separately)
|
17
|
-
# * 'just' rspec: 'rspec'
|
10
|
+
group :spec, halt_on_fail: true do
|
11
|
+
guard :rspec, cmd: 'bundle exec rspec' do
|
12
|
+
require 'guard/rspec/dsl'
|
13
|
+
dsl = Guard::RSpec::Dsl.new(self)
|
18
14
|
|
19
|
-
|
20
|
-
require "guard/rspec/dsl"
|
21
|
-
dsl = Guard::RSpec::Dsl.new(self)
|
15
|
+
# Feel free to open issues for suggestions and improvements
|
22
16
|
|
23
|
-
|
17
|
+
# RSpec files
|
18
|
+
rspec = dsl.rspec
|
19
|
+
watch(rspec.spec_helper) { rspec.spec_dir }
|
20
|
+
watch(rspec.spec_support) { rspec.spec_dir }
|
21
|
+
watch(rspec.spec_files)
|
24
22
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
watch(rspec.spec_files)
|
23
|
+
# Ruby files
|
24
|
+
ruby = dsl.ruby
|
25
|
+
dsl.watch_spec_files_for(ruby.lib_files)
|
26
|
+
end
|
30
27
|
|
31
|
-
|
32
|
-
|
33
|
-
|
28
|
+
guard :rubocop do
|
29
|
+
watch(/.+\.rb$/)
|
30
|
+
watch(/(?:.+\/)?\.rubocop(?:_todo)?\.yml$/) { |m| File.dirname(m[0]) }
|
31
|
+
end
|
34
32
|
end
|
data/README.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
[](https://travis-ci.org/e2/nenv)
|
2
|
+
[](http://badge.fury.io/rb/nenv)
|
3
|
+
[](https://gemnasium.com/e2/nenv)
|
4
|
+
[](https://codeclimate.com/github/e2/nenv)
|
5
|
+
[](https://coveralls.io/r/e2/nenv)
|
6
|
+
|
1
7
|
# Nenv
|
2
8
|
|
3
9
|
Using ENV in Ruby is like using raw SQL statements - it feels wrong, because it is.
|
@@ -16,6 +22,10 @@ If you agree, this gem is for you.
|
|
16
22
|
- strict mode saves you from doing validation yourself
|
17
23
|
- and there's more to come...
|
18
24
|
|
25
|
+
Other benefits (and compared to other solutions):
|
26
|
+
- should still work with Ruby 1.8 (in case anyone is still stuck with it)
|
27
|
+
- it's designed to be as lightweight and as fast as possible compared to ENV
|
28
|
+
- designed to be both hackable and convenient
|
19
29
|
|
20
30
|
## Installation
|
21
31
|
|
@@ -42,6 +52,7 @@ Or install it yourself as:
|
|
42
52
|
You no longer have to care whether the value is "0" or "false" or "no" or "FALSE" or ... whatever
|
43
53
|
|
44
54
|
```ruby
|
55
|
+
# Without Nenv
|
45
56
|
t.verbose = (ENV['CI'] == 'true')
|
46
57
|
ok = ENV['RUBYGEMS_GEMDEPS'] == "1" || ENV.key?('BUNDLE_GEMFILE']
|
47
58
|
ENV['DEBUG'] = "true"
|
@@ -59,6 +70,7 @@ Nenv.debug = true
|
|
59
70
|
### "Namespaces"
|
60
71
|
|
61
72
|
```ruby
|
73
|
+
# Without Nenv
|
62
74
|
puts ENV['GIT_BROWSER`]
|
63
75
|
puts ENV['GIT_PAGER`]
|
64
76
|
puts ENV['GIT_EDITOR`]
|
@@ -76,6 +88,7 @@ puts git.editor
|
|
76
88
|
### Custom type handling
|
77
89
|
|
78
90
|
```ruby
|
91
|
+
# Code without Nenv
|
79
92
|
paths = [ENV['GEM_HOME`]] + ENV['GEM_PATH'].split(':')
|
80
93
|
enable_logging if Integer(ENV['WEB_CONCURRENCY']) > 1
|
81
94
|
mydata = YAML.load(ENV['MY_DATA'])
|
@@ -108,10 +121,10 @@ Nenv.verbose = debug
|
|
108
121
|
### Automatic conversion to string
|
109
122
|
|
110
123
|
```ruby
|
111
|
-
ENV['RUBYGEMS_GEMDEPS'] = 1 # TypeError: no implicit conversion of Fixnum
|
124
|
+
ENV['RUBYGEMS_GEMDEPS'] = 1 # TypeError: no implicit conversion of Fixnum (...)
|
112
125
|
```
|
113
126
|
|
114
|
-
|
127
|
+
Nenv automatically uses `to_s`:
|
115
128
|
|
116
129
|
```ruby
|
117
130
|
Nenv.rubygems_gemdeps = 1 # no problem here
|
@@ -129,7 +142,7 @@ ENV['MY_DATA'] = YAML.dump(data)
|
|
129
142
|
can now become:
|
130
143
|
|
131
144
|
```ruby
|
132
|
-
my = Nenv
|
145
|
+
my = Nenv :my
|
133
146
|
my.instance.create_method(:data) { |d| YAML.load(d) }
|
134
147
|
my.instance.create_method(:data=) { |d| YAML.dump(d) }
|
135
148
|
|
@@ -141,6 +154,7 @@ my.data = data
|
|
141
154
|
### Strict mode
|
142
155
|
|
143
156
|
```ruby
|
157
|
+
# Without Nenv
|
144
158
|
fail 'home not allowed' if ENV['HOME'] = Dir.pwd # BUG! Assignment instead of comparing!
|
145
159
|
puts ENV['HOME'] # Now contains clobbered value
|
146
160
|
```
|
@@ -172,6 +186,21 @@ Nenv.path += Pathname.pwd + "foo"
|
|
172
186
|
|
173
187
|
```
|
174
188
|
|
189
|
+
### Your own class
|
190
|
+
|
191
|
+
```ruby
|
192
|
+
class MyEnv < Nenv::Environment
|
193
|
+
def initialize
|
194
|
+
super("my_env")
|
195
|
+
create_method(:foo?)
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
MyEnv.new.foo? # same as ENV['MY_ENV_FOO'][/^(?:false|no|n|0)/i,1].nil?
|
200
|
+
|
201
|
+
```
|
202
|
+
|
203
|
+
|
175
204
|
## NOTES
|
176
205
|
|
177
206
|
Still, avoid using environment variables if you can.
|
@@ -196,13 +225,13 @@ Well sure, having ENV act like a Hash is much better than calling "getenv".
|
|
196
225
|
|
197
226
|
Unfortunately, the advantages of using ENV make no sense:
|
198
227
|
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
228
|
+
- it's faster but ... environment variables are rarely used thousands of times in tight loops
|
229
|
+
- it's already an object ... but there's not much you can do with it (try ENV.class)
|
230
|
+
- it's globally available ... but you can't isolate it in tests (you need to reset it every time)
|
231
|
+
- you can use it to set variables ... but it's named like a const
|
232
|
+
- it allows you to use keys regardless of case ... but by convention lowercase shouldn't be used except for local variables (which are only really used by shell scripts)
|
233
|
+
- it's supposed to look ugly to discourage use ... but often your app/gem is forced to use them anyway
|
234
|
+
- it's a simple class ... but either you encapsulate it in your own classes - or all the value mapping/validation happens everywhere you want the data (yuck!)
|
206
235
|
|
207
236
|
|
208
237
|
But the BIGGEST disadvantage is in specs, e.g.:
|
data/Rakefile
CHANGED
@@ -1,8 +1,17 @@
|
|
1
|
-
require
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
|
3
|
+
require 'nenv'
|
2
4
|
|
3
5
|
default_tasks = []
|
4
6
|
|
5
|
-
require
|
6
|
-
default_tasks << RSpec::Core::RakeTask.new(:spec)
|
7
|
+
require 'rspec/core/rake_task'
|
8
|
+
default_tasks << RSpec::Core::RakeTask.new(:spec) do |t|
|
9
|
+
t.verbose = Nenv.ci?
|
10
|
+
end
|
11
|
+
|
12
|
+
unless Nenv.ci?
|
13
|
+
require 'rubocop/rake_task'
|
14
|
+
default_tasks << RuboCop::RakeTask.new(:rubocop)
|
15
|
+
end
|
7
16
|
|
8
17
|
task default: default_tasks.map(&:name)
|
data/lib/nenv.rb
CHANGED
data/lib/nenv/autoenvironment.rb
CHANGED
data/lib/nenv/environment.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'nenv/environment/dumper'
|
2
|
+
require 'nenv/environment/loader'
|
3
3
|
|
4
4
|
module Nenv
|
5
5
|
class Environment
|
@@ -14,7 +14,7 @@ module Nenv
|
|
14
14
|
|
15
15
|
class AlreadyExistsError < MethodError
|
16
16
|
def message
|
17
|
-
format(
|
17
|
+
format('Method %s already exists', @meth.inspect)
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
@@ -41,7 +41,7 @@ module Nenv
|
|
41
41
|
private
|
42
42
|
|
43
43
|
def _sanitize(meth)
|
44
|
-
meth[/^([^=?]*)[=?]?$/, 1].upcase
|
44
|
+
meth.to_s[/^([^=?]*)[=?]?$/, 1].upcase
|
45
45
|
end
|
46
46
|
end
|
47
47
|
end
|
@@ -2,7 +2,7 @@ module Nenv
|
|
2
2
|
class Environment
|
3
3
|
class Loader
|
4
4
|
def initialize(meth)
|
5
|
-
@bool = meth.to_s.end_with?(
|
5
|
+
@bool = meth.to_s.end_with?('?')
|
6
6
|
end
|
7
7
|
|
8
8
|
def load(raw_value, &callback)
|
@@ -16,9 +16,9 @@ module Nenv
|
|
16
16
|
case raw_value
|
17
17
|
when nil
|
18
18
|
nil
|
19
|
-
when
|
19
|
+
when ''
|
20
20
|
fail ArgumentError, "Can't convert empty string into Bool"
|
21
|
-
when
|
21
|
+
when '0', 'false', 'n', 'no', 'NO', 'FALSE'
|
22
22
|
false
|
23
23
|
else
|
24
24
|
true
|
data/lib/nenv/version.rb
CHANGED
data/nenv.gemspec
CHANGED
@@ -4,21 +4,21 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'nenv/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'nenv'
|
8
8
|
spec.version = Nenv::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
11
|
-
spec.summary =
|
12
|
-
spec.description =
|
13
|
-
spec.homepage =
|
14
|
-
spec.license =
|
9
|
+
spec.authors = ['Cezary Baginski']
|
10
|
+
spec.email = ['cezary@chronomantic.net']
|
11
|
+
spec.summary = "Convenience wrapper for Ruby's ENV"
|
12
|
+
spec.description = 'Using ENV is like using raw SQL statements in your code. Well all know how that ends...'
|
13
|
+
spec.homepage = 'https://github.com/e2/nenv'
|
14
|
+
spec.license = 'MIT'
|
15
15
|
|
16
16
|
spec.files = `git ls-files -z`.split("\x0")
|
17
|
-
spec.executables = spec.files.grep(
|
18
|
-
spec.test_files = spec.files.grep(
|
19
|
-
spec.require_paths = [
|
17
|
+
spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(/^(test|spec|features)\//)
|
19
|
+
spec.require_paths = ['lib']
|
20
20
|
|
21
|
-
spec.add_development_dependency
|
22
|
-
spec.add_development_dependency
|
23
|
-
spec.add_development_dependency
|
21
|
+
spec.add_development_dependency 'bundler', '~> 1.7'
|
22
|
+
spec.add_development_dependency 'rspec', '~> 3.1'
|
23
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
24
24
|
end
|
@@ -1,31 +1,31 @@
|
|
1
1
|
require 'yaml'
|
2
2
|
|
3
|
-
require
|
3
|
+
require 'nenv/environment/dumper'
|
4
4
|
|
5
5
|
RSpec.describe Nenv::Environment::Dumper do
|
6
6
|
subject { described_class.new.dump(value) }
|
7
7
|
|
8
8
|
context "with \"abc\"" do
|
9
|
-
let(:value) {
|
10
|
-
it { is_expected.to eq(
|
9
|
+
let(:value) { 'abc' }
|
10
|
+
it { is_expected.to eq('abc') }
|
11
11
|
end
|
12
12
|
|
13
|
-
context
|
13
|
+
context 'with 123' do
|
14
14
|
let(:value) { 123 }
|
15
|
-
it { is_expected.to eq(
|
15
|
+
it { is_expected.to eq('123') }
|
16
16
|
end
|
17
17
|
|
18
|
-
context
|
18
|
+
context 'with nil' do
|
19
19
|
let(:value) { nil }
|
20
20
|
it { is_expected.to eq(nil) }
|
21
21
|
end
|
22
22
|
|
23
|
-
context
|
23
|
+
context 'with a block' do
|
24
24
|
subject do
|
25
|
-
described_class.new.dump(value) { |data| YAML
|
25
|
+
described_class.new.dump(value) { |data| YAML.dump(data) }
|
26
26
|
end
|
27
27
|
|
28
|
-
context
|
28
|
+
context 'with a yaml string' do
|
29
29
|
let(:value) { { foo: 3 } }
|
30
30
|
let(:yaml) { "---\n:foo: 3\n" }
|
31
31
|
it { is_expected.to eq(yaml) }
|
@@ -1,20 +1,20 @@
|
|
1
1
|
require 'yaml'
|
2
|
-
require
|
2
|
+
require 'nenv/environment/loader'
|
3
3
|
|
4
4
|
RSpec.describe Nenv::Environment::Loader do
|
5
|
-
context
|
5
|
+
context 'with no block' do
|
6
6
|
subject { described_class.new(meth).load(value) }
|
7
7
|
|
8
|
-
context
|
8
|
+
context 'with a normal method' do
|
9
9
|
let(:meth) { :foo }
|
10
10
|
|
11
11
|
context "with \"abc\"" do
|
12
|
-
let(:value) {
|
13
|
-
it { is_expected.to eq(
|
12
|
+
let(:value) { 'abc' }
|
13
|
+
it { is_expected.to eq('abc') }
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
context
|
17
|
+
context 'with a bool method' do
|
18
18
|
let(:meth) { :foo? }
|
19
19
|
|
20
20
|
%w(1 true y yes TRUE YES foobar).each do |data|
|
@@ -31,13 +31,13 @@ RSpec.describe Nenv::Environment::Loader do
|
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
-
context
|
34
|
+
context 'with nil' do
|
35
35
|
let(:value) { nil }
|
36
36
|
it { is_expected.to eq(nil) }
|
37
37
|
end
|
38
38
|
|
39
|
-
context
|
40
|
-
let(:value) {
|
39
|
+
context 'when empty string' do
|
40
|
+
let(:value) { '' }
|
41
41
|
it do
|
42
42
|
expect { subject }.to raise_error(
|
43
43
|
ArgumentError, /Can't convert empty string into Bool/
|
@@ -47,13 +47,13 @@ RSpec.describe Nenv::Environment::Loader do
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
context
|
50
|
+
context 'with a block' do
|
51
51
|
subject do
|
52
|
-
described_class.new(:foo).load(value) { |data| YAML
|
52
|
+
described_class.new(:foo).load(value) { |data| YAML.load(data) }
|
53
53
|
end
|
54
|
-
context
|
54
|
+
context 'with a yaml string' do
|
55
55
|
let(:value) { "--- foo\n...\n" }
|
56
|
-
it { is_expected.to eq(
|
56
|
+
it { is_expected.to eq('foo') }
|
57
57
|
end
|
58
58
|
end
|
59
59
|
end
|
@@ -1,13 +1,12 @@
|
|
1
|
-
require
|
1
|
+
require 'yaml'
|
2
2
|
|
3
|
-
require
|
3
|
+
require 'nenv/environment'
|
4
4
|
|
5
5
|
RSpec.describe Nenv::Environment do
|
6
6
|
let(:env) { instance_double(Hash) } # a hash is close enough
|
7
|
-
before(:each) { stub_const(
|
8
|
-
|
9
|
-
context "without integration" do
|
7
|
+
before(:each) { stub_const('ENV', env) }
|
10
8
|
|
9
|
+
context 'without integration' do
|
11
10
|
let(:dumper) { instance_double(described_class::Dumper) }
|
12
11
|
let(:loader) { instance_double(described_class::Loader) }
|
13
12
|
|
@@ -16,27 +15,27 @@ RSpec.describe Nenv::Environment do
|
|
16
15
|
allow(described_class::Loader).to receive(:new).and_return(loader)
|
17
16
|
end
|
18
17
|
|
19
|
-
context
|
18
|
+
context 'with no namespace' do
|
20
19
|
let(:instance) { described_class.new }
|
21
20
|
|
22
|
-
context
|
21
|
+
context 'with an existing method' do
|
23
22
|
before do
|
24
23
|
subject.create_method(:foo?)
|
25
24
|
end
|
26
25
|
|
27
|
-
it
|
28
|
-
expect(ENV).to receive(:[]).with(
|
29
|
-
expect(loader).to receive(:load).with(
|
26
|
+
it 'uses the name as full key' do
|
27
|
+
expect(ENV).to receive(:[]).with('FOO').and_return('true')
|
28
|
+
expect(loader).to receive(:load).with('true').and_return(true)
|
30
29
|
expect(subject.foo?).to eq(true)
|
31
30
|
end
|
32
31
|
end
|
33
32
|
end
|
34
33
|
|
35
|
-
context
|
36
|
-
let(:namespace) {
|
34
|
+
context 'with any namespace' do
|
35
|
+
let(:namespace) { 'bar' }
|
37
36
|
let(:instance) { described_class.new(namespace) }
|
38
37
|
|
39
|
-
describe
|
38
|
+
describe 'creating a method' do
|
40
39
|
subject { instance }
|
41
40
|
|
42
41
|
before do
|
@@ -45,9 +44,9 @@ RSpec.describe Nenv::Environment do
|
|
45
44
|
|
46
45
|
it { is_expected.to respond_to(:foo) }
|
47
46
|
|
48
|
-
context
|
47
|
+
context 'when the method already exists' do
|
49
48
|
let(:error) { described_class::AlreadyExistsError }
|
50
|
-
let(:message) {
|
49
|
+
let(:message) { 'Method :foo already exists' }
|
51
50
|
specify do
|
52
51
|
expect do
|
53
52
|
subject.create_method(:foo)
|
@@ -56,53 +55,52 @@ RSpec.describe Nenv::Environment do
|
|
56
55
|
end
|
57
56
|
end
|
58
57
|
|
59
|
-
describe
|
58
|
+
describe 'calling' do
|
60
59
|
subject { instance }
|
61
60
|
|
62
|
-
context
|
61
|
+
context 'when method does not exist' do
|
63
62
|
let(:error) { NoMethodError }
|
64
63
|
let(:message) { /undefined method `foo' for/ }
|
65
64
|
it { expect { subject.foo }.to raise_error(error, message) }
|
66
65
|
end
|
67
66
|
|
68
|
-
context
|
69
|
-
|
70
|
-
context "with no block" do
|
67
|
+
context 'with a reader method' do
|
68
|
+
context 'with no block' do
|
71
69
|
before { instance.create_method(meth) }
|
72
70
|
|
73
|
-
context
|
71
|
+
context 'with a normal method' do
|
74
72
|
let(:meth) { :foo }
|
75
73
|
before do
|
76
|
-
allow(loader).to receive(:load).with(
|
74
|
+
allow(loader).to receive(:load).with('123').and_return(123)
|
77
75
|
end
|
78
76
|
|
79
|
-
it
|
80
|
-
expect(ENV).to receive(:[]).with(
|
77
|
+
it 'returns unmarshalled stored value' do
|
78
|
+
expect(ENV).to receive(:[]).with('BAR_FOO').and_return('123')
|
81
79
|
expect(subject.foo).to eq 123
|
82
80
|
end
|
83
81
|
end
|
84
82
|
|
85
|
-
context
|
83
|
+
context 'with a bool method' do
|
86
84
|
let(:meth) { :foo? }
|
87
85
|
|
88
|
-
it
|
89
|
-
allow(loader).to receive(:load).with(
|
90
|
-
expect(ENV).to receive(:[]).with(
|
86
|
+
it 'references the proper ENV variable' do
|
87
|
+
allow(loader).to receive(:load).with('false').and_return(false)
|
88
|
+
expect(ENV).to receive(:[]).with('BAR_FOO').and_return('false')
|
91
89
|
expect(subject.foo?).to eq false
|
92
90
|
end
|
93
91
|
end
|
94
92
|
end
|
95
93
|
|
96
|
-
context
|
94
|
+
context 'with a block' do
|
97
95
|
before do
|
98
|
-
instance.create_method(:foo) { |data| YAML
|
96
|
+
instance.create_method(:foo) { |data| YAML.load(data) }
|
99
97
|
end
|
100
98
|
|
101
99
|
let(:value) { "---\n:foo: 5\n" }
|
102
100
|
|
103
|
-
it
|
104
|
-
allow(ENV).to receive(:[]).with(
|
105
|
-
and_return(value)
|
101
|
+
it 'unmarshals using the block' do
|
102
|
+
allow(ENV).to receive(:[]).with('BAR_FOO')
|
103
|
+
.and_return(value)
|
106
104
|
|
107
105
|
allow(loader).to receive(:load).with(value) do |arg, &block|
|
108
106
|
expect(block).to be
|
@@ -112,43 +110,42 @@ RSpec.describe Nenv::Environment do
|
|
112
110
|
expect(subject.foo).to eq(foo: 5)
|
113
111
|
end
|
114
112
|
end
|
115
|
-
|
116
113
|
end
|
117
114
|
|
118
|
-
context
|
115
|
+
context 'with a writer method' do
|
119
116
|
before { instance.create_method(:foo=) }
|
120
117
|
|
121
|
-
it
|
122
|
-
expect(ENV).to receive(:[]=).with(
|
123
|
-
allow(dumper).to receive(:dump).with(123).and_return(
|
118
|
+
it 'set the environment variable' do
|
119
|
+
expect(ENV).to receive(:[]=).with('BAR_FOO', '123')
|
120
|
+
allow(dumper).to receive(:dump).with(123).and_return('123')
|
124
121
|
subject.foo = 123
|
125
122
|
end
|
126
123
|
|
127
|
-
it
|
128
|
-
expect(ENV).to receive(:[]=).with(
|
129
|
-
allow(dumper).to receive(:dump).with(123).and_return(
|
124
|
+
it 'marshals and stores the value' do
|
125
|
+
expect(ENV).to receive(:[]=).with('BAR_FOO', '123')
|
126
|
+
allow(dumper).to receive(:dump).with(123).and_return('123')
|
130
127
|
subject.foo = 123
|
131
128
|
end
|
132
129
|
end
|
133
130
|
|
134
|
-
context
|
131
|
+
context 'with a method containing underscores' do
|
135
132
|
before { instance.create_method(:foo_baz) }
|
136
|
-
it
|
137
|
-
expect(ENV).to receive(:[]).with(
|
138
|
-
allow(loader).to receive(:load).with(
|
133
|
+
it 'reads the correct variable' do
|
134
|
+
expect(ENV).to receive(:[]).with('BAR_FOO_BAZ').and_return('123')
|
135
|
+
allow(loader).to receive(:load).with('123').and_return(123)
|
139
136
|
subject.foo_baz
|
140
137
|
end
|
141
138
|
end
|
142
139
|
|
143
|
-
context
|
140
|
+
context 'with a block' do
|
144
141
|
before do
|
145
|
-
instance.create_method(:foo=) { |data| YAML
|
142
|
+
instance.create_method(:foo=) { |data| YAML.dump(data) }
|
146
143
|
end
|
147
144
|
|
148
145
|
let(:result) { "---\n:foo: 5\n" }
|
149
146
|
|
150
|
-
it
|
151
|
-
allow(ENV).to receive(:[]=).with(
|
147
|
+
it 'marshals using the block' do
|
148
|
+
allow(ENV).to receive(:[]=).with('BAR_FOO', result)
|
152
149
|
|
153
150
|
allow(dumper).to receive(:dump).with(foo: 5) do |arg, &block|
|
154
151
|
expect(block).to be
|
@@ -159,60 +156,60 @@ RSpec.describe Nenv::Environment do
|
|
159
156
|
end
|
160
157
|
end
|
161
158
|
|
162
|
-
context
|
159
|
+
context 'with an unsanitized name' do
|
163
160
|
pending
|
164
161
|
end
|
165
162
|
end
|
166
163
|
end
|
167
164
|
end
|
168
165
|
|
169
|
-
describe
|
170
|
-
context
|
171
|
-
let(:namespace) {
|
166
|
+
describe 'with integration' do
|
167
|
+
context 'with any namespace' do
|
168
|
+
let(:namespace) { 'baz' }
|
172
169
|
let(:instance) { described_class.new(namespace) }
|
173
170
|
subject { instance }
|
174
171
|
|
175
|
-
context
|
176
|
-
context
|
172
|
+
context 'with a reader method' do
|
173
|
+
context 'with no block' do
|
177
174
|
before { instance.create_method(:foo) }
|
178
175
|
|
179
|
-
it
|
180
|
-
allow(ENV).to receive(:[]).with(
|
181
|
-
expect(subject.foo).to eq
|
176
|
+
it 'returns the stored value' do
|
177
|
+
allow(ENV).to receive(:[]).with('BAZ_FOO').and_return('123')
|
178
|
+
expect(subject.foo).to eq '123'
|
182
179
|
end
|
183
180
|
end
|
184
181
|
|
185
|
-
context
|
182
|
+
context 'with a block' do
|
186
183
|
before do
|
187
|
-
instance.create_method(:foo) { |data| YAML
|
184
|
+
instance.create_method(:foo) { |data| YAML.load(data) }
|
188
185
|
end
|
189
186
|
|
190
|
-
it
|
191
|
-
expect(ENV).to receive(:[]).with(
|
192
|
-
and_return("---\n:foo: 5\n")
|
187
|
+
it 'unmarshals the value' do
|
188
|
+
expect(ENV).to receive(:[]).with('BAZ_FOO')
|
189
|
+
.and_return("---\n:foo: 5\n")
|
193
190
|
|
194
191
|
expect(subject.foo).to eq(foo: 5)
|
195
192
|
end
|
196
193
|
end
|
197
194
|
end
|
198
195
|
|
199
|
-
context
|
200
|
-
context
|
196
|
+
context 'with a writer method' do
|
197
|
+
context 'with no block' do
|
201
198
|
before { instance.create_method(:foo=) }
|
202
199
|
|
203
|
-
it
|
204
|
-
expect(ENV).to receive(:[]=).with(
|
200
|
+
it 'marshals and stores the value' do
|
201
|
+
expect(ENV).to receive(:[]=).with('BAZ_FOO', '123')
|
205
202
|
subject.foo = 123
|
206
203
|
end
|
207
204
|
end
|
208
205
|
|
209
|
-
context
|
206
|
+
context 'with a block' do
|
210
207
|
before do
|
211
|
-
instance.create_method(:foo=) { |data| YAML
|
208
|
+
instance.create_method(:foo=) { |data| YAML.dump(data) }
|
212
209
|
end
|
213
210
|
|
214
|
-
it
|
215
|
-
expect(ENV).to receive(:[]=).with(
|
211
|
+
it 'nmarshals the value' do
|
212
|
+
expect(ENV).to receive(:[]=).with('BAZ_FOO', "---\n:foo: 5\n")
|
216
213
|
|
217
214
|
subject.foo = { foo: 5 }
|
218
215
|
end
|
data/spec/lib/nenv_spec.rb
CHANGED
@@ -1,51 +1,51 @@
|
|
1
|
-
require
|
1
|
+
require 'nenv'
|
2
2
|
|
3
3
|
RSpec.describe Nenv do
|
4
4
|
let(:env) { instance_double(Hash) } # Hash is close enough
|
5
|
-
before { stub_const(
|
5
|
+
before { stub_const('ENV', env) }
|
6
6
|
|
7
|
-
describe
|
8
|
-
it
|
7
|
+
describe 'Nenv() helper method' do
|
8
|
+
it 'reads from env' do
|
9
9
|
expect(ENV).to receive(:[]).with('GIT_BROWSER').and_return('chrome')
|
10
10
|
Nenv('git').browser
|
11
11
|
end
|
12
12
|
|
13
|
-
it
|
13
|
+
it 'return the value from env' do
|
14
14
|
allow(ENV).to receive(:[]).with('GIT_BROWSER').and_return('firefox')
|
15
15
|
expect(Nenv('git').browser).to eq('firefox')
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
describe
|
20
|
-
it
|
19
|
+
describe 'Nenv() module' do
|
20
|
+
it 'reads from env' do
|
21
21
|
expect(ENV).to receive(:[]).with('CI').and_return('true')
|
22
22
|
Nenv.ci?
|
23
23
|
end
|
24
24
|
|
25
|
-
it
|
25
|
+
it 'return the value from env' do
|
26
26
|
allow(ENV).to receive(:[]).with('CI').and_return('false')
|
27
27
|
expect(Nenv.ci?).to be(false)
|
28
28
|
end
|
29
29
|
|
30
|
-
context
|
31
|
-
it
|
30
|
+
context 'with no method' do
|
31
|
+
it 'automatically creates the method' do
|
32
32
|
expect(ENV).to receive(:[]).with('FOO').and_return('true')
|
33
33
|
Nenv.foo?
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
context
|
37
|
+
context 'with existing method' do
|
38
38
|
before do
|
39
39
|
Nenv.instance.create_method(:foo?)
|
40
40
|
end
|
41
41
|
|
42
|
-
it
|
43
|
-
expect(ENV).to receive(:[]).with('FOO').and_return(
|
42
|
+
it 'reads from env' do
|
43
|
+
expect(ENV).to receive(:[]).with('FOO').and_return('true')
|
44
44
|
Nenv.foo?
|
45
45
|
end
|
46
46
|
|
47
|
-
it
|
48
|
-
expect(ENV).to receive(:[]).with('FOO').and_return(
|
47
|
+
it 'return the value from env' do
|
48
|
+
expect(ENV).to receive(:[]).with('FOO').and_return('true')
|
49
49
|
expect(Nenv.foo?).to be(true)
|
50
50
|
end
|
51
51
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'coveralls'
|
2
|
+
Coveralls.wear!
|
3
|
+
|
1
4
|
RSpec.configure do |config|
|
2
5
|
config.expect_with :rspec do |expectations|
|
3
6
|
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
@@ -14,9 +17,7 @@ RSpec.configure do |config|
|
|
14
17
|
|
15
18
|
# config.warnings = true
|
16
19
|
|
17
|
-
if config.files_to_run.one?
|
18
|
-
config.default_formatter = 'doc'
|
19
|
-
end
|
20
|
+
config.default_formatter = 'doc' if config.files_to_run.one?
|
20
21
|
|
21
22
|
# config.profile_examples = 10
|
22
23
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nenv
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cezary Baginski
|
@@ -62,6 +62,9 @@ extra_rdoc_files: []
|
|
62
62
|
files:
|
63
63
|
- ".gitignore"
|
64
64
|
- ".rspec"
|
65
|
+
- ".rubocop.yml"
|
66
|
+
- ".rubocop_todo.yml"
|
67
|
+
- ".travis.yml"
|
65
68
|
- Gemfile
|
66
69
|
- Guardfile
|
67
70
|
- LICENSE.txt
|
@@ -79,7 +82,7 @@ files:
|
|
79
82
|
- spec/lib/nenv/environment_spec.rb
|
80
83
|
- spec/lib/nenv_spec.rb
|
81
84
|
- spec/spec_helper.rb
|
82
|
-
homepage:
|
85
|
+
homepage: https://github.com/e2/nenv
|
83
86
|
licenses:
|
84
87
|
- MIT
|
85
88
|
metadata: {}
|