sshkit-custom-dsl 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop_todo.yml +11 -0
- data/README.md +33 -4
- data/Rakefile +3 -4
- data/lib/core_ext/sshkit/backend/abstract.rb +4 -11
- data/lib/core_ext/sshkit.rb +1 -1
- data/lib/sshkit/custom/config/store.rb +11 -10
- data/lib/sshkit/custom/dsl/config_statements.rb +14 -9
- data/lib/sshkit/custom/dsl/exec_statements.rb +2 -3
- data/lib/sshkit/custom/dsl/helper.rb +3 -3
- data/lib/sshkit/custom/dsl/version.rb +1 -1
- data/lib/sshkit/custom/dsl.rb +4 -4
- data/lib/sshkit/custom/runner/abstract.rb +88 -0
- data/lib/sshkit/custom/runner/group.rb +34 -0
- data/lib/sshkit/custom/runner/parallel.rb +30 -0
- data/lib/sshkit/custom/runner/sequential.rb +14 -0
- data/spec/spec_helper.rb +0 -2
- data/spec/unit/sshkit/custom/config/store_spec.rb +116 -0
- data/spec/unit/sshkit/custom/dsl/config_statements_spec.rb +147 -0
- data/spec/unit/sshkit/custom/dsl/exec_statements_spec.rb +74 -0
- data/spec/unit/sshkit/custom/dsl/helper_spec.rb +57 -0
- data/spec/unit/sshkit/custom/runner/abstract_spec.rb +123 -0
- data/spec/unit/sshkit/custom/runner/group_spec.rb +48 -0
- data/spec/unit/sshkit/custom/runner/parallel_spec.rb +55 -0
- data/spec/unit/sshkit/custom/runner/sequential_spec.rb +27 -0
- data/sshkit-custom-dsl.gemspec +10 -10
- metadata +22 -6
- data/lib/sshkit/custom/config/runner/abstract.rb +0 -100
- data/lib/sshkit/custom/config/runner/group.rb +0 -31
- data/lib/sshkit/custom/config/runner/parallel.rb +0 -35
- data/lib/sshkit/custom/config/runner/sequential.rb +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2fd766977dc760e757d032aeb5afba4a8ecca796
|
4
|
+
data.tar.gz: 244879dd93b7ff53dea9070b59facd6726ef2ab8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ed3e7881c9e5aa5d64165dd2643135b9082701a66b9abbe09e32520b6141a1dcada72a954e658086843958053a9f2b0f02412b882bcb491c52920d88d1b00251
|
7
|
+
data.tar.gz: 0b2e4323dc19009e77c73bdf7693c67dbfc85e34506abffdd442308ea59404bdf556d853a379d6c0ddd3aed68453520405ae0ed3be8ee0a8371f2fecab5bb288
|
data/.gitignore
CHANGED
data/.rubocop_todo.yml
CHANGED
@@ -0,0 +1,11 @@
|
|
1
|
+
# This configuration was generated by `rubocop --auto-gen-config`
|
2
|
+
# on 2014-06-10 13:48:11 +0200 using RuboCop version 0.23.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
|
+
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
10
|
+
Style/MethodName:
|
11
|
+
Enabled: false
|
data/README.md
CHANGED
@@ -1,8 +1,13 @@
|
|
1
|
-
|
1
|
+
[![Build Status](https://travis-ci.org/faber-lotto/sshkit-custom-dsl.svg)](https://travis-ci.org/faber-lotto/sshkit-custom-dsl)
|
2
|
+
[![Coverage Status](https://coveralls.io/repos/faber-lotto/sshkit-custom-dsl/badge.png)](https://coveralls.io/r/faber-lotto/sshkit-custom-dsl)
|
3
|
+
[![Code Climate](https://codeclimate.com/github/faber-lotto/sshkit-custom-dsl.png)](https://codeclimate.com/github/faber-lotto/sshkit-custom-dsl)
|
4
|
+
[![Gem Version](https://badge.fury.io/rb/capistrano-template.svg)](http://badge.fury.io/rb/capistrano-template)
|
5
|
+
|
6
|
+
# SSHKit::Custom::DSL
|
2
7
|
|
3
8
|
Exchanges original sshkit dsl against a custom dsl. This DSL does not change the scope of the blocks.
|
4
9
|
Furthor more it uses `Rake::Threadpool`, to handle parallel requests. Keep in mind `Runner::Parallel`
|
5
|
-
and Runner::Group
|
10
|
+
and `Runner::Group` execute all blocks in *parallel threads*, so do it thread save.
|
6
11
|
|
7
12
|
## Installation
|
8
13
|
|
@@ -25,6 +30,8 @@ Or install it yourself as:
|
|
25
30
|
require 'sshkit/custom/dsl'
|
26
31
|
|
27
32
|
extend SSHKit::Custom::DSL
|
33
|
+
require 'delegate'
|
34
|
+
# require 'sshkit/dsl' <= switch to see the different
|
28
35
|
|
29
36
|
SSHKit.configure do |sshkit|
|
30
37
|
sshkit.format = :pretty
|
@@ -38,10 +45,32 @@ SSHKit.configure do |sshkit|
|
|
38
45
|
end
|
39
46
|
end
|
40
47
|
|
48
|
+
class TestScope < SimpleDelegator
|
49
|
+
def data
|
50
|
+
{msg: "12345"}
|
51
|
+
end
|
52
|
+
|
53
|
+
def call_it
|
54
|
+
|
55
|
+
on %w{localhost 127.0.0.1}, in: :sequence, wait: 0 do
|
56
|
+
within "/tmp" do
|
57
|
+
with rails_env: :production do
|
58
|
+
execute "echo", data.fetch(:msg)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
data = {msg: "ABCD"}
|
67
|
+
|
68
|
+
TestScope.new(self).call_it
|
69
|
+
|
41
70
|
on %w{localhost 127.0.0.1}, in: :sequence, wait: 0 do
|
42
71
|
within "/tmp" do
|
43
72
|
with rails_env: :production do
|
44
|
-
execute "echo",
|
73
|
+
execute "echo", data.fetch(:msg)
|
45
74
|
end
|
46
75
|
end
|
47
76
|
end
|
@@ -71,7 +100,7 @@ It should work like the original one, I hope.
|
|
71
100
|
|
72
101
|
## Contributing
|
73
102
|
|
74
|
-
1. Fork it ( https://github.com/
|
103
|
+
1. Fork it ( https://github.com/faber-lotto/sshkit-custom-dsl/fork )
|
75
104
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
76
105
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
77
106
|
4. Push to the branch (`git push origin my-new-feature`)
|
data/Rakefile
CHANGED
@@ -1,12 +1,11 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rspec/core/rake_task'
|
3
3
|
require 'rubocop/rake_task'
|
4
4
|
|
5
5
|
RSpec::Core::RakeTask.new(:spec)
|
6
6
|
RuboCop::RakeTask.new
|
7
7
|
|
8
|
-
task :
|
9
|
-
|
8
|
+
task default: :spec
|
10
9
|
|
11
10
|
desc 'Run RSpec with code coverage'
|
12
11
|
task :coverage do
|
data/lib/core_ext/sshkit.rb
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
require 'sshkit'
|
2
|
-
require 'core_ext/sshkit/backend/abstract'
|
2
|
+
require 'core_ext/sshkit/backend/abstract'
|
@@ -2,7 +2,6 @@ module SSHKit
|
|
2
2
|
module Custom
|
3
3
|
module Config
|
4
4
|
module Store
|
5
|
-
|
6
5
|
module_function
|
7
6
|
|
8
7
|
def scope_storage
|
@@ -15,10 +14,10 @@ module SSHKit
|
|
15
14
|
|
16
15
|
def create_runner(opts)
|
17
16
|
@runner = Runner::Abstract.create_runner opts
|
18
|
-
end
|
17
|
+
end
|
19
18
|
|
20
19
|
def runner
|
21
|
-
@runner.tap{|r| r.backends = backends}
|
20
|
+
@runner.tap { |r| r.backends = backends }
|
22
21
|
end
|
23
22
|
|
24
23
|
def backends=(hosts)
|
@@ -30,11 +29,13 @@ module SSHKit
|
|
30
29
|
end
|
31
30
|
|
32
31
|
def add_pwd(directory)
|
33
|
-
active_backend.pwd ||= []
|
32
|
+
active_backend.pwd ||= []
|
33
|
+
active_backend.pwd << directory
|
34
34
|
end
|
35
35
|
|
36
36
|
def pop_pwd
|
37
|
-
active_backend.pwd ||= []
|
37
|
+
active_backend.pwd ||= []
|
38
|
+
active_backend.pwd.pop
|
38
39
|
end
|
39
40
|
|
40
41
|
def _envs
|
@@ -42,7 +43,7 @@ module SSHKit
|
|
42
43
|
end
|
43
44
|
|
44
45
|
def add_env(env)
|
45
|
-
old_env =
|
46
|
+
old_env = active_backend.env.clone
|
46
47
|
_envs << old_env
|
47
48
|
env = old_env.merge(env)
|
48
49
|
active_backend.env = env
|
@@ -50,7 +51,7 @@ module SSHKit
|
|
50
51
|
|
51
52
|
def pop_env
|
52
53
|
old_env = _envs.pop || {}
|
53
|
-
|
54
|
+
active_backend.env = old_env
|
54
55
|
end
|
55
56
|
|
56
57
|
def _user_groups
|
@@ -58,7 +59,7 @@ module SSHKit
|
|
58
59
|
end
|
59
60
|
|
60
61
|
def add_user_group(user, group)
|
61
|
-
_user_groups << {user: active_backend.user, group: active_backend.group }
|
62
|
+
_user_groups << { user: active_backend.user, group: active_backend.group }
|
62
63
|
active_backend.user = user
|
63
64
|
active_backend.group = group
|
64
65
|
end
|
@@ -70,9 +71,9 @@ module SSHKit
|
|
70
71
|
end
|
71
72
|
|
72
73
|
def active_backend
|
73
|
-
SSHKit::Custom::
|
74
|
+
SSHKit::Custom::Runner::Abstract.active_backend
|
74
75
|
end
|
75
76
|
end
|
76
77
|
end
|
77
78
|
end
|
78
|
-
end
|
79
|
+
end
|
@@ -2,14 +2,12 @@ module SSHKit
|
|
2
2
|
module Custom
|
3
3
|
module DSL
|
4
4
|
module ConfigStatements
|
5
|
-
|
6
|
-
def on(hosts, options={}, &block)
|
5
|
+
def on(hosts, options = {}, &block)
|
7
6
|
hosts = Array(hosts).map { |rh| Host(rh) }.uniq
|
8
7
|
|
9
|
-
|
10
|
-
_config_store.create_runner options
|
8
|
+
_setup_runner(hosts, options)
|
11
9
|
|
12
|
-
|
10
|
+
_runner.apply_block_to_bcks(&block) if block_given?
|
13
11
|
end
|
14
12
|
|
15
13
|
def within(directory)
|
@@ -30,10 +28,9 @@ module SSHKit
|
|
30
28
|
end
|
31
29
|
|
32
30
|
def as(who)
|
33
|
-
|
34
31
|
if who.respond_to? :fetch
|
35
|
-
user = who.fetch(:user
|
36
|
-
group = who.fetch(:group
|
32
|
+
user = who.fetch(:user) { who.fetch('user') }
|
33
|
+
group = who.fetch(:group) { who.fetch('group', nil) }
|
37
34
|
else
|
38
35
|
user = who
|
39
36
|
group = nil
|
@@ -49,7 +46,15 @@ module SSHKit
|
|
49
46
|
_config_store.pop_user_group
|
50
47
|
end
|
51
48
|
|
49
|
+
def _setup_runner(hosts, options)
|
50
|
+
_config_store.backends = hosts
|
51
|
+
_config_store.create_runner options
|
52
|
+
end
|
53
|
+
|
54
|
+
def _runner
|
55
|
+
_config_store.runner
|
56
|
+
end
|
52
57
|
end
|
53
58
|
end
|
54
59
|
end
|
55
|
-
end
|
60
|
+
end
|
@@ -2,9 +2,9 @@ module SSHKit
|
|
2
2
|
module Custom
|
3
3
|
module DSL
|
4
4
|
module ExecStatements
|
5
|
+
EXEC_STATEMENTS = [:execute, :make, :rake, :test, :capture, :upload!, :download!].freeze
|
5
6
|
|
6
|
-
|
7
|
-
[:execute, :make, :rake, :test, :capture, :upload!, :download!].each do |method|
|
7
|
+
EXEC_STATEMENTS.each do |method|
|
8
8
|
define_method method do |*args, &block|
|
9
9
|
_config_store.runner.send_cmd method, *args, &block
|
10
10
|
end
|
@@ -36,7 +36,6 @@ module SSHKit
|
|
36
36
|
fi
|
37
37
|
EOTEST
|
38
38
|
end
|
39
|
-
|
40
39
|
end
|
41
40
|
end
|
42
41
|
end
|
@@ -2,6 +2,7 @@ module SSHKit
|
|
2
2
|
module Custom
|
3
3
|
module DSL
|
4
4
|
module Helper
|
5
|
+
LOGGING_METHODS = [:log, :debug, :fatal, :error, :warn, :info, :debug].freeze
|
5
6
|
|
6
7
|
def active_backend
|
7
8
|
SSHKit::Custom::Config::Store.active_backend
|
@@ -11,7 +12,7 @@ module SSHKit
|
|
11
12
|
active_backend.host
|
12
13
|
end
|
13
14
|
|
14
|
-
|
15
|
+
LOGGING_METHODS.each do |method|
|
15
16
|
define_method method do |*args|
|
16
17
|
active_backend.send method, *args
|
17
18
|
end
|
@@ -28,8 +29,7 @@ module SSHKit
|
|
28
29
|
def _config_store
|
29
30
|
@_config_store ||= SSHKit::Custom::Config::Store
|
30
31
|
end
|
31
|
-
|
32
32
|
end
|
33
33
|
end
|
34
34
|
end
|
35
|
-
end
|
35
|
+
end
|
data/lib/sshkit/custom/dsl.rb
CHANGED
@@ -3,10 +3,10 @@ require 'core_ext/sshkit'
|
|
3
3
|
require 'scoped_storage'
|
4
4
|
|
5
5
|
require 'sshkit/custom/config/store'
|
6
|
-
require 'sshkit/custom/
|
7
|
-
require 'sshkit/custom/
|
8
|
-
require 'sshkit/custom/
|
9
|
-
require 'sshkit/custom/
|
6
|
+
require 'sshkit/custom/runner/abstract'
|
7
|
+
require 'sshkit/custom/runner/sequential'
|
8
|
+
require 'sshkit/custom/runner/parallel'
|
9
|
+
require 'sshkit/custom/runner/group'
|
10
10
|
|
11
11
|
require 'sshkit/custom/dsl/config_statements'
|
12
12
|
require 'sshkit/custom/dsl/exec_statements'
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module SSHKit
|
2
|
+
module Custom
|
3
|
+
module Runner
|
4
|
+
ExecuteError = SSHKit::Runner::ExecuteError
|
5
|
+
|
6
|
+
class Abstract
|
7
|
+
attr_accessor :backends
|
8
|
+
attr_reader :options
|
9
|
+
attr_writer :wait_interval
|
10
|
+
|
11
|
+
def self.create_runner(opts)
|
12
|
+
opts_with_defaults = { in: :parallel }.merge(opts)
|
13
|
+
|
14
|
+
case opts_with_defaults[:in]
|
15
|
+
when :parallel
|
16
|
+
Parallel
|
17
|
+
when :sequence
|
18
|
+
Sequential
|
19
|
+
when :groups
|
20
|
+
Group
|
21
|
+
else
|
22
|
+
fail "Don't know how to handle run style #{opts_with_defaults[:in].inspect}"
|
23
|
+
end.new(opts_with_defaults)
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.scope_storage
|
27
|
+
ScopedStorage::ThreadLocalStorage
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.scope
|
31
|
+
@scope ||= ScopedStorage::Scope.new('sshkit_runner', scope_storage)
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.active_backend
|
35
|
+
scope[:active_backend] || fail(ArgumentError, 'Backend not set')
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.active_backend=(new_backend)
|
39
|
+
scope[:active_backend] = new_backend
|
40
|
+
end
|
41
|
+
|
42
|
+
def initialize(options = nil)
|
43
|
+
@options = options || {}
|
44
|
+
end
|
45
|
+
|
46
|
+
def active_backend
|
47
|
+
self.class.active_backend
|
48
|
+
end
|
49
|
+
|
50
|
+
def active_backend=(new_backend)
|
51
|
+
self.class.active_backend = new_backend
|
52
|
+
end
|
53
|
+
|
54
|
+
def send_cmd(cmd, *args, &block)
|
55
|
+
args = Array(block.call(active_backend.host)) if block
|
56
|
+
active_backend.send(cmd, *args)
|
57
|
+
rescue => e
|
58
|
+
e2 = ExecuteError.new e
|
59
|
+
raise e2, "Exception while executing on host #{active_backend.host}: #{e.message}"
|
60
|
+
end
|
61
|
+
|
62
|
+
def apply_block_to_bcks(&_block)
|
63
|
+
fail SSHKit::Backend::MethodUnavailableError
|
64
|
+
end
|
65
|
+
|
66
|
+
def apply_to_bck(backend, &block)
|
67
|
+
self.active_backend = backend
|
68
|
+
block.call(backend.host)
|
69
|
+
rescue => e
|
70
|
+
e2 = ExecuteError.new e
|
71
|
+
raise e2, "Exception while executing on host #{backend.host}: #{e.message}"
|
72
|
+
ensure
|
73
|
+
self.active_backend = nil
|
74
|
+
end
|
75
|
+
|
76
|
+
def do_wait
|
77
|
+
sleep wait_interval
|
78
|
+
end
|
79
|
+
|
80
|
+
protected
|
81
|
+
|
82
|
+
def wait_interval
|
83
|
+
@wait_interval || options[:wait] || 2
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module SSHKit
|
2
|
+
module Custom
|
3
|
+
module Runner
|
4
|
+
class Group < Abstract
|
5
|
+
attr_writer :group_size
|
6
|
+
|
7
|
+
def apply_block_to_bcks(&block)
|
8
|
+
backends.each_slice(group_size).map do |group_backends|
|
9
|
+
|
10
|
+
exec_parallel(group_backends, &block)
|
11
|
+
|
12
|
+
do_wait
|
13
|
+
|
14
|
+
end.flatten
|
15
|
+
end
|
16
|
+
|
17
|
+
def group_size
|
18
|
+
@group_size ||= options[:limit] || 2
|
19
|
+
end
|
20
|
+
|
21
|
+
def exec_parallel(group, &block)
|
22
|
+
use_runner.call(options).tap do |runner|
|
23
|
+
runner.backends = group
|
24
|
+
runner.apply_block_to_bcks(&block)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def use_runner
|
29
|
+
->(options) { Parallel.new(options) }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module SSHKit
|
2
|
+
module Custom
|
3
|
+
module Runner
|
4
|
+
require 'rake'
|
5
|
+
|
6
|
+
class Parallel < Abstract
|
7
|
+
def thread_pool
|
8
|
+
@thread_pool ||= Rake::ThreadPool.new(thread_count)
|
9
|
+
end
|
10
|
+
|
11
|
+
def apply_block_to_bcks(&block)
|
12
|
+
futures = to_futures(&block)
|
13
|
+
futures.each { |f| f.value }
|
14
|
+
end
|
15
|
+
|
16
|
+
def thread_count
|
17
|
+
@thread_count ||= options[:thread_count] || Rake.suggested_thread_count - 1
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_futures(&block)
|
21
|
+
backends.map do |b|
|
22
|
+
thread_pool.future(b) do |fb|
|
23
|
+
apply_to_bck fb, &block
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'unit_spec_helper'
|
2
|
+
|
3
|
+
module SSHKit
|
4
|
+
module Custom
|
5
|
+
module Config
|
6
|
+
describe Store do
|
7
|
+
|
8
|
+
let(:mock_bck) do
|
9
|
+
SSHKit.config.backend.new(SSHKit::Host.new('localhost'))
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:new_env) { { ab: :cd } }
|
13
|
+
let(:old_env) { { ab: 123, i: 5 } }
|
14
|
+
|
15
|
+
before :each do
|
16
|
+
SSHKit::Custom::Runner::Abstract.active_backend = mock_bck
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '.create_runner' do
|
20
|
+
it 'creates the wanted runner' do
|
21
|
+
opts = { in: :parallel }
|
22
|
+
expect(Runner::Abstract).to receive(:create_runner).with(opts)
|
23
|
+
Store.create_runner opts
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '.runner' do
|
28
|
+
it 'returns the actual runner' do
|
29
|
+
opts = { in: :parallel }
|
30
|
+
Store.create_runner opts
|
31
|
+
|
32
|
+
expect(Store.runner).not_to be_nil
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe '.backends=' do
|
37
|
+
it 'stores a list of backends' do
|
38
|
+
Store.backends = ['127.0.0.1', 'localhost'].map { |h| SSHKit::Host.new(h) }
|
39
|
+
expect(Store.backends.last.host.hostname).to eq('localhost')
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe '.add_pwd' do
|
44
|
+
it 'adds a directory to the stack' do
|
45
|
+
expect { Store.add_pwd('ddd') }.to change { mock_bck.pwd.count }.by(1)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe '.pop_pwd' do
|
50
|
+
it 'removes a directory from the stack' do
|
51
|
+
Store.add_pwd('ddd')
|
52
|
+
Store.add_pwd('bbb')
|
53
|
+
Store.add_pwd('ccc')
|
54
|
+
expect { Store.pop_pwd }.to change { mock_bck.pwd.count }.by(-1)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe '.add_env' do
|
59
|
+
|
60
|
+
it 'adds an env to the stack' do
|
61
|
+
expect(mock_bck.env).to eq({})
|
62
|
+
Store.add_env(new_env)
|
63
|
+
expect(mock_bck.env).to eq(new_env)
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'merges the old env with the new one' do
|
67
|
+
Store.add_env(old_env)
|
68
|
+
Store.add_env(new_env)
|
69
|
+
|
70
|
+
expect(mock_bck.env).to eq(old_env.merge(new_env))
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe '.pop_env' do
|
75
|
+
it 'removes an env from the stack' do
|
76
|
+
Store.add_env(new_env)
|
77
|
+
Store.pop_env
|
78
|
+
expect(mock_bck.env).to eq({})
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'restores pre existing envs' do
|
82
|
+
Store.add_env(old_env)
|
83
|
+
Store.add_env(new_env)
|
84
|
+
|
85
|
+
Store.pop_env
|
86
|
+
|
87
|
+
expect(mock_bck.env).to eq(old_env)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe '.add_user_group' do
|
92
|
+
it 'stores an user and group' do
|
93
|
+
Store.add_user_group('u', 'g')
|
94
|
+
expect(mock_bck.user).to eq 'u'
|
95
|
+
expect(mock_bck.group).to eq 'g'
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe '.pop_user_group' do
|
100
|
+
it 'restores previous an user and group' do
|
101
|
+
Store.add_user_group('u', 'g')
|
102
|
+
Store.add_user_group('u1', 'g1')
|
103
|
+
|
104
|
+
expect(mock_bck.user).to eq 'u1'
|
105
|
+
expect(mock_bck.group).to eq 'g1'
|
106
|
+
|
107
|
+
Store.pop_user_group
|
108
|
+
|
109
|
+
expect(mock_bck.user).to eq 'u'
|
110
|
+
expect(mock_bck.group).to eq 'g'
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|