rvm2-shell 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -0,0 +1,6 @@
1
+ module Rvm2
2
+ class Shell
3
+ end
4
+ end
5
+
6
+ require_relative "shell/command"
@@ -0,0 +1,8 @@
1
+ module Rvm2::Shell::Command
2
+ def build(*args)
3
+ # TODO: find a plugin to handle special cases
4
+ Base.new(args)
5
+ end
6
+ end
7
+
8
+ require_relative "command/base"
@@ -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,5 @@
1
+ class Rvm2::Shell::Runner
2
+ def execute(command)
3
+
4
+ end
5
+ 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
@@ -0,0 +1,5 @@
1
+ module Rvm2
2
+ class Shell
3
+ VERSION = '0.0.1'
4
+ end
5
+ end
@@ -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: