sshkit 0.0.21 → 0.0.22

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -3,10 +3,27 @@
3
3
  This file is written in reverse chronological order, newer releases will
4
4
  appear at the top.
5
5
 
6
+ ## 0.0.22
7
+
8
+ * Added naïve implementations of `upload!()` and `download!()` (syncoronous) to
9
+ the Net::SSH backend. See `EXAMPLES.md` for more extensive usage examples.
10
+
11
+ The `upload!()` method can take a filename, or an `IO`, this reflects the way
12
+ the underlying Net::SCP implementation works. The same is true of
13
+ `download!()`, when called with a single argument it captures the file's
14
+ contents, otherwise it downloads the file to the local disk.
15
+
16
+ on hosts do |host|
17
+ upload!(StringIO.new('some-data-here'), '~/.ssh/authorized_keys')
18
+ upload!('~/.ssh/id_rsa.pub', '~/.ssh/authorized_keys')
19
+ puts download!('/etc/monit/monitrc')
20
+ download!('/etc/monit/monitrc', '~/monitrc')
21
+ end
22
+
6
23
  ## 0.0.21
7
24
 
8
25
  * Fixed an issue with default formatter
9
- * Modified SSHKit.config.output_verbosity= to accept different objects:
26
+ * Modified `SSHKit.config.output_verbosity=` to accept different objects:
10
27
 
11
28
  SSHKit.config.output_verbosity = Logger::INFO
12
29
  SSHKit.config.output_verbosity = :info
data/EXAMPLES.md CHANGED
@@ -31,6 +31,20 @@
31
31
  end
32
32
  end
33
33
 
34
+ ## Print some arbitrary output with the logging methods
35
+
36
+ on hosts do |host|
37
+ f = '/some/file'
38
+ if test("[ -d #{f} ]")
39
+ execute :touch, f
40
+ else
41
+ info "#{f} already exists on #{host}!"
42
+ end
43
+ end
44
+
45
+ The `debug()``, `info()`, `warn()`, `error()` and `fatal()` honor the current
46
+ log level of `SSHKit.config.output_verbosity`
47
+
34
48
  ## Run a command in a different directory as a different user
35
49
 
36
50
  on hosts do |host|
@@ -50,8 +64,39 @@ This will output:
50
64
  **Note:** This example is a bit misleading, as the `www-data` user doesn't
51
65
  have a shell defined, one cannot switch to that user.
52
66
 
53
- ## Run a command with a different effective group ID
67
+ ## Upload a file from disk
68
+
69
+ on hosts do |host|
70
+ upload! '/config/database.yml', '/opt/my_project/shared/databse.yml'
71
+ end
72
+
73
+ **Note:** The `upload!()` method doesn't honor the values of `in()`, `as()`
74
+ etc, this will be improved as the library matures, but we're not there yet.
54
75
 
76
+ ## Upload a file from a stream
77
+
78
+ on hosts do |host|
79
+ file = File.open('/config/database.yml')
80
+ io = StringIO.new(....)
81
+ upload! file, '/opt/my_project/shared/databse.yml'
82
+ upload! io, '/opt/my_project/shared/io.io.io'
83
+ end
84
+
85
+ The IO streaming is useful for uploading something rather than "cat"ing it,
86
+ for example
87
+
88
+ on hosts do |host|
89
+ contents = StringIO.new('ALL ALL = (ALL) NOPASSWD: ALL')
90
+ upload! contents, '/etc/sudoers.d/yolo'
91
+ end
92
+
93
+ This spares one from having to figure out the correct escaping sequences for
94
+ something like "echo(:cat, '...?...', '> /etc/sudoers.d/yolo')".
95
+
96
+ **Note:** The `upload!()` method doesn't honor the values of `in()`, `as()`
97
+ etc, this will be improved as the library matures, but we're not there yet.
98
+
99
+ ## Run a command with a different effective group ID
55
100
 
56
101
  on hosts do |host|
57
102
  as user: 'www-data', group: 'project-group' do
@@ -60,6 +105,7 @@ have a shell defined, one cannot switch to that user.
60
105
  execute :ls, '-l'
61
106
  end
62
107
  end
108
+ end
63
109
 
64
110
  One will see that the created file is owned by the user `www-data` and the
65
111
  group `project-group`.
data/Gemfile CHANGED
@@ -1,2 +1,3 @@
1
- source :rubygems
1
+ source 'https://rubygems.org'
2
+
2
3
  gemspec
data/README.md CHANGED
@@ -193,13 +193,13 @@ At present the `Logger::WARN`, `ERROR` and `FATAL` are not used.
193
193
  * No environment handling (sshkit might not need to care)
194
194
  * ~~No arbitrary `Host` properties (example storing `roles` on servers, or other
195
195
  metadata that might be useful in the `on()` block)~~
196
- * No log/warning facility (passing Log messages to the output would work)
196
+ * ~~No log/warning facility (passing Log messages to the output would work)
197
197
  A log object could be made available globally which would emit a LogMessage
198
198
  type object which would be recognised by the formatters that need to care
199
- about them.
200
- * No verbosity control, commands should have a `Logger::LEVEL` on them,
199
+ about them.~~
200
+ * ~~No verbosity control, commands should have a `Logger::LEVEL` on them,
201
201
  user-generated should be at a high level, the commands auto-generated from
202
- the guards and checks from as() and within() should have a lower level.
202
+ the guards and checks from as() and within() should have a lower level.~~
203
203
  * ~~Decide if `execute()` (and friends) should raise on non-zero exit statuses or
204
204
  not, perhaps a family of similarly named bang methods should be the ones to
205
205
  raise. (Perhaps `test()` should be a way to `execute()` without raising, and
@@ -208,8 +208,13 @@ At present the `Logger::WARN`, `ERROR` and `FATAL` are not used.
208
208
  have that method setter do the legwork of updating `SSHKit.config.output` to
209
209
  be an instance of the correct formatter class wrapping the existing output
210
210
  stream.~~
211
+ * No "trace" level debugging for internal stuff, the debug level should be
212
+ reserved for client-level debugging, with trace being (int -1) used
213
+ internally for logging about connection opening, closing, timing out, etc.
214
+ * No method for uploading or downloading files, or the same for saving/loading
215
+ a string to/from a remote file.
211
216
  * No closing of connections, the abstract backend class should include a
212
- cleanup method which is empty but can be overriden by
217
+ cleanup method which is empty but can be overriden by other implementations.
213
218
  * No conncetion pooling, the `connection` method of the NetSSH backend could
214
219
  easily be modified to look into some connection factory for it's objects,
215
220
  saving half a second when running lots of `on()` blocks.
data/Vagrantfile CHANGED
@@ -1,5 +1,6 @@
1
- # -*- mode: ruby -*-
2
- # vi: set ft=ruby :
1
+ #
2
+ # vi: set ft=ruby
3
+ #
3
4
 
4
5
  Vagrant::Config.run do |config|
5
6
 
data/lib/sshkit/all.rb CHANGED
@@ -8,6 +8,8 @@ require_relative 'command'
8
8
  require_relative 'configuration'
9
9
  require_relative 'coordinator'
10
10
 
11
+ require_relative 'log_message'
12
+
11
13
  require_relative 'formatters/abstract'
12
14
  require_relative 'formatters/black_hole'
13
15
  require_relative 'formatters/pretty'
@@ -1,4 +1,5 @@
1
1
  module SSHKit
2
+
2
3
  module Backend
3
4
 
4
5
  MethodUnavailableError = Class.new(SSHKit::StandardError)
@@ -17,6 +18,30 @@ module SSHKit
17
18
  @block = block
18
19
  end
19
20
 
21
+ def log(messages)
22
+ info(messages)
23
+ end
24
+
25
+ def fatal(messages)
26
+ output << LogMessage.new(Logger::FATAL, messages)
27
+ end
28
+
29
+ def error(messages)
30
+ output << LogMessage.new(Logger::ERROR, messages)
31
+ end
32
+
33
+ def warn(messages)
34
+ output << LogMessage.new(Logger::WARN, messages)
35
+ end
36
+
37
+ def info(messages)
38
+ output << LogMessage.new(Logger::INFO, messages)
39
+ end
40
+
41
+ def debug(messages)
42
+ output << LogMessage.new(Logger::DEBUG, messages)
43
+ end
44
+
20
45
  def make(commands=[])
21
46
  raise MethodUnavailableError
22
47
  end
@@ -48,8 +73,8 @@ module SSHKit
48
73
  then echo "Directory does not exist '#{File.join(@pwd)}'" 1>&2
49
74
  false
50
75
  fi
51
- EOTEST
52
- yield
76
+ EOTEST
77
+ yield
53
78
  ensure
54
79
  @pwd.pop
55
80
  end
@@ -95,5 +120,7 @@ module SSHKit
95
120
  end
96
121
 
97
122
  end
123
+
98
124
  end
125
+
99
126
  end
@@ -37,6 +37,18 @@ module SSHKit
37
37
  _execute(*[*args, options]).stdout.strip
38
38
  end
39
39
 
40
+ def upload!(local, remote, options = {})
41
+ ssh.scp.upload!(local, remote, options) do
42
+ warn "Progress"
43
+ end
44
+ end
45
+
46
+ def download!(remote, local=nil, options = {})
47
+ ssh.scp.download!(remote, local, options) do
48
+ warn "Progress"
49
+ end
50
+ end
51
+
40
52
  class << self
41
53
  def configure
42
54
  yield config
@@ -7,10 +7,9 @@ module SSHKit
7
7
  class Dot < Abstract
8
8
 
9
9
  def write(obj)
10
- if obj.is_a? SSHKit::Command
11
- if obj.finished?
12
- original_output << (obj.failure? ? c.red('.') : c.green('.'))
13
- end
10
+ return unless obj === SSHKit::Command
11
+ if obj.finished?
12
+ original_output << (obj.failure? ? c.red('.') : c.green('.'))
14
13
  end
15
14
  end
16
15
  alias :<< :write
@@ -7,42 +7,48 @@ module SSHKit
7
7
  class Pretty < Abstract
8
8
 
9
9
  def write(obj)
10
- if obj.is_a? SSHKit::Command
11
-
12
- return if obj.verbosity < SSHKit.config.output_verbosity
10
+ return if obj.verbosity < SSHKit.config.output_verbosity
11
+ case obj
12
+ when SSHKit::Command then write_command(obj)
13
+ when SSHKit::LogMessage then write_log_message(obj)
14
+ else
15
+ original_output << c.black(c.on_yellow("Output formatter doesn't know how to handle #{obj.class}\n"))
16
+ end
17
+ end
18
+ alias :<< :write
13
19
 
14
- unless obj.started?
15
- original_output << level(obj.verbosity) + uuid(obj) + "Running #{c.yellow(c.bold(String(obj)))} on #{c.blue(obj.host.to_s)}\n"
16
- if SSHKit.config.output_verbosity == Logger::DEBUG
17
- original_output << level(Logger::DEBUG) + uuid(obj) + c.white("Command: #{c.blue(obj.to_command)}") + "\n"
18
- end
19
- end
20
+ private
20
21
 
22
+ def write_command(command)
23
+ unless command.started?
24
+ original_output << level(command.verbosity) + uuid(command) + "Running #{c.yellow(c.bold(String(command)))} on #{c.blue(command.host.to_s)}\n"
21
25
  if SSHKit.config.output_verbosity == Logger::DEBUG
22
- if obj.complete? && !obj.stdout.empty?
23
- obj.stdout.lines.each do |line|
24
- original_output << level(Logger::DEBUG) + uuid(obj) + c.green("\t" + line)
25
- end
26
- end
26
+ original_output << level(Logger::DEBUG) + uuid(command) + c.white("Command: #{c.blue(command.to_command)}") + "\n"
27
+ end
28
+ end
27
29
 
28
- if obj.complete? && !obj.stderr.empty?
29
- obj.stderr.lines.each do |line|
30
- original_output << level(Logger::DEBUG) + uuid(obj) + c.red("\t" + line)
31
- end
30
+ if SSHKit.config.output_verbosity == Logger::DEBUG
31
+ if command.complete? && !command.stdout.empty?
32
+ command.stdout.lines.each do |line|
33
+ original_output << level(Logger::DEBUG) + uuid(command) + c.green("\t" + line)
32
34
  end
33
35
  end
34
36
 
35
- if obj.finished?
36
- original_output << level(obj.verbosity) + uuid(obj) + "Finished in #{sprintf('%5.3f seconds', obj.runtime)} command #{c.bold { obj.failure? ? c.red('failed') : c.green('successful') }}.\n"
37
+ if command.complete? && !command.stderr.empty?
38
+ command.stderr.lines.each do |line|
39
+ original_output << level(Logger::DEBUG) + uuid(command) + c.red("\t" + line)
40
+ end
37
41
  end
42
+ end
38
43
 
39
- else
40
- original_output << c.black(c.on_yellow("Output formatter doesn't know how to handle #{obj.inspect}\n"))
44
+ if command.finished?
45
+ original_output << level(command.verbosity) + uuid(command) + "Finished in #{sprintf('%5.3f seconds', command.runtime)} command #{c.bold { command.failure? ? c.red('failed') : c.green('successful') }}.\n"
41
46
  end
42
47
  end
43
- alias :<< :write
44
48
 
45
- private
49
+ def write_log_message(log_message)
50
+ original_output << level(log_message.verbosity) + log_message.to_s + "\n"
51
+ end
46
52
 
47
53
  def c
48
54
  @c ||= Term::ANSIColor
@@ -59,11 +65,11 @@ module SSHKit
59
65
  end
60
66
 
61
67
  def level_formatting(level_num)
62
- %w{black blue yellow red red }[level_num]
68
+ %w{ black blue yellow red red }[level_num]
63
69
  end
64
70
 
65
71
  def level_names(level_num)
66
- %w{DEBUG INFO WARN ERROR FATAL}[level_num]
72
+ %w{ DEBUG INFO WARN ERROR FATAL }[level_num]
67
73
  end
68
74
 
69
75
  end
@@ -0,0 +1,13 @@
1
+ module SSHKit
2
+
3
+ class LogMessage
4
+ attr_reader :verbosity, :message
5
+ def initialize(verbosity, message)
6
+ @verbosity, @message = verbosity, message
7
+ end
8
+ def to_s
9
+ @message.to_s.strip
10
+ end
11
+ end
12
+
13
+ end
@@ -1,3 +1,3 @@
1
1
  module SSHKit
2
- VERSION = "0.0.21"
2
+ VERSION = "0.0.22"
3
3
  end
data/sshkit.gemspec CHANGED
@@ -20,7 +20,6 @@ Gem::Specification.new do |gem|
20
20
  gem.add_dependency('term-ansicolor')
21
21
 
22
22
  gem.add_development_dependency('minitest', ['>= 2.11.3', '< 2.12.0'])
23
- gem.add_development_dependency('autotest')
24
23
  gem.add_development_dependency('rake')
25
24
  gem.add_development_dependency('turn')
26
25
  gem.add_development_dependency('unindent')
@@ -1,4 +1,5 @@
1
1
  require 'helper'
2
+ require 'securerandom'
2
3
  require 'benchmark'
3
4
 
4
5
  module SSHKit
@@ -92,6 +93,44 @@ module SSHKit
92
93
  assert_match "sleep 5", process_list
93
94
  end
94
95
 
96
+ def test_upload_file
97
+ file_contents = ""
98
+ file_name = File.join("/tmp", SecureRandom.uuid)
99
+ File.open file_name, 'w+' do |f|
100
+ f.write 'example_file'
101
+ end
102
+ Netssh.new(a_host) do
103
+ upload!(file_name, file_name)
104
+ file_contents = capture(:cat, file_name)
105
+ end.run
106
+ assert_equal "example_file", file_contents
107
+ end
108
+
109
+ def test_upload_string_io
110
+ file_contents = ""
111
+ Netssh.new(a_host) do |host|
112
+ file_name = File.join("/tmp", SecureRandom.uuid)
113
+ upload!(StringIO.new('example_io'), file_name)
114
+ file_contents = download!(file_name)
115
+ end.run
116
+ assert_equal "example_io", file_contents
117
+ end
118
+
119
+ def test_upload_large_file
120
+ size = 25
121
+ fills = SecureRandom.random_bytes(1024*1024)
122
+ file_name = "/tmp/file-#{size}.txt"
123
+ File.open(file_name, 'w') do |f|
124
+ (size).times {f.write(fills) }
125
+ end
126
+ file_contents = ""
127
+ Netssh.new(a_host) do
128
+ upload!(file_name, file_name)
129
+ file_contents = download!(file_name)
130
+ end.run
131
+ assert_equal File.open(file_name).read, file_contents
132
+ end
133
+
95
134
  end
96
135
 
97
136
  end
@@ -0,0 +1,51 @@
1
+ require 'helper'
2
+ require 'sshkit'
3
+
4
+ module SSHKit
5
+ class TestPretty < UnitTest
6
+
7
+ def setup
8
+ SSHKit.config.output_verbosity = Logger::DEBUG
9
+ end
10
+
11
+ def output
12
+ @_output ||= String.new
13
+ end
14
+
15
+ def pretty
16
+ @_pretty ||= SSHKit::Formatter::Pretty.new(output)
17
+ end
18
+
19
+ def teardown
20
+ remove_instance_variable :@_pretty
21
+ remove_instance_variable :@_output
22
+ SSHKit.reset_configuration!
23
+ end
24
+
25
+ def test_logging_fatal
26
+ pretty << SSHKit::LogMessage.new(Logger::FATAL, "Test")
27
+ assert_equal output.strip, " \e[31mFATAL\e[0m Test \n".strip
28
+ end
29
+
30
+ def test_logging_error
31
+ pretty << SSHKit::LogMessage.new(Logger::ERROR, "Test")
32
+ assert_equal output.strip, " \e[31mERROR\e[0m Test \n".strip
33
+ end
34
+
35
+ def test_logging_warn
36
+ pretty << SSHKit::LogMessage.new(Logger::WARN, "Test")
37
+ assert_equal output.strip, " \e[33mWARN\e[0m Test \n".strip
38
+ end
39
+
40
+ def test_logging_info
41
+ pretty << SSHKit::LogMessage.new(Logger::INFO, "Test")
42
+ assert_equal output.strip, " \e[34mINFO\e[0m Test \n".strip
43
+ end
44
+
45
+ def test_logging_debug
46
+ pretty << SSHKit::LogMessage.new(Logger::DEBUG, "Test")
47
+ assert_equal output.strip, " \e[30mDEBUG\e[0m Test \n".strip
48
+ end
49
+
50
+ end
51
+ end
metadata CHANGED
@@ -1,7 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sshkit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.21
4
+ version: 0.0.22
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Lee Hambley
@@ -9,41 +10,46 @@ authors:
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2013-03-22 00:00:00.000000000 Z
13
+ date: 2013-03-29 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: net-ssh
16
17
  requirement: !ruby/object:Gem::Requirement
18
+ none: false
17
19
  requirements:
18
- - - '>='
20
+ - - ! '>='
19
21
  - !ruby/object:Gem::Version
20
22
  version: '0'
21
23
  type: :runtime
22
24
  prerelease: false
23
25
  version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
24
27
  requirements:
25
- - - '>='
28
+ - - ! '>='
26
29
  - !ruby/object:Gem::Version
27
30
  version: '0'
28
31
  - !ruby/object:Gem::Dependency
29
32
  name: term-ansicolor
30
33
  requirement: !ruby/object:Gem::Requirement
34
+ none: false
31
35
  requirements:
32
- - - '>='
36
+ - - ! '>='
33
37
  - !ruby/object:Gem::Version
34
38
  version: '0'
35
39
  type: :runtime
36
40
  prerelease: false
37
41
  version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
38
43
  requirements:
39
- - - '>='
44
+ - - ! '>='
40
45
  - !ruby/object:Gem::Version
41
46
  version: '0'
42
47
  - !ruby/object:Gem::Dependency
43
48
  name: minitest
44
49
  requirement: !ruby/object:Gem::Requirement
50
+ none: false
45
51
  requirements:
46
- - - '>='
52
+ - - ! '>='
47
53
  - !ruby/object:Gem::Version
48
54
  version: 2.11.3
49
55
  - - <
@@ -52,137 +58,140 @@ dependencies:
52
58
  type: :development
53
59
  prerelease: false
54
60
  version_requirements: !ruby/object:Gem::Requirement
61
+ none: false
55
62
  requirements:
56
- - - '>='
63
+ - - ! '>='
57
64
  - !ruby/object:Gem::Version
58
65
  version: 2.11.3
59
66
  - - <
60
67
  - !ruby/object:Gem::Version
61
68
  version: 2.12.0
62
- - !ruby/object:Gem::Dependency
63
- name: autotest
64
- requirement: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - '>='
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
- type: :development
70
- prerelease: false
71
- version_requirements: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - '>='
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
69
  - !ruby/object:Gem::Dependency
77
70
  name: rake
78
71
  requirement: !ruby/object:Gem::Requirement
72
+ none: false
79
73
  requirements:
80
- - - '>='
74
+ - - ! '>='
81
75
  - !ruby/object:Gem::Version
82
76
  version: '0'
83
77
  type: :development
84
78
  prerelease: false
85
79
  version_requirements: !ruby/object:Gem::Requirement
80
+ none: false
86
81
  requirements:
87
- - - '>='
82
+ - - ! '>='
88
83
  - !ruby/object:Gem::Version
89
84
  version: '0'
90
85
  - !ruby/object:Gem::Dependency
91
86
  name: turn
92
87
  requirement: !ruby/object:Gem::Requirement
88
+ none: false
93
89
  requirements:
94
- - - '>='
90
+ - - ! '>='
95
91
  - !ruby/object:Gem::Version
96
92
  version: '0'
97
93
  type: :development
98
94
  prerelease: false
99
95
  version_requirements: !ruby/object:Gem::Requirement
96
+ none: false
100
97
  requirements:
101
- - - '>='
98
+ - - ! '>='
102
99
  - !ruby/object:Gem::Version
103
100
  version: '0'
104
101
  - !ruby/object:Gem::Dependency
105
102
  name: unindent
106
103
  requirement: !ruby/object:Gem::Requirement
104
+ none: false
107
105
  requirements:
108
- - - '>='
106
+ - - ! '>='
109
107
  - !ruby/object:Gem::Version
110
108
  version: '0'
111
109
  type: :development
112
110
  prerelease: false
113
111
  version_requirements: !ruby/object:Gem::Requirement
112
+ none: false
114
113
  requirements:
115
- - - '>='
114
+ - - ! '>='
116
115
  - !ruby/object:Gem::Version
117
116
  version: '0'
118
117
  - !ruby/object:Gem::Dependency
119
118
  name: mocha
120
119
  requirement: !ruby/object:Gem::Requirement
120
+ none: false
121
121
  requirements:
122
- - - '>='
122
+ - - ! '>='
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  type: :development
126
126
  prerelease: false
127
127
  version_requirements: !ruby/object:Gem::Requirement
128
+ none: false
128
129
  requirements:
129
- - - '>='
130
+ - - ! '>='
130
131
  - !ruby/object:Gem::Version
131
132
  version: '0'
132
133
  - !ruby/object:Gem::Dependency
133
134
  name: debugger
134
135
  requirement: !ruby/object:Gem::Requirement
136
+ none: false
135
137
  requirements:
136
- - - '>='
138
+ - - ! '>='
137
139
  - !ruby/object:Gem::Version
138
140
  version: '0'
139
141
  type: :development
140
142
  prerelease: false
141
143
  version_requirements: !ruby/object:Gem::Requirement
144
+ none: false
142
145
  requirements:
143
- - - '>='
146
+ - - ! '>='
144
147
  - !ruby/object:Gem::Version
145
148
  version: '0'
146
149
  - !ruby/object:Gem::Dependency
147
150
  name: vagrant
148
151
  requirement: !ruby/object:Gem::Requirement
152
+ none: false
149
153
  requirements:
150
- - - '>='
154
+ - - ! '>='
151
155
  - !ruby/object:Gem::Version
152
156
  version: '0'
153
157
  type: :development
154
158
  prerelease: false
155
159
  version_requirements: !ruby/object:Gem::Requirement
160
+ none: false
156
161
  requirements:
157
- - - '>='
162
+ - - ! '>='
158
163
  - !ruby/object:Gem::Version
159
164
  version: '0'
160
165
  - !ruby/object:Gem::Dependency
161
166
  name: yard
162
167
  requirement: !ruby/object:Gem::Requirement
168
+ none: false
163
169
  requirements:
164
- - - '>='
170
+ - - ! '>='
165
171
  - !ruby/object:Gem::Version
166
172
  version: '0'
167
173
  type: :development
168
174
  prerelease: false
169
175
  version_requirements: !ruby/object:Gem::Requirement
176
+ none: false
170
177
  requirements:
171
- - - '>='
178
+ - - ! '>='
172
179
  - !ruby/object:Gem::Version
173
180
  version: '0'
174
181
  - !ruby/object:Gem::Dependency
175
182
  name: redcarpet
176
183
  requirement: !ruby/object:Gem::Requirement
184
+ none: false
177
185
  requirements:
178
- - - '>='
186
+ - - ! '>='
179
187
  - !ruby/object:Gem::Version
180
188
  version: '0'
181
189
  type: :development
182
190
  prerelease: false
183
191
  version_requirements: !ruby/object:Gem::Requirement
192
+ none: false
184
193
  requirements:
185
- - - '>='
194
+ - - ! '>='
186
195
  - !ruby/object:Gem::Version
187
196
  version: '0'
188
197
  description: A comprehensive toolkit for remotely running commands in a structured
@@ -225,6 +234,7 @@ files:
225
234
  - lib/sshkit/formatters/dot.rb
226
235
  - lib/sshkit/formatters/pretty.rb
227
236
  - lib/sshkit/host.rb
237
+ - lib/sshkit/log_message.rb
228
238
  - lib/sshkit/runners/abstract.rb
229
239
  - lib/sshkit/runners/group.rb
230
240
  - lib/sshkit/runners/parallel.rb
@@ -238,32 +248,34 @@ files:
238
248
  - test/unit/backends/test_netssh.rb
239
249
  - test/unit/backends/test_printer.rb
240
250
  - test/unit/core_ext/test_string.rb
251
+ - test/unit/formatters/test_pretty.rb
241
252
  - test/unit/test_command.rb
242
253
  - test/unit/test_configuration.rb
243
254
  - test/unit/test_coordinator.rb
244
255
  - test/unit/test_host.rb
245
256
  homepage: http://wacku.github.com/sshkit
246
257
  licenses: []
247
- metadata: {}
248
258
  post_install_message:
249
259
  rdoc_options: []
250
260
  require_paths:
251
261
  - lib
252
262
  required_ruby_version: !ruby/object:Gem::Requirement
263
+ none: false
253
264
  requirements:
254
- - - '>='
265
+ - - ! '>='
255
266
  - !ruby/object:Gem::Version
256
267
  version: '0'
257
268
  required_rubygems_version: !ruby/object:Gem::Requirement
269
+ none: false
258
270
  requirements:
259
- - - '>='
271
+ - - ! '>='
260
272
  - !ruby/object:Gem::Version
261
273
  version: '0'
262
274
  requirements: []
263
275
  rubyforge_project:
264
- rubygems_version: 2.0.0
276
+ rubygems_version: 1.8.23
265
277
  signing_key:
266
- specification_version: 4
278
+ specification_version: 3
267
279
  summary: SSHKit makes it easy to write structured, testable SSH commands in Ruby
268
280
  test_files:
269
281
  - test/functional/backends/test_netssh.rb
@@ -273,7 +285,9 @@ test_files:
273
285
  - test/unit/backends/test_netssh.rb
274
286
  - test/unit/backends/test_printer.rb
275
287
  - test/unit/core_ext/test_string.rb
288
+ - test/unit/formatters/test_pretty.rb
276
289
  - test/unit/test_command.rb
277
290
  - test/unit/test_configuration.rb
278
291
  - test/unit/test_coordinator.rb
279
292
  - test/unit/test_host.rb
293
+ has_rdoc:
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA1:
3
- metadata.gz: 8db213100be25113e238342987c5a12ed7412b15
4
- data.tar.gz: 7067bc10963a3d8f98f45711075418bed865c590
5
- SHA512:
6
- metadata.gz: ab26645180f7f6ecc458735ec542b620024ee612d35738c0219d7add6a20fc7388e1b9f4c872370e9a2fb74dd100a7efc740d0b73d517b391a411b7f29104e92
7
- data.tar.gz: f3f840a846d275c20ad325134eb37caa582cf20d7025bf15a69ca82c024ef10ee2c797505d26e4d7f284499b4a5707f46c2c783ac66534db9e2ccdad23fe4342