rvm2-shell 0.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/lib/rvm2/shell.rb +6 -0
- data/lib/rvm2/shell/command.rb +8 -0
- data/lib/rvm2/shell/command/base.rb +58 -0
- data/lib/rvm2/shell/runner.rb +5 -0
- data/lib/rvm2/shell/runner/fake.rb +15 -0
- data/lib/rvm2/shell/runner/local.rb +21 -0
- data/lib/rvm2/shell/runner/ssh.rb +36 -0
- data/lib/rvm2/shell/version.rb +5 -0
- data/test/test_helper.rb +27 -0
- data/test/unit/runner/fake_test.rb +46 -0
- metadata +169 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 0e7598078c1877397b3d62b82baeb008b181aaf4
|
4
|
+
data.tar.gz: 29afc245a085f8b7e722ece491eff117d1b452a9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3eaadf0c38b79a4e9e289ac4016d980a9229056c2864c3bbef743df2a2055476b13b4db696bda3527ec76fe2448eb44ef68eec0b1870a74e4c7500b987a861bc
|
7
|
+
data.tar.gz: dbfe5d6c266a158557b3fb814d058d7d38f0b30a9af6ae183486a38e300029f1764f02db63c37e99cf2c111c73c188ca7ad32aebc6d1c4a6c4a83006d8e72f1d
|
data/lib/rvm2/shell.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'hooks'
|
2
|
+
|
3
|
+
class Rvm2::Shell::Command::Base
|
4
|
+
include Hooks
|
5
|
+
|
6
|
+
define_hook :on_start, halts_on_falsey: true
|
7
|
+
define_hooks :on_stdout, :on_stderr, :on_finish
|
8
|
+
|
9
|
+
attr_reader :status, :command
|
10
|
+
|
11
|
+
def initialize(*args)
|
12
|
+
@command = args
|
13
|
+
end
|
14
|
+
|
15
|
+
def start
|
16
|
+
@started = Time.now
|
17
|
+
run_hook(:on_start, @started)
|
18
|
+
end
|
19
|
+
|
20
|
+
def finish(status)
|
21
|
+
@finished = Time.now
|
22
|
+
@status = status
|
23
|
+
run_hook(:on_finish, @finished, @status)
|
24
|
+
@status
|
25
|
+
end
|
26
|
+
|
27
|
+
def duration
|
28
|
+
return nil if @started.nil? || @finished.nil?
|
29
|
+
@finished - @started
|
30
|
+
end
|
31
|
+
|
32
|
+
def execute(runner)
|
33
|
+
start
|
34
|
+
status = runner.execute(to_s) do |out, err|
|
35
|
+
run_hook(:on_stdout, out) if out
|
36
|
+
run_hook(:on_stderr, err) if err
|
37
|
+
end
|
38
|
+
ensure
|
39
|
+
finish(status) # nil if not called
|
40
|
+
end
|
41
|
+
|
42
|
+
def aborted?
|
43
|
+
@status.nil?
|
44
|
+
end
|
45
|
+
|
46
|
+
def success?
|
47
|
+
@status == 0
|
48
|
+
end
|
49
|
+
|
50
|
+
def failed?
|
51
|
+
!aborted? && !success?
|
52
|
+
end
|
53
|
+
|
54
|
+
def to_s
|
55
|
+
args.map{|a| "\"#{a}\""}.join(" ")
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class Rvm2::Shell::Runner::Fake
|
2
|
+
attr_reader :last_status
|
3
|
+
|
4
|
+
def execute(command)
|
5
|
+
@last_status, outputs = @respond.call(command)
|
6
|
+
outputs.each do |out, err|
|
7
|
+
yield(out, err)
|
8
|
+
end
|
9
|
+
@last_status
|
10
|
+
end
|
11
|
+
|
12
|
+
def respond(&block)
|
13
|
+
@respond = block
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'session'
|
2
|
+
|
3
|
+
class Rvm2::Shell::Runner::Local
|
4
|
+
attr_reader :shell, :last_status
|
5
|
+
|
6
|
+
def initialize(shell = "sh")
|
7
|
+
@shell = shell
|
8
|
+
end
|
9
|
+
|
10
|
+
def execute(command)
|
11
|
+
@last_status = nil
|
12
|
+
shell_session.execute(command) do |out, err|
|
13
|
+
yield(out, err)
|
14
|
+
end
|
15
|
+
@last_status = shell_session.status
|
16
|
+
end
|
17
|
+
|
18
|
+
def shell_session
|
19
|
+
@shell_session ||= Session::Sh.new(:prog => shell)
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'net/ssh'
|
2
|
+
|
3
|
+
class Rvm2::Shell::Runner::Ssh
|
4
|
+
attr_reader :host, :user, :last_status
|
5
|
+
|
6
|
+
def initialize(host, user)
|
7
|
+
@host = host
|
8
|
+
@user = user
|
9
|
+
end
|
10
|
+
|
11
|
+
# TODO: make it run in one session
|
12
|
+
def execute(command)
|
13
|
+
@last_status = nil
|
14
|
+
ssh.open_channel do |channel|
|
15
|
+
channel.request_pty
|
16
|
+
channel.exec command do |ch, success|
|
17
|
+
channel.on_data do |ch, data|
|
18
|
+
yield(data, nil)
|
19
|
+
end
|
20
|
+
channel.on_extended_data do |ch, type, data|
|
21
|
+
yield(nil, data)
|
22
|
+
end
|
23
|
+
channel.on_request("exit-status") do |ch, data|
|
24
|
+
@last_status = data.read_long
|
25
|
+
end
|
26
|
+
end
|
27
|
+
channel.wait
|
28
|
+
end
|
29
|
+
ssh.loop
|
30
|
+
@last_status
|
31
|
+
end
|
32
|
+
|
33
|
+
def ssh
|
34
|
+
@ssh ||= Net::SSH.start(host, user)
|
35
|
+
end
|
36
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require "coveralls"
|
2
|
+
require "simplecov"
|
3
|
+
|
4
|
+
SimpleCov.start do
|
5
|
+
formatter SimpleCov::Formatter::MultiFormatter[
|
6
|
+
SimpleCov::Formatter::HTMLFormatter,
|
7
|
+
Coveralls::SimpleCov::Formatter,
|
8
|
+
]
|
9
|
+
command_name "Unit Tests"
|
10
|
+
add_filter "/test/"
|
11
|
+
end
|
12
|
+
|
13
|
+
Coveralls.noisy = true
|
14
|
+
|
15
|
+
require 'minitest/autorun'
|
16
|
+
|
17
|
+
module Rvm2
|
18
|
+
class Shell
|
19
|
+
class Runner
|
20
|
+
end
|
21
|
+
module Command
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# Autoload all lib/**/*.rb files so simplecov does not misses anything
|
27
|
+
Dir[File.expand_path("../../lib/**/*.rb", __FILE__)].each{|f| require f }
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Rvm2::Shell::Runner
|
4
|
+
end
|
5
|
+
|
6
|
+
require 'rvm2/shell/runner/fake'
|
7
|
+
|
8
|
+
class TestCommentTestInput < MiniTest::Unit::TestCase
|
9
|
+
def setup
|
10
|
+
@test = Rvm2::Shell::Runner::Fake
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_true
|
14
|
+
test_command = "echo test"
|
15
|
+
fake = @test.new
|
16
|
+
fake.respond do |command|
|
17
|
+
assert_equal command, test_command
|
18
|
+
[0,[]]
|
19
|
+
end
|
20
|
+
called = 0
|
21
|
+
status =
|
22
|
+
fake.execute(test_command) do |out, err|
|
23
|
+
called+=1
|
24
|
+
end
|
25
|
+
assert_equal called, 0
|
26
|
+
assert_equal status, 0
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_echo_test
|
30
|
+
test_command = "echo test"
|
31
|
+
fake = @test.new
|
32
|
+
fake.respond do |command|
|
33
|
+
assert_equal command, test_command
|
34
|
+
[0,[['test',nil]]]
|
35
|
+
end
|
36
|
+
called = 0
|
37
|
+
status =
|
38
|
+
fake.execute(test_command) do |out, err|
|
39
|
+
assert_equal out, "test"
|
40
|
+
assert_equal err, nil
|
41
|
+
called+=1
|
42
|
+
end
|
43
|
+
assert_equal called, 1
|
44
|
+
assert_equal status, 0
|
45
|
+
end
|
46
|
+
end
|
metadata
ADDED
@@ -0,0 +1,169 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rvm2-shell
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Michal Papis
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-10-14 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: hooks
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: session
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: net-ssh
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: simplecov
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: coveralls
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: yard
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: redcarpet
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - '>='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
description: SM Framework aka RVM 2 - Shell handling
|
126
|
+
email:
|
127
|
+
- mpapis@gmail.com
|
128
|
+
executables: []
|
129
|
+
extensions: []
|
130
|
+
extra_rdoc_files: []
|
131
|
+
files:
|
132
|
+
- lib/rvm2/shell/runner/ssh.rb
|
133
|
+
- lib/rvm2/shell/runner/local.rb
|
134
|
+
- lib/rvm2/shell/runner/fake.rb
|
135
|
+
- lib/rvm2/shell/command.rb
|
136
|
+
- lib/rvm2/shell/runner.rb
|
137
|
+
- lib/rvm2/shell/command/base.rb
|
138
|
+
- lib/rvm2/shell/version.rb
|
139
|
+
- lib/rvm2/shell.rb
|
140
|
+
- test/unit/runner/fake_test.rb
|
141
|
+
- test/test_helper.rb
|
142
|
+
homepage: https://github.com/rvm/rvm2-shell
|
143
|
+
licenses:
|
144
|
+
- Apache2
|
145
|
+
metadata: {}
|
146
|
+
post_install_message:
|
147
|
+
rdoc_options: []
|
148
|
+
require_paths:
|
149
|
+
- lib
|
150
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
151
|
+
requirements:
|
152
|
+
- - '>='
|
153
|
+
- !ruby/object:Gem::Version
|
154
|
+
version: '0'
|
155
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - '>='
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
requirements: []
|
161
|
+
rubyforge_project:
|
162
|
+
rubygems_version: 2.1.8
|
163
|
+
signing_key:
|
164
|
+
specification_version: 4
|
165
|
+
summary: SM Framework aka RVM 2 - Shell handling
|
166
|
+
test_files:
|
167
|
+
- test/unit/runner/fake_test.rb
|
168
|
+
- test/test_helper.rb
|
169
|
+
has_rdoc:
|