climate_control 0.0.3 → 1.0.1
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 +7 -0
- data/.github/workflows/ci.yml +23 -0
- data/.gitignore +1 -0
- data/CODE_OF_CONDUCT.md +6 -0
- data/Gemfile +1 -1
- data/{LICENSE.txt → LICENSE} +1 -1
- data/NEWS +20 -0
- data/README.md +34 -3
- data/Rakefile +2 -2
- data/climate_control.gemspec +19 -18
- data/lib/climate_control.rb +11 -3
- data/lib/climate_control/environment.rb +33 -0
- data/lib/climate_control/errors.rb +3 -0
- data/lib/climate_control/modifier.rb +18 -10
- data/lib/climate_control/version.rb +1 -1
- data/spec/acceptance/climate_control_spec.rb +156 -7
- data/spec/spec_helper.rb +10 -8
- metadata +40 -50
- data/.travisci.yml +0 -9
- data/spec/lib/climate_control/modifier_spec.rb +0 -83
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: aac4a1d4fe272e5369855d9d80c8bfd764b752f27d1bdfad2b19a607d5f0a44e
|
4
|
+
data.tar.gz: 8945986d5956f681810ef8a5f164323a3cd2a48e82368618c292f3c6fc7a6caa
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c36a6b4ead29b23f93c95457e56f6bc3fd6c5cd596f66fe8243e736edcc5a11cfe9fd5fe62b1cf5fc8cd0c7f4fe72c051c0560338a6496e30c56b3cf095c92ec
|
7
|
+
data.tar.gz: cbdf93ff0a149ef67129db0ac0f25838f02c7d2faf6dea87f8ce0acaf54848fb129f4d1b8cbf0ad40c50358cd2186e5a726b2fed5d82fbc9de2c765f4a9bf94d
|
@@ -0,0 +1,23 @@
|
|
1
|
+
name: CI
|
2
|
+
on: [pull_request]
|
3
|
+
jobs:
|
4
|
+
tests:
|
5
|
+
name: Tests
|
6
|
+
runs-on: ubuntu-latest
|
7
|
+
strategy:
|
8
|
+
matrix:
|
9
|
+
ruby-version: ['3.0', 2.7, 2.6, 2.5]
|
10
|
+
steps:
|
11
|
+
- uses: actions/checkout@v2
|
12
|
+
- name: Set up Ruby ${{ matrix.ruby-version }}
|
13
|
+
uses: ruby/setup-ruby@v1
|
14
|
+
with:
|
15
|
+
ruby-version: ${{ matrix.ruby-version }}
|
16
|
+
- name: Install gems
|
17
|
+
run: |
|
18
|
+
bundle config path vendor/bundle
|
19
|
+
bundle install --jobs 4 --retry 3
|
20
|
+
- name: Run tests
|
21
|
+
run: bundle exec rake
|
22
|
+
- name: Run StandardRB
|
23
|
+
run: bundle exec standardrb
|
data/.gitignore
CHANGED
data/CODE_OF_CONDUCT.md
ADDED
data/Gemfile
CHANGED
data/{LICENSE.txt → LICENSE}
RENAMED
data/NEWS
CHANGED
@@ -1,2 +1,22 @@
|
|
1
|
+
1.0.1 (May 26, 2021)
|
2
|
+
Require minimum Ruby version of 2.5.0
|
3
|
+
|
4
|
+
1.0.0 (March 6, 2021)
|
5
|
+
Commit to supporting latest patch versions of Ruby 2.5+
|
6
|
+
Improve documentation
|
7
|
+
Format code with StandardRB
|
8
|
+
Bump gem dependencies
|
9
|
+
|
10
|
+
0.2.0 (May 12, 2017)
|
11
|
+
Allow nested environment changes in the same thread
|
12
|
+
|
13
|
+
0.1.0 (January 7, 2017)
|
14
|
+
Remove ActiveSupport dependency
|
15
|
+
|
16
|
+
0.0.4 (January 6, 2017)
|
17
|
+
Improved thread safety
|
18
|
+
Handle TypeErrors during assignment
|
19
|
+
Improve documentation
|
20
|
+
|
1
21
|
0.0.1 (November 28, 2012)
|
2
22
|
Initial release
|
data/README.md
CHANGED
@@ -18,14 +18,30 @@ Or install it yourself as:
|
|
18
18
|
|
19
19
|
## Usage
|
20
20
|
|
21
|
-
|
21
|
+
Climate Control can be used to temporarily assign environment variables
|
22
22
|
within a block:
|
23
23
|
|
24
24
|
```ruby
|
25
25
|
ClimateControl.modify CONFIRMATION_INSTRUCTIONS_BCC: 'confirmation_bcc@example.com' do
|
26
26
|
sign_up_as 'john@example.com'
|
27
|
+
|
28
|
+
confirm_account_for_email 'john@example.com'
|
29
|
+
|
30
|
+
expect(current_email).to bcc_to('confirmation_bcc@example.com')
|
31
|
+
end
|
32
|
+
```
|
33
|
+
|
34
|
+
To modify multiple environment variables:
|
35
|
+
|
36
|
+
```ruby
|
37
|
+
ClimateControl.modify CONFIRMATION_INSTRUCTIONS_BCC: 'confirmation_bcc@example.com',
|
38
|
+
MAIL_FROM: 'us@example.com' do
|
39
|
+
sign_up_as 'john@example.com'
|
40
|
+
|
27
41
|
confirm_account_for_email 'john@example.com'
|
28
|
-
|
42
|
+
|
43
|
+
expect(current_email).to bcc_to('confirmation_bcc@example.com')
|
44
|
+
expect(current_email).to be_from('us@example.com')
|
29
45
|
end
|
30
46
|
```
|
31
47
|
|
@@ -76,6 +92,19 @@ block, except for the overrides. Transparency is crucial because the code
|
|
76
92
|
executed within the block is not for `ClimateControl` to manage or modify. See
|
77
93
|
the tests for more detail about the specific behaviors.
|
78
94
|
|
95
|
+
## Why Use Climate Control?
|
96
|
+
|
97
|
+
By following guidelines regarding environment variables outlined by the
|
98
|
+
[twelve-factor app](http://12factor.net/config), testing code in an isolated
|
99
|
+
manner becomes more difficult:
|
100
|
+
|
101
|
+
* avoiding modifications and testing values, we introduce mystery guests
|
102
|
+
* making modifications and testing values, we introduce risk as environment
|
103
|
+
variables represent global state
|
104
|
+
|
105
|
+
Climate Control modifies environment variables only within the context of the
|
106
|
+
block, ensuring values are managed properly and consistently.
|
107
|
+
|
79
108
|
## Contributing
|
80
109
|
|
81
110
|
1. Fork it
|
@@ -84,6 +113,8 @@ the tests for more detail about the specific behaviors.
|
|
84
113
|
4. Push to the branch (`git push origin my-new-feature`)
|
85
114
|
5. Create new Pull Request
|
86
115
|
|
116
|
+
This project uses [StandardRB](https://github.com/testdouble/standard) to ensure formatting.
|
117
|
+
|
87
118
|
## License
|
88
119
|
|
89
|
-
climate_control is copyright 2012 Joshua Clayton and thoughtbot, inc. It is free software and may be redistributed under the terms specified in the LICENSE.
|
120
|
+
climate_control is copyright 2012-2021 Joshua Clayton and thoughtbot, inc. It is free software and may be redistributed under the terms specified in the [LICENSE](https://github.com/thoughtbot/climate_control/blob/main/LICENSE) file.
|
data/Rakefile
CHANGED
data/climate_control.gemspec
CHANGED
@@ -1,24 +1,25 @@
|
|
1
|
-
|
2
|
-
lib = File.expand_path('../lib', __FILE__)
|
1
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
3
|
+
require "climate_control/version"
|
5
4
|
|
6
5
|
Gem::Specification.new do |gem|
|
7
|
-
gem.name
|
8
|
-
gem.version
|
9
|
-
gem.authors
|
10
|
-
gem.email
|
11
|
-
gem.description
|
12
|
-
gem.summary
|
13
|
-
gem.homepage
|
6
|
+
gem.name = "climate_control"
|
7
|
+
gem.version = ClimateControl::VERSION
|
8
|
+
gem.authors = ["Joshua Clayton"]
|
9
|
+
gem.email = ["joshua.clayton@gmail.com"]
|
10
|
+
gem.description = "Modify your ENV"
|
11
|
+
gem.summary = "Modify your ENV easily with ClimateControl"
|
12
|
+
gem.homepage = "https://github.com/thoughtbot/climate_control"
|
13
|
+
gem.license = "MIT"
|
14
14
|
|
15
|
-
gem.files
|
16
|
-
gem.
|
17
|
-
gem.
|
18
|
-
gem.require_paths = ['lib']
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
17
|
+
gem.require_paths = ["lib"]
|
19
18
|
|
20
|
-
gem.
|
21
|
-
|
22
|
-
gem.add_development_dependency
|
23
|
-
gem.add_development_dependency
|
19
|
+
gem.required_ruby_version = ">= 2.5.0"
|
20
|
+
|
21
|
+
gem.add_development_dependency "rspec", "~> 3.10.0"
|
22
|
+
gem.add_development_dependency "rake", "~> 12.3.3"
|
23
|
+
gem.add_development_dependency "simplecov", "~> 0.9.1"
|
24
|
+
gem.add_development_dependency "standard", "~> 1.0.0"
|
24
25
|
end
|
data/lib/climate_control.rb
CHANGED
@@ -1,8 +1,16 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "climate_control/environment"
|
2
|
+
require "climate_control/errors"
|
3
|
+
require "climate_control/modifier"
|
4
|
+
require "climate_control/version"
|
3
5
|
|
4
6
|
module ClimateControl
|
7
|
+
@@env = ClimateControl::Environment.new
|
8
|
+
|
5
9
|
def self.modify(environment_overrides, &block)
|
6
|
-
Modifier.new(environment_overrides, &block).process
|
10
|
+
Modifier.new(env, environment_overrides, &block).process
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.env
|
14
|
+
@@env
|
7
15
|
end
|
8
16
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require "forwardable"
|
2
|
+
|
3
|
+
module ClimateControl
|
4
|
+
class Environment
|
5
|
+
extend Forwardable
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@semaphore = Mutex.new
|
9
|
+
@owner = nil
|
10
|
+
end
|
11
|
+
|
12
|
+
def_delegators :env, :[]=, :to_hash, :[], :delete
|
13
|
+
|
14
|
+
def synchronize
|
15
|
+
if @owner == Thread.current
|
16
|
+
return yield if block_given?
|
17
|
+
end
|
18
|
+
|
19
|
+
@semaphore.synchronize do
|
20
|
+
@owner = Thread.current
|
21
|
+
yield if block_given?
|
22
|
+
ensure
|
23
|
+
@owner = nil
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def env
|
30
|
+
ENV
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -1,14 +1,13 @@
|
|
1
|
-
require 'active_support/core_ext/hash/keys'
|
2
|
-
|
3
1
|
module ClimateControl
|
4
2
|
class Modifier
|
5
|
-
def initialize(environment_overrides = {}, &block)
|
6
|
-
@environment_overrides = environment_overrides
|
3
|
+
def initialize(env, environment_overrides = {}, &block)
|
4
|
+
@environment_overrides = stringify_keys(environment_overrides)
|
7
5
|
@block = block
|
6
|
+
@env = env
|
8
7
|
end
|
9
8
|
|
10
9
|
def process
|
11
|
-
|
10
|
+
@env.synchronize do
|
12
11
|
prepare_environment_for_block
|
13
12
|
run_block
|
14
13
|
ensure
|
@@ -32,7 +31,10 @@ module ClimateControl
|
|
32
31
|
|
33
32
|
def copy_overrides_to_environment
|
34
33
|
@environment_overrides.each do |key, value|
|
35
|
-
|
34
|
+
@env[key] = value
|
35
|
+
rescue TypeError => e
|
36
|
+
raise UnassignableValueError,
|
37
|
+
"attempted to assign #{value} to #{key} but failed (#{e.message})"
|
36
38
|
end
|
37
39
|
end
|
38
40
|
|
@@ -49,22 +51,28 @@ module ClimateControl
|
|
49
51
|
end
|
50
52
|
|
51
53
|
def delete_keys_that_do_not_belong
|
52
|
-
(keys_to_remove - keys_changed_by_block).each {|key|
|
54
|
+
(keys_to_remove - keys_changed_by_block).each { |key| @env.delete(key) }
|
53
55
|
end
|
54
56
|
|
55
57
|
def revert_changed_keys
|
56
58
|
(@original_env.keys - keys_changed_by_block).each do |key|
|
57
|
-
|
59
|
+
@env[key] = @original_env[key]
|
58
60
|
end
|
59
61
|
end
|
60
62
|
|
61
63
|
def clone_environment
|
62
|
-
|
64
|
+
@env.to_hash
|
65
|
+
end
|
66
|
+
|
67
|
+
def stringify_keys(env)
|
68
|
+
env.each_with_object({}) do |(key, value), hash|
|
69
|
+
hash[key.to_s] = value
|
70
|
+
end
|
63
71
|
end
|
64
72
|
|
65
73
|
class OverlappingKeysWithChangedValues
|
66
74
|
def initialize(hash_1, hash_2)
|
67
|
-
@hash_1 = hash_1
|
75
|
+
@hash_1 = hash_1 || {}
|
68
76
|
@hash_2 = hash_2
|
69
77
|
end
|
70
78
|
|
@@ -1,14 +1,163 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
Thing = Class.new
|
4
|
+
|
5
|
+
describe "Climate control" do
|
6
|
+
it "allows modification of the environment" do
|
5
7
|
block_run = false
|
6
|
-
ClimateControl.modify FOO:
|
7
|
-
expect(ENV[
|
8
|
+
ClimateControl.modify FOO: "bar" do
|
9
|
+
expect(ENV["FOO"]).to eq "bar"
|
8
10
|
block_run = true
|
9
11
|
end
|
10
12
|
|
11
|
-
expect(ENV[
|
12
|
-
expect(block_run).to
|
13
|
+
expect(ENV["FOO"]).to be_nil
|
14
|
+
expect(block_run).to be true
|
15
|
+
end
|
16
|
+
|
17
|
+
it "modifies the environment" do
|
18
|
+
with_modified_env VARIABLE_1: "bar", VARIABLE_2: "qux" do
|
19
|
+
expect(ENV["VARIABLE_1"]).to eq "bar"
|
20
|
+
expect(ENV["VARIABLE_2"]).to eq "qux"
|
21
|
+
end
|
22
|
+
|
23
|
+
expect(ENV["VARIABLE_1"]).to be_nil
|
24
|
+
expect(ENV["VARIABLE_2"]).to be_nil
|
25
|
+
end
|
26
|
+
|
27
|
+
it "allows for environment variables to be assigned within the block" do
|
28
|
+
with_modified_env VARIABLE_1: "modified" do
|
29
|
+
ENV["ASSIGNED_IN_BLOCK"] = "assigned"
|
30
|
+
end
|
31
|
+
|
32
|
+
expect(ENV["ASSIGNED_IN_BLOCK"]).to eq "assigned"
|
33
|
+
end
|
34
|
+
|
35
|
+
it "reassigns previously set environment variables" do
|
36
|
+
ENV["VARIABLE_ASSIGNED_BEFORE_MODIFYING_ENV"] = "original"
|
37
|
+
expect(ENV["VARIABLE_ASSIGNED_BEFORE_MODIFYING_ENV"]).to eq "original"
|
38
|
+
|
39
|
+
with_modified_env VARIABLE_ASSIGNED_BEFORE_MODIFYING_ENV: "overridden" do
|
40
|
+
expect(ENV["VARIABLE_ASSIGNED_BEFORE_MODIFYING_ENV"]).to eq "overridden"
|
41
|
+
end
|
42
|
+
|
43
|
+
expect(ENV["VARIABLE_ASSIGNED_BEFORE_MODIFYING_ENV"]).to eq "original"
|
44
|
+
end
|
45
|
+
|
46
|
+
it "persists the change when overriding the variable in the block" do
|
47
|
+
with_modified_env VARIABLE_MODIFIED_AND_THEN_ASSIGNED: "modified" do
|
48
|
+
ENV["VARIABLE_MODIFIED_AND_THEN_ASSIGNED"] = "assigned value"
|
49
|
+
end
|
50
|
+
|
51
|
+
expect(ENV["VARIABLE_MODIFIED_AND_THEN_ASSIGNED"]).to eq "assigned value"
|
52
|
+
end
|
53
|
+
|
54
|
+
it "resets environment variables even if the block raises" do
|
55
|
+
expect {
|
56
|
+
with_modified_env FOO: "bar" do
|
57
|
+
raise "broken"
|
58
|
+
end
|
59
|
+
}.to raise_error("broken")
|
60
|
+
|
61
|
+
expect(ENV["FOO"]).to be_nil
|
62
|
+
end
|
63
|
+
|
64
|
+
it "preserves environment variables set within the block" do
|
65
|
+
ENV["CHANGED"] = "old value"
|
66
|
+
|
67
|
+
with_modified_env IRRELEVANT: "ignored value" do
|
68
|
+
ENV["CHANGED"] = "new value"
|
69
|
+
end
|
70
|
+
|
71
|
+
expect(ENV["CHANGED"]).to eq "new value"
|
72
|
+
end
|
73
|
+
|
74
|
+
it "returns the value of the block" do
|
75
|
+
value = with_modified_env VARIABLE_1: "bar" do
|
76
|
+
"value inside block"
|
77
|
+
end
|
78
|
+
|
79
|
+
expect(value).to eq "value inside block"
|
80
|
+
end
|
81
|
+
|
82
|
+
it "handles threads correctly" do
|
83
|
+
# failure path without mutex
|
84
|
+
# [thread_removing_env] BAZ is assigned
|
85
|
+
# 0.25s passes
|
86
|
+
# [other_thread] FOO is assigned and ENV is copied (which includes BAZ)
|
87
|
+
# 0.25s passes
|
88
|
+
# [thread_removing_env] thread resolves and BAZ is removed from env; other_thread still retains knowledge of BAZ
|
89
|
+
# 0.25s passes
|
90
|
+
# [other_thread] thread resolves, FOO is removed, BAZ is copied back to ENV
|
91
|
+
|
92
|
+
thread_removing_env = Thread.new {
|
93
|
+
with_modified_env BAZ: "buzz" do
|
94
|
+
sleep 0.5
|
95
|
+
end
|
96
|
+
|
97
|
+
expect(ENV["BAZ"]).to be_nil
|
98
|
+
}
|
99
|
+
|
100
|
+
other_thread = Thread.new {
|
101
|
+
sleep 0.25
|
102
|
+
with_modified_env FOO: "bar" do
|
103
|
+
sleep 0.5
|
104
|
+
end
|
105
|
+
|
106
|
+
expect(ENV["FOO"]).to be_nil
|
107
|
+
}
|
108
|
+
|
109
|
+
thread_removing_env.join
|
110
|
+
other_thread.join
|
111
|
+
|
112
|
+
expect(ENV["FOO"]).to be_nil
|
113
|
+
expect(ENV["BAZ"]).to be_nil
|
114
|
+
end
|
115
|
+
|
116
|
+
it "is re-entrant" do
|
117
|
+
ret = with_modified_env(FOO: "foo") {
|
118
|
+
with_modified_env(BAR: "bar") do
|
119
|
+
"bar"
|
120
|
+
end
|
121
|
+
}
|
122
|
+
|
123
|
+
expect(ret).to eq("bar")
|
124
|
+
|
125
|
+
expect(ENV["FOO"]).to be_nil
|
126
|
+
expect(ENV["BAR"]).to be_nil
|
127
|
+
end
|
128
|
+
|
129
|
+
it "raises when the value cannot be assigned properly" do
|
130
|
+
message = generate_type_error_for_object(Thing.new)
|
131
|
+
|
132
|
+
expect {
|
133
|
+
with_modified_env(FOO: Thing.new)
|
134
|
+
}.to raise_error ClimateControl::UnassignableValueError, /attempted to assign .*Thing.* to FOO but failed \(#{message}\)$/
|
135
|
+
end
|
136
|
+
|
137
|
+
def with_modified_env(options, &block)
|
138
|
+
ClimateControl.modify(options, &block)
|
139
|
+
end
|
140
|
+
|
141
|
+
def generate_type_error_for_object(object)
|
142
|
+
message = nil
|
143
|
+
|
144
|
+
begin
|
145
|
+
"1" + object
|
146
|
+
rescue TypeError => e
|
147
|
+
message = e.message
|
148
|
+
end
|
149
|
+
|
150
|
+
message
|
151
|
+
end
|
152
|
+
|
153
|
+
around do |example|
|
154
|
+
old_env = ENV.to_hash
|
155
|
+
|
156
|
+
example.run
|
157
|
+
|
158
|
+
ENV.clear
|
159
|
+
old_env.each do |key, value|
|
160
|
+
ENV[key] = value
|
161
|
+
end
|
13
162
|
end
|
14
163
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
begin
|
2
|
+
require "simplecov"
|
3
|
+
SimpleCov.start
|
4
|
+
rescue LoadError
|
5
|
+
warn "warning: simplecov gem not found; skipping coverage"
|
6
|
+
end
|
3
7
|
|
4
|
-
$LOAD_PATH << File.join(File.dirname(__FILE__),
|
8
|
+
$LOAD_PATH << File.join(File.dirname(__FILE__), "..", "lib")
|
5
9
|
$LOAD_PATH << File.join(File.dirname(__FILE__))
|
6
10
|
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
|
11
|
-
Dir['spec/support/**/*.rb'].each { |f| require File.expand_path(f) }
|
11
|
+
require "rubygems"
|
12
|
+
require "rspec"
|
13
|
+
require "climate_control"
|
metadata
CHANGED
@@ -1,80 +1,71 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: climate_control
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
5
|
-
prerelease:
|
4
|
+
version: 1.0.1
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Joshua Clayton
|
9
|
-
autorequire:
|
8
|
+
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2021-05-27 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
14
|
+
name: rspec
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - "~>"
|
20
18
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
22
|
-
type: :
|
19
|
+
version: 3.10.0
|
20
|
+
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - "~>"
|
28
25
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
26
|
+
version: 3.10.0
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
|
-
name:
|
28
|
+
name: rake
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- - ~>
|
31
|
+
- - "~>"
|
36
32
|
- !ruby/object:Gem::Version
|
37
|
-
version:
|
33
|
+
version: 12.3.3
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- - ~>
|
38
|
+
- - "~>"
|
44
39
|
- !ruby/object:Gem::Version
|
45
|
-
version:
|
40
|
+
version: 12.3.3
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
|
-
name:
|
42
|
+
name: simplecov
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- - ~>
|
45
|
+
- - "~>"
|
52
46
|
- !ruby/object:Gem::Version
|
53
|
-
version: 0.9.
|
47
|
+
version: 0.9.1
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- - ~>
|
52
|
+
- - "~>"
|
60
53
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.9.
|
54
|
+
version: 0.9.1
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
|
-
name:
|
56
|
+
name: standard
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- - ~>
|
59
|
+
- - "~>"
|
68
60
|
- !ruby/object:Gem::Version
|
69
|
-
version: 0.
|
61
|
+
version: 1.0.0
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- - ~>
|
66
|
+
- - "~>"
|
76
67
|
- !ruby/object:Gem::Version
|
77
|
-
version: 0.
|
68
|
+
version: 1.0.0
|
78
69
|
description: Modify your ENV
|
79
70
|
email:
|
80
71
|
- joshua.clayton@gmail.com
|
@@ -82,46 +73,45 @@ executables: []
|
|
82
73
|
extensions: []
|
83
74
|
extra_rdoc_files: []
|
84
75
|
files:
|
85
|
-
- .
|
86
|
-
- .
|
76
|
+
- ".github/workflows/ci.yml"
|
77
|
+
- ".gitignore"
|
78
|
+
- CODE_OF_CONDUCT.md
|
87
79
|
- Gemfile
|
88
|
-
- LICENSE
|
80
|
+
- LICENSE
|
89
81
|
- NEWS
|
90
82
|
- README.md
|
91
83
|
- Rakefile
|
92
84
|
- climate_control.gemspec
|
93
85
|
- lib/climate_control.rb
|
86
|
+
- lib/climate_control/environment.rb
|
87
|
+
- lib/climate_control/errors.rb
|
94
88
|
- lib/climate_control/modifier.rb
|
95
89
|
- lib/climate_control/version.rb
|
96
90
|
- spec/acceptance/climate_control_spec.rb
|
97
|
-
- spec/lib/climate_control/modifier_spec.rb
|
98
91
|
- spec/spec_helper.rb
|
99
92
|
homepage: https://github.com/thoughtbot/climate_control
|
100
|
-
licenses:
|
101
|
-
|
93
|
+
licenses:
|
94
|
+
- MIT
|
95
|
+
metadata: {}
|
96
|
+
post_install_message:
|
102
97
|
rdoc_options: []
|
103
98
|
require_paths:
|
104
99
|
- lib
|
105
100
|
required_ruby_version: !ruby/object:Gem::Requirement
|
106
|
-
none: false
|
107
101
|
requirements:
|
108
|
-
- -
|
102
|
+
- - ">="
|
109
103
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
104
|
+
version: 2.5.0
|
111
105
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
|
-
none: false
|
113
106
|
requirements:
|
114
|
-
- -
|
107
|
+
- - ">="
|
115
108
|
- !ruby/object:Gem::Version
|
116
109
|
version: '0'
|
117
110
|
requirements: []
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
specification_version: 3
|
111
|
+
rubygems_version: 3.2.3
|
112
|
+
signing_key:
|
113
|
+
specification_version: 4
|
122
114
|
summary: Modify your ENV easily with ClimateControl
|
123
115
|
test_files:
|
124
116
|
- spec/acceptance/climate_control_spec.rb
|
125
|
-
- spec/lib/climate_control/modifier_spec.rb
|
126
117
|
- spec/spec_helper.rb
|
127
|
-
has_rdoc:
|
data/.travisci.yml
DELETED
@@ -1,83 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe ClimateControl::Modifier do
|
4
|
-
it 'modifies the environment' do
|
5
|
-
with_modified_env VARIABLE_1: 'bar', VARIABLE_2: 'qux' do
|
6
|
-
expect(ENV['VARIABLE_1']).to eq 'bar'
|
7
|
-
expect(ENV['VARIABLE_2']).to eq 'qux'
|
8
|
-
end
|
9
|
-
|
10
|
-
expect(ENV['VARIABLE_1']).to be_nil
|
11
|
-
expect(ENV['VARIABLE_2']).to be_nil
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'allows for environment variables to be assigned within the block' do
|
15
|
-
with_modified_env VARIABLE_1: 'modified' do
|
16
|
-
ENV['ASSIGNED_IN_BLOCK'] = 'assigned'
|
17
|
-
end
|
18
|
-
|
19
|
-
expect(ENV['ASSIGNED_IN_BLOCK']).to eq 'assigned'
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'reassigns previously set environment variables' do
|
23
|
-
ENV['VARIABLE_ASSIGNED_BEFORE_MODIFYING_ENV'] = 'original'
|
24
|
-
expect(ENV['VARIABLE_ASSIGNED_BEFORE_MODIFYING_ENV']).to eq 'original'
|
25
|
-
|
26
|
-
with_modified_env VARIABLE_ASSIGNED_BEFORE_MODIFYING_ENV: 'overridden' do
|
27
|
-
expect(ENV['VARIABLE_ASSIGNED_BEFORE_MODIFYING_ENV']).to eq 'overridden'
|
28
|
-
end
|
29
|
-
|
30
|
-
expect(ENV['VARIABLE_ASSIGNED_BEFORE_MODIFYING_ENV']).to eq 'original'
|
31
|
-
end
|
32
|
-
|
33
|
-
it 'persists the change when overriding the variable in the block' do
|
34
|
-
with_modified_env VARIABLE_MODIFIED_AND_THEN_ASSIGNED: 'modified' do
|
35
|
-
ENV['VARIABLE_MODIFIED_AND_THEN_ASSIGNED'] = 'assigned value'
|
36
|
-
end
|
37
|
-
|
38
|
-
expect(ENV['VARIABLE_MODIFIED_AND_THEN_ASSIGNED']).to eq 'assigned value'
|
39
|
-
end
|
40
|
-
|
41
|
-
it 'resets environment variables even if the block raises' do
|
42
|
-
expect {
|
43
|
-
with_modified_env FOO: 'bar' do
|
44
|
-
raise 'broken'
|
45
|
-
end
|
46
|
-
}.to raise_error
|
47
|
-
|
48
|
-
expect(ENV['FOO']).to be_nil
|
49
|
-
end
|
50
|
-
|
51
|
-
it 'preserves environment variables set within the block' do
|
52
|
-
ENV['CHANGED'] = 'old value'
|
53
|
-
|
54
|
-
with_modified_env IRRELEVANT: 'ignored value' do
|
55
|
-
ENV['CHANGED'] = 'new value'
|
56
|
-
end
|
57
|
-
|
58
|
-
expect(ENV['CHANGED']).to eq 'new value'
|
59
|
-
end
|
60
|
-
|
61
|
-
it 'returns the value of the block' do
|
62
|
-
value = with_modified_env VARIABLE_1: 'bar' do
|
63
|
-
'value inside block'
|
64
|
-
end
|
65
|
-
|
66
|
-
expect(value).to eq 'value inside block'
|
67
|
-
end
|
68
|
-
|
69
|
-
def with_modified_env(options, &block)
|
70
|
-
ClimateControl::Modifier.new(options, &block).process
|
71
|
-
end
|
72
|
-
|
73
|
-
around do |example|
|
74
|
-
old_env = ENV.to_hash
|
75
|
-
|
76
|
-
example.run
|
77
|
-
|
78
|
-
ENV.clear
|
79
|
-
old_env.each do |key, value|
|
80
|
-
ENV[key] = value
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|