sshkit 0.0.21 → 0.0.22

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.
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