minestrone 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/.github/workflows/main.yml +32 -0
- data/.gitignore +5 -0
- data/Gemfile +10 -0
- data/LICENSE.txt +22 -0
- data/README.md +35 -0
- data/Rakefile +10 -0
- data/bin/capify +89 -0
- data/bin/min +5 -0
- data/docs/lib-codebase-map.md +162 -0
- data/docs/lib-dependency-graph.svg +129 -0
- data/lib/minestrone/callback.rb +45 -0
- data/lib/minestrone/cli/help.rb +131 -0
- data/lib/minestrone/cli/help.txt +72 -0
- data/lib/minestrone/cli/options.rb +232 -0
- data/lib/minestrone/cli.rb +159 -0
- data/lib/minestrone/command.rb +177 -0
- data/lib/minestrone/configuration/actions/file_transfer.rb +53 -0
- data/lib/minestrone/configuration/actions/inspect.rb +46 -0
- data/lib/minestrone/configuration/actions/invocation.rb +202 -0
- data/lib/minestrone/configuration/alias_task.rb +29 -0
- data/lib/minestrone/configuration/callbacks.rb +129 -0
- data/lib/minestrone/configuration/connections.rb +66 -0
- data/lib/minestrone/configuration/execution.rb +139 -0
- data/lib/minestrone/configuration/loading.rb +207 -0
- data/lib/minestrone/configuration/log_formatters.rb +75 -0
- data/lib/minestrone/configuration/namespaces.rb +225 -0
- data/lib/minestrone/configuration/servers.rb +70 -0
- data/lib/minestrone/configuration/variables.rb +115 -0
- data/lib/minestrone/configuration.rb +69 -0
- data/lib/minestrone/errors.rb +17 -0
- data/lib/minestrone/ext/string.rb +7 -0
- data/lib/minestrone/extensions.rb +56 -0
- data/lib/minestrone/logger.rb +171 -0
- data/lib/minestrone/processable.rb +50 -0
- data/lib/minestrone/recipes/deploy/assets.rb +194 -0
- data/lib/minestrone/recipes/deploy/bundler.rb +81 -0
- data/lib/minestrone/recipes/deploy/dependencies.rb +44 -0
- data/lib/minestrone/recipes/deploy/local_dependency.rb +45 -0
- data/lib/minestrone/recipes/deploy/remote_dependency.rb +119 -0
- data/lib/minestrone/recipes/deploy/scm/base.rb +204 -0
- data/lib/minestrone/recipes/deploy/scm/git.rb +284 -0
- data/lib/minestrone/recipes/deploy/scm/none.rb +54 -0
- data/lib/minestrone/recipes/deploy/scm.rb +22 -0
- data/lib/minestrone/recipes/deploy/strategy/base.rb +87 -0
- data/lib/minestrone/recipes/deploy/strategy/copy.rb +353 -0
- data/lib/minestrone/recipes/deploy/strategy/remote_cache.rb +80 -0
- data/lib/minestrone/recipes/deploy/strategy.rb +22 -0
- data/lib/minestrone/recipes/deploy.rb +639 -0
- data/lib/minestrone/recipes/standard.rb +23 -0
- data/lib/minestrone/recipes/templates/maintenance.rhtml +53 -0
- data/lib/minestrone/server_definition.rb +56 -0
- data/lib/minestrone/ssh.rb +81 -0
- data/lib/minestrone/task_definition.rb +82 -0
- data/lib/minestrone/transfer.rb +205 -0
- data/lib/minestrone/version.rb +11 -0
- data/lib/minestrone.rb +3 -0
- data/minestrone.gemspec +32 -0
- data/test/cli/execute_test.rb +130 -0
- data/test/cli/help_test.rb +178 -0
- data/test/cli/options_test.rb +315 -0
- data/test/cli/ui_test.rb +26 -0
- data/test/cli_test.rb +17 -0
- data/test/command_test.rb +305 -0
- data/test/configuration/actions/file_transfer_test.rb +61 -0
- data/test/configuration/actions/inspect_test.rb +76 -0
- data/test/configuration/actions/invocation_test.rb +258 -0
- data/test/configuration/alias_task_test.rb +110 -0
- data/test/configuration/callbacks_test.rb +201 -0
- data/test/configuration/connections_test.rb +192 -0
- data/test/configuration/execution_test.rb +176 -0
- data/test/configuration/loading_test.rb +149 -0
- data/test/configuration/namespace_dsl_test.rb +325 -0
- data/test/configuration/servers_test.rb +100 -0
- data/test/configuration/variables_test.rb +191 -0
- data/test/configuration_test.rb +77 -0
- data/test/deploy/local_dependency_test.rb +61 -0
- data/test/deploy/remote_dependency_test.rb +146 -0
- data/test/deploy/scm/base_test.rb +55 -0
- data/test/deploy/scm/git_test.rb +260 -0
- data/test/deploy/scm/none_test.rb +26 -0
- data/test/deploy/strategy/copy_test.rb +360 -0
- data/test/extensions_test.rb +69 -0
- data/test/fixtures/cli_integration.rb +5 -0
- data/test/fixtures/config.rb +4 -0
- data/test/fixtures/custom.rb +3 -0
- data/test/logger_formatting_test.rb +149 -0
- data/test/logger_test.rb +134 -0
- data/test/recipes_test.rb +26 -0
- data/test/server_definition_test.rb +121 -0
- data/test/ssh_test.rb +99 -0
- data/test/task_definition_test.rb +117 -0
- data/test/transfer_test.rb +172 -0
- data/test/utils.rb +28 -0
- data/test/version_test.rb +11 -0
- metadata +258 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
require "utils"
|
|
2
|
+
require 'minestrone/task_definition'
|
|
3
|
+
|
|
4
|
+
# Silences the wanrnings raised in the two deprecation tests
|
|
5
|
+
$VERBOSE = nil
|
|
6
|
+
|
|
7
|
+
class TaskDefinitionTest < Test::Unit::TestCase
|
|
8
|
+
def setup
|
|
9
|
+
@namespace = namespace
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def test_fqn_at_top_level_should_be_task_name
|
|
13
|
+
task = new_task(:testing)
|
|
14
|
+
assert_equal "testing", task.fully_qualified_name
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def test_fqn_in_namespace_should_include_namespace_fqn
|
|
18
|
+
ns = namespace("outer:inner")
|
|
19
|
+
task = new_task(:testing, ns)
|
|
20
|
+
assert_equal "outer:inner:testing", task.fully_qualified_name
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def test_fqn_at_top_level_when_default_should_be_default
|
|
24
|
+
task = new_task(:default)
|
|
25
|
+
assert_equal "default", task.fully_qualified_name
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def test_name_should_change_task_name
|
|
29
|
+
task = new_task(:foo)
|
|
30
|
+
task.name = :bar
|
|
31
|
+
|
|
32
|
+
assert_equal :bar, task.name
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def test_raise_an_exception_when_task_names_can_not_be_converted
|
|
36
|
+
task = new_task('valid task name')
|
|
37
|
+
|
|
38
|
+
assert_raises(ArgumentError) { task.name = ['invalid task name'] }
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def test_fqn_in_namespace_when_default_should_be_namespace_fqn
|
|
42
|
+
ns = namespace("outer:inner")
|
|
43
|
+
task = new_task(:default, ns)
|
|
44
|
+
ns.stubs(:default_task => task)
|
|
45
|
+
assert_equal "outer:inner", task.fully_qualified_name
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def test_task_should_require_block
|
|
49
|
+
assert_raises(ArgumentError) do
|
|
50
|
+
Minestrone::TaskDefinition.new(:testing, @namespace)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def test_description_should_return_empty_string_if_not_given
|
|
55
|
+
assert_equal "", new_task(:testing).description
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def test_description_should_return_desc_attribute
|
|
59
|
+
assert_equal "something", new_task(:testing, @namespace, :desc => "something").description
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def test_description_should_strip_leading_and_trailing_whitespace
|
|
63
|
+
assert_equal "something", new_task(:testing, @namespace, :desc => " something ").description
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def test_description_should_normalize_newlines
|
|
67
|
+
assert_equal "a\nb\nc", new_task(:testing, @namespace, :desc => "a\nb\r\nc").description
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def test_description_should_detect_and_remove_indentation
|
|
71
|
+
desc = <<-DESC
|
|
72
|
+
Here is some indented text \
|
|
73
|
+
and I want all of this to \
|
|
74
|
+
run together on a single line, \
|
|
75
|
+
without any extraneous spaces.
|
|
76
|
+
|
|
77
|
+
additional indentation will
|
|
78
|
+
be preserved.
|
|
79
|
+
DESC
|
|
80
|
+
|
|
81
|
+
task = new_task(:testing, @namespace, :desc => desc)
|
|
82
|
+
assert_equal "Here is some indented text and I want all of this to run together on a single line, without any extraneous spaces.\n\n additional indentation will\n be preserved.", task.description
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def test_description_munging_should_be_sensitive_to_code_blocks
|
|
86
|
+
desc = <<-DESC
|
|
87
|
+
Here is a line \
|
|
88
|
+
wrapped with spacing in it.
|
|
89
|
+
|
|
90
|
+
foo bar
|
|
91
|
+
baz bang
|
|
92
|
+
DESC
|
|
93
|
+
|
|
94
|
+
task = new_task(:testing, @namespace, :desc => desc)
|
|
95
|
+
assert_equal "Here is a line wrapped with spacing in it.\n\n foo bar\n baz bang", task.description
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def test_brief_description_should_return_first_sentence_in_description
|
|
99
|
+
desc = "This is the task. It does all kinds of things."
|
|
100
|
+
task = new_task(:testing, @namespace, :desc => desc)
|
|
101
|
+
assert_equal "This is the task.", task.brief_description
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def test_brief_description_should_truncate_if_length_given
|
|
105
|
+
desc = "This is the task that does all kinds of things. And then some."
|
|
106
|
+
task = new_task(:testing, @namespace, :desc => desc)
|
|
107
|
+
assert_equal "This is the task ...", task.brief_description(20)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def test_brief_description_should_not_break_at_period_in_middle_of_sentence
|
|
111
|
+
task = new_task(:testing, @namespace, :desc => "Take file.txt and copy it.")
|
|
112
|
+
assert_equal "Take file.txt and copy it.", task.brief_description
|
|
113
|
+
|
|
114
|
+
task = new_task(:testing, @namespace, :desc => "Take file.txt and copy it. Then do something else.")
|
|
115
|
+
assert_equal "Take file.txt and copy it.", task.brief_description
|
|
116
|
+
end
|
|
117
|
+
end
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
require 'utils'
|
|
2
|
+
require 'minestrone/transfer'
|
|
3
|
+
|
|
4
|
+
class TransferTest < Test::Unit::TestCase
|
|
5
|
+
def test_class_process_should_delegate_to_instance_process
|
|
6
|
+
s = session('app1')
|
|
7
|
+
Minestrone::Transfer.expects(:new).with(:up, "from", "to", s, {}).returns(mock('transfer', :process! => nil)).yields
|
|
8
|
+
yielded = false
|
|
9
|
+
Minestrone::Transfer.process(:up, "from", "to", s, {}) { yielded = true }
|
|
10
|
+
assert yielded
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def test_default_transport_is_sftp
|
|
14
|
+
transfer = Minestrone::Transfer.new(:up, "from", "to", session('app1', :sftp))
|
|
15
|
+
assert_equal :sftp, transfer.transport
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test_active_is_true_when_sftp_transfer_is_active
|
|
19
|
+
s = session('app1', :sftp)
|
|
20
|
+
s.xsftp.expects(:upload).returns(stub('operation', :active? => true))
|
|
21
|
+
transfer = Minestrone::Transfer.new(:up, "from", "to", s, :via => :sftp)
|
|
22
|
+
assert_equal true, transfer.active?
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def test_active_is_false_when_sftp_transfer_is_not_active
|
|
26
|
+
s = session('app1', :sftp)
|
|
27
|
+
s.xsftp.expects(:upload).returns(stub('operation', :active? => false))
|
|
28
|
+
transfer = Minestrone::Transfer.new(:up, "from", "to", s, :via => :sftp)
|
|
29
|
+
assert_equal false, transfer.active?
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def test_active_is_true_when_scp_transfer_is_active
|
|
33
|
+
s = session('app1', :scp)
|
|
34
|
+
channel = stub('channel', :[]= => nil, :active? => true)
|
|
35
|
+
s.scp.expects(:upload).returns(channel)
|
|
36
|
+
transfer = Minestrone::Transfer.new(:up, "from", "to", s, :via => :scp)
|
|
37
|
+
assert_equal true, transfer.active?
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def test_active_is_false_when_scp_transfer_is_not_active
|
|
41
|
+
s = session('app1', :scp)
|
|
42
|
+
channel = stub('channel', :[]= => nil, :active? => false)
|
|
43
|
+
s.scp.expects(:upload).returns(channel)
|
|
44
|
+
transfer = Minestrone::Transfer.new(:up, "from", "to", s, :via => :scp)
|
|
45
|
+
assert_equal false, transfer.active?
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
[:up, :down].each do |direction|
|
|
49
|
+
define_method("test_sftp_#{direction}load_from_file_to_file_should_normalize_from_and_to") do
|
|
50
|
+
s = session('app1', :sftp)
|
|
51
|
+
|
|
52
|
+
s.xsftp.expects("#{direction}load".to_sym).with("from-#{s.xserver.host}", "to-#{s.xserver.host}",
|
|
53
|
+
{ :properties => { :server => s.xserver, :host => s.xserver.host } })
|
|
54
|
+
|
|
55
|
+
transfer = Minestrone::Transfer.new(direction, "from-$CAPISTRANO:HOST$", "to-$CAPISTRANO:HOST$", s)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
define_method("test_scp_#{direction}load_from_file_to_file_should_normalize_from_and_to") do
|
|
59
|
+
s = session('app1', :scp)
|
|
60
|
+
|
|
61
|
+
s.scp.expects("#{direction}load".to_sym).returns({}).with("from-#{s.xserver.host}", "to-#{s.xserver.host}", { :via => :scp })
|
|
62
|
+
|
|
63
|
+
transfer = Minestrone::Transfer.new(direction, "from-$CAPISTRANO:HOST$", "to-$CAPISTRANO:HOST$", s, :via => :scp)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def test_sftp_upload_from_IO_to_file_should_clone_the_IO_for_the_connection
|
|
68
|
+
s = session('app1', :sftp)
|
|
69
|
+
io = StringIO.new("from here")
|
|
70
|
+
|
|
71
|
+
s.xsftp.expects(:upload).with do |from, to, opts|
|
|
72
|
+
from != io && from.is_a?(StringIO) && from.string == io.string &&
|
|
73
|
+
to == "/to/here-#{s.xserver.host}" &&
|
|
74
|
+
opts[:properties][:server] == s.xserver &&
|
|
75
|
+
opts[:properties][:host] == s.xserver.host
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
transfer = Minestrone::Transfer.new(:up, StringIO.new("from here"), "/to/here-$CAPISTRANO:HOST$", s)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def test_scp_upload_from_IO_to_file_should_clone_the_IO_for_the_connection
|
|
82
|
+
s = session('app1', :scp)
|
|
83
|
+
io = StringIO.new("from here")
|
|
84
|
+
|
|
85
|
+
channel = mock('channel')
|
|
86
|
+
channel.expects(:[]=).with(:server, s.xserver)
|
|
87
|
+
channel.expects(:[]=).with(:host, s.xserver.host)
|
|
88
|
+
s.scp.expects(:upload).returns(channel).with do |from, to, opts|
|
|
89
|
+
from != io && from.is_a?(StringIO) && from.string == io.string &&
|
|
90
|
+
to == "/to/here-#{s.xserver.host}"
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
transfer = Minestrone::Transfer.new(:up, StringIO.new("from here"), "/to/here-$CAPISTRANO:HOST$", s, :via => :scp)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def test_process_should_block_until_transfer_is_no_longer_active
|
|
97
|
+
transfer = Minestrone::Transfer.new(:up, "from", "to", session('app1', :sftp))
|
|
98
|
+
transfer.expects(:process_iteration).times(4).yields.returns(true,true,true,false)
|
|
99
|
+
transfer.expects(:active?).times(4)
|
|
100
|
+
transfer.process!
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def test_errors_raised_for_a_sftp_session_should_abort_transfer
|
|
104
|
+
s = session('app1')
|
|
105
|
+
error = ExceptionWithSession.new(s)
|
|
106
|
+
transfer = Minestrone::Transfer.new(:up, "from", "to", session('app1', :sftp))
|
|
107
|
+
transfer.expects(:process_iteration).raises(error).times(3).returns(true, false)
|
|
108
|
+
txfr = mock('transfer', :abort! => true)
|
|
109
|
+
txfr.expects(:[]=).with(:failed, true)
|
|
110
|
+
txfr.expects(:[]=).with(:error, error)
|
|
111
|
+
txfr.stubs(:[]).with(:failed).returns(true)
|
|
112
|
+
txfr.stubs(:[]).with(:server).returns(s.xserver)
|
|
113
|
+
txfr.stubs(:[]).with(:error).returns(error)
|
|
114
|
+
transfer.expects(:transfer).returns(txfr).at_least_once
|
|
115
|
+
assert_raises(Minestrone::TransferError) { transfer.process! }
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def test_errors_raised_for_a_scp_session_should_abort_transfer
|
|
119
|
+
s = session('app1')
|
|
120
|
+
error = ExceptionWithSession.new(s)
|
|
121
|
+
transfer = Minestrone::Transfer.new(:up, "from", "to", session('app1', :scp), :via => :scp)
|
|
122
|
+
transfer.expects(:process_iteration).raises(error).times(3).returns(true, false)
|
|
123
|
+
txfr = mock('channel', :close => true)
|
|
124
|
+
txfr.expects(:[]=).with(:failed, true)
|
|
125
|
+
txfr.expects(:[]=).with(:error, error)
|
|
126
|
+
txfr.stubs(:[]).with(:failed).returns(true)
|
|
127
|
+
txfr.stubs(:[]).with(:server).returns(s.xserver)
|
|
128
|
+
txfr.stubs(:[]).with(:error).returns(error)
|
|
129
|
+
transfer.expects(:transfer).returns(txfr).at_least_once
|
|
130
|
+
assert_raises(Minestrone::TransferError) { transfer.process! }
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def test_uploading_a_non_existing_file_should_raise_an_understandable_error
|
|
134
|
+
s = session('app1')
|
|
135
|
+
error = Minestrone::Processable::SessionAssociation.on(ArgumentError.new('expected a file to upload'), s)
|
|
136
|
+
transfer = Minestrone::Transfer.new(:up, "from", "to", session('app1', :scp), :via => :scp)
|
|
137
|
+
transfer.expects(:process_iteration).raises(error)
|
|
138
|
+
assert_raise(ArgumentError, 'expected a file to upload') { transfer.process! }
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
private
|
|
142
|
+
|
|
143
|
+
class ExceptionWithSession < ::Exception
|
|
144
|
+
attr_reader :session
|
|
145
|
+
|
|
146
|
+
def initialize(session)
|
|
147
|
+
@session = session
|
|
148
|
+
super()
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def session(host, mode = nil)
|
|
153
|
+
session = stub('session', :xserver => stub('server', :host => host))
|
|
154
|
+
case mode
|
|
155
|
+
when :sftp
|
|
156
|
+
sftp = stub('sftp')
|
|
157
|
+
session.expects(:sftp).with(false).returns(sftp)
|
|
158
|
+
sftp.expects(:connect).yields(sftp).returns(sftp)
|
|
159
|
+
operation = stub('operation', :active? => false, :[] => nil)
|
|
160
|
+
sftp.stubs(:upload).returns(operation)
|
|
161
|
+
sftp.stubs(:download).returns(operation)
|
|
162
|
+
session.stubs(:xsftp).returns(sftp)
|
|
163
|
+
when :scp
|
|
164
|
+
channel = stub('channel', :[]= => nil, :[] => nil, :active? => false, :close => true)
|
|
165
|
+
scp = stub('scp')
|
|
166
|
+
scp.stubs(:upload).returns(channel)
|
|
167
|
+
scp.stubs(:download).returns(channel)
|
|
168
|
+
session.stubs(:scp).returns(scp)
|
|
169
|
+
end
|
|
170
|
+
session
|
|
171
|
+
end
|
|
172
|
+
end
|
data/test/utils.rb
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require 'bundler/setup'
|
|
2
|
+
require 'test/unit'
|
|
3
|
+
require 'mocha/test_unit'
|
|
4
|
+
|
|
5
|
+
require 'minestrone/server_definition'
|
|
6
|
+
|
|
7
|
+
module TestExtensions
|
|
8
|
+
def server(host, options = {})
|
|
9
|
+
Minestrone::ServerDefinition.new(host, options)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def namespace(fqn = nil)
|
|
13
|
+
space = stub(:fully_qualified_name => fqn, :default_task => nil)
|
|
14
|
+
yield(space) if block_given?
|
|
15
|
+
space
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def new_task(name, namespace = @namespace, options = {}, &block)
|
|
19
|
+
block ||= Proc.new {}
|
|
20
|
+
task = Minestrone::TaskDefinition.new(name, namespace, options, &block)
|
|
21
|
+
assert_equal block, task.body
|
|
22
|
+
return task
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
class Test::Unit::TestCase
|
|
27
|
+
include TestExtensions
|
|
28
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
require 'minestrone/version'
|
|
2
|
+
|
|
3
|
+
class VersionTest < Test::Unit::TestCase
|
|
4
|
+
def test_version_constant_is_not_nil
|
|
5
|
+
assert_not_nil Minestrone::VERSION
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def test_version_constant_matches_class_method
|
|
9
|
+
assert_equal Minestrone::VERSION, Minestrone::Version.to_s
|
|
10
|
+
end
|
|
11
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: minestrone
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.0.1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Jamis Buck
|
|
8
|
+
- Lee Hambley
|
|
9
|
+
- Kuba Suder
|
|
10
|
+
bindir: bin
|
|
11
|
+
cert_chain: []
|
|
12
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
13
|
+
dependencies:
|
|
14
|
+
- !ruby/object:Gem::Dependency
|
|
15
|
+
name: benchmark
|
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
|
17
|
+
requirements:
|
|
18
|
+
- - "~>"
|
|
19
|
+
- !ruby/object:Gem::Version
|
|
20
|
+
version: '0.5'
|
|
21
|
+
type: :runtime
|
|
22
|
+
prerelease: false
|
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
24
|
+
requirements:
|
|
25
|
+
- - "~>"
|
|
26
|
+
- !ruby/object:Gem::Version
|
|
27
|
+
version: '0.5'
|
|
28
|
+
- !ruby/object:Gem::Dependency
|
|
29
|
+
name: highline
|
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
|
31
|
+
requirements:
|
|
32
|
+
- - ">="
|
|
33
|
+
- !ruby/object:Gem::Version
|
|
34
|
+
version: '0'
|
|
35
|
+
type: :runtime
|
|
36
|
+
prerelease: false
|
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
38
|
+
requirements:
|
|
39
|
+
- - ">="
|
|
40
|
+
- !ruby/object:Gem::Version
|
|
41
|
+
version: '0'
|
|
42
|
+
- !ruby/object:Gem::Dependency
|
|
43
|
+
name: net-ssh
|
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
|
45
|
+
requirements:
|
|
46
|
+
- - ">="
|
|
47
|
+
- !ruby/object:Gem::Version
|
|
48
|
+
version: '7.2'
|
|
49
|
+
type: :runtime
|
|
50
|
+
prerelease: false
|
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
52
|
+
requirements:
|
|
53
|
+
- - ">="
|
|
54
|
+
- !ruby/object:Gem::Version
|
|
55
|
+
version: '7.2'
|
|
56
|
+
- !ruby/object:Gem::Dependency
|
|
57
|
+
name: net-sftp
|
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
|
59
|
+
requirements:
|
|
60
|
+
- - ">="
|
|
61
|
+
- !ruby/object:Gem::Version
|
|
62
|
+
version: '3.0'
|
|
63
|
+
type: :runtime
|
|
64
|
+
prerelease: false
|
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
66
|
+
requirements:
|
|
67
|
+
- - ">="
|
|
68
|
+
- !ruby/object:Gem::Version
|
|
69
|
+
version: '3.0'
|
|
70
|
+
- !ruby/object:Gem::Dependency
|
|
71
|
+
name: net-scp
|
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
|
73
|
+
requirements:
|
|
74
|
+
- - ">="
|
|
75
|
+
- !ruby/object:Gem::Version
|
|
76
|
+
version: '3.0'
|
|
77
|
+
type: :runtime
|
|
78
|
+
prerelease: false
|
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
80
|
+
requirements:
|
|
81
|
+
- - ">="
|
|
82
|
+
- !ruby/object:Gem::Version
|
|
83
|
+
version: '3.0'
|
|
84
|
+
- !ruby/object:Gem::Dependency
|
|
85
|
+
name: logger
|
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
|
87
|
+
requirements:
|
|
88
|
+
- - ">="
|
|
89
|
+
- !ruby/object:Gem::Version
|
|
90
|
+
version: '0'
|
|
91
|
+
type: :runtime
|
|
92
|
+
prerelease: false
|
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
94
|
+
requirements:
|
|
95
|
+
- - ">="
|
|
96
|
+
- !ruby/object:Gem::Version
|
|
97
|
+
version: '0'
|
|
98
|
+
description: Minestrone is a utility and framework for executing commands on a remote
|
|
99
|
+
machine, via SSH.
|
|
100
|
+
executables:
|
|
101
|
+
- capify
|
|
102
|
+
- min
|
|
103
|
+
extensions: []
|
|
104
|
+
extra_rdoc_files:
|
|
105
|
+
- README.md
|
|
106
|
+
files:
|
|
107
|
+
- ".github/workflows/main.yml"
|
|
108
|
+
- ".gitignore"
|
|
109
|
+
- Gemfile
|
|
110
|
+
- LICENSE.txt
|
|
111
|
+
- README.md
|
|
112
|
+
- Rakefile
|
|
113
|
+
- bin/capify
|
|
114
|
+
- bin/min
|
|
115
|
+
- docs/lib-codebase-map.md
|
|
116
|
+
- docs/lib-dependency-graph.svg
|
|
117
|
+
- lib/minestrone.rb
|
|
118
|
+
- lib/minestrone/callback.rb
|
|
119
|
+
- lib/minestrone/cli.rb
|
|
120
|
+
- lib/minestrone/cli/help.rb
|
|
121
|
+
- lib/minestrone/cli/help.txt
|
|
122
|
+
- lib/minestrone/cli/options.rb
|
|
123
|
+
- lib/minestrone/command.rb
|
|
124
|
+
- lib/minestrone/configuration.rb
|
|
125
|
+
- lib/minestrone/configuration/actions/file_transfer.rb
|
|
126
|
+
- lib/minestrone/configuration/actions/inspect.rb
|
|
127
|
+
- lib/minestrone/configuration/actions/invocation.rb
|
|
128
|
+
- lib/minestrone/configuration/alias_task.rb
|
|
129
|
+
- lib/minestrone/configuration/callbacks.rb
|
|
130
|
+
- lib/minestrone/configuration/connections.rb
|
|
131
|
+
- lib/minestrone/configuration/execution.rb
|
|
132
|
+
- lib/minestrone/configuration/loading.rb
|
|
133
|
+
- lib/minestrone/configuration/log_formatters.rb
|
|
134
|
+
- lib/minestrone/configuration/namespaces.rb
|
|
135
|
+
- lib/minestrone/configuration/servers.rb
|
|
136
|
+
- lib/minestrone/configuration/variables.rb
|
|
137
|
+
- lib/minestrone/errors.rb
|
|
138
|
+
- lib/minestrone/ext/string.rb
|
|
139
|
+
- lib/minestrone/extensions.rb
|
|
140
|
+
- lib/minestrone/logger.rb
|
|
141
|
+
- lib/minestrone/processable.rb
|
|
142
|
+
- lib/minestrone/recipes/deploy.rb
|
|
143
|
+
- lib/minestrone/recipes/deploy/assets.rb
|
|
144
|
+
- lib/minestrone/recipes/deploy/bundler.rb
|
|
145
|
+
- lib/minestrone/recipes/deploy/dependencies.rb
|
|
146
|
+
- lib/minestrone/recipes/deploy/local_dependency.rb
|
|
147
|
+
- lib/minestrone/recipes/deploy/remote_dependency.rb
|
|
148
|
+
- lib/minestrone/recipes/deploy/scm.rb
|
|
149
|
+
- lib/minestrone/recipes/deploy/scm/base.rb
|
|
150
|
+
- lib/minestrone/recipes/deploy/scm/git.rb
|
|
151
|
+
- lib/minestrone/recipes/deploy/scm/none.rb
|
|
152
|
+
- lib/minestrone/recipes/deploy/strategy.rb
|
|
153
|
+
- lib/minestrone/recipes/deploy/strategy/base.rb
|
|
154
|
+
- lib/minestrone/recipes/deploy/strategy/copy.rb
|
|
155
|
+
- lib/minestrone/recipes/deploy/strategy/remote_cache.rb
|
|
156
|
+
- lib/minestrone/recipes/standard.rb
|
|
157
|
+
- lib/minestrone/recipes/templates/maintenance.rhtml
|
|
158
|
+
- lib/minestrone/server_definition.rb
|
|
159
|
+
- lib/minestrone/ssh.rb
|
|
160
|
+
- lib/minestrone/task_definition.rb
|
|
161
|
+
- lib/minestrone/transfer.rb
|
|
162
|
+
- lib/minestrone/version.rb
|
|
163
|
+
- minestrone.gemspec
|
|
164
|
+
- test/cli/execute_test.rb
|
|
165
|
+
- test/cli/help_test.rb
|
|
166
|
+
- test/cli/options_test.rb
|
|
167
|
+
- test/cli/ui_test.rb
|
|
168
|
+
- test/cli_test.rb
|
|
169
|
+
- test/command_test.rb
|
|
170
|
+
- test/configuration/actions/file_transfer_test.rb
|
|
171
|
+
- test/configuration/actions/inspect_test.rb
|
|
172
|
+
- test/configuration/actions/invocation_test.rb
|
|
173
|
+
- test/configuration/alias_task_test.rb
|
|
174
|
+
- test/configuration/callbacks_test.rb
|
|
175
|
+
- test/configuration/connections_test.rb
|
|
176
|
+
- test/configuration/execution_test.rb
|
|
177
|
+
- test/configuration/loading_test.rb
|
|
178
|
+
- test/configuration/namespace_dsl_test.rb
|
|
179
|
+
- test/configuration/servers_test.rb
|
|
180
|
+
- test/configuration/variables_test.rb
|
|
181
|
+
- test/configuration_test.rb
|
|
182
|
+
- test/deploy/local_dependency_test.rb
|
|
183
|
+
- test/deploy/remote_dependency_test.rb
|
|
184
|
+
- test/deploy/scm/base_test.rb
|
|
185
|
+
- test/deploy/scm/git_test.rb
|
|
186
|
+
- test/deploy/scm/none_test.rb
|
|
187
|
+
- test/deploy/strategy/copy_test.rb
|
|
188
|
+
- test/extensions_test.rb
|
|
189
|
+
- test/fixtures/cli_integration.rb
|
|
190
|
+
- test/fixtures/config.rb
|
|
191
|
+
- test/fixtures/custom.rb
|
|
192
|
+
- test/logger_formatting_test.rb
|
|
193
|
+
- test/logger_test.rb
|
|
194
|
+
- test/recipes_test.rb
|
|
195
|
+
- test/server_definition_test.rb
|
|
196
|
+
- test/ssh_test.rb
|
|
197
|
+
- test/task_definition_test.rb
|
|
198
|
+
- test/transfer_test.rb
|
|
199
|
+
- test/utils.rb
|
|
200
|
+
- test/version_test.rb
|
|
201
|
+
homepage: http://github.com/mackuba/minestrone
|
|
202
|
+
licenses: []
|
|
203
|
+
metadata: {}
|
|
204
|
+
rdoc_options: []
|
|
205
|
+
require_paths:
|
|
206
|
+
- lib
|
|
207
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
208
|
+
requirements:
|
|
209
|
+
- - ">="
|
|
210
|
+
- !ruby/object:Gem::Version
|
|
211
|
+
version: 3.0.0
|
|
212
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
213
|
+
requirements:
|
|
214
|
+
- - ">="
|
|
215
|
+
- !ruby/object:Gem::Version
|
|
216
|
+
version: '0'
|
|
217
|
+
requirements: []
|
|
218
|
+
rubygems_version: 4.0.10
|
|
219
|
+
specification_version: 4
|
|
220
|
+
summary: Minestrone - Welcome to easy deployment with Ruby over SSH
|
|
221
|
+
test_files:
|
|
222
|
+
- test/cli/execute_test.rb
|
|
223
|
+
- test/cli/help_test.rb
|
|
224
|
+
- test/cli/options_test.rb
|
|
225
|
+
- test/cli/ui_test.rb
|
|
226
|
+
- test/cli_test.rb
|
|
227
|
+
- test/command_test.rb
|
|
228
|
+
- test/configuration/actions/file_transfer_test.rb
|
|
229
|
+
- test/configuration/actions/inspect_test.rb
|
|
230
|
+
- test/configuration/actions/invocation_test.rb
|
|
231
|
+
- test/configuration/alias_task_test.rb
|
|
232
|
+
- test/configuration/callbacks_test.rb
|
|
233
|
+
- test/configuration/connections_test.rb
|
|
234
|
+
- test/configuration/execution_test.rb
|
|
235
|
+
- test/configuration/loading_test.rb
|
|
236
|
+
- test/configuration/namespace_dsl_test.rb
|
|
237
|
+
- test/configuration/servers_test.rb
|
|
238
|
+
- test/configuration/variables_test.rb
|
|
239
|
+
- test/configuration_test.rb
|
|
240
|
+
- test/deploy/local_dependency_test.rb
|
|
241
|
+
- test/deploy/remote_dependency_test.rb
|
|
242
|
+
- test/deploy/scm/base_test.rb
|
|
243
|
+
- test/deploy/scm/git_test.rb
|
|
244
|
+
- test/deploy/scm/none_test.rb
|
|
245
|
+
- test/deploy/strategy/copy_test.rb
|
|
246
|
+
- test/extensions_test.rb
|
|
247
|
+
- test/fixtures/cli_integration.rb
|
|
248
|
+
- test/fixtures/config.rb
|
|
249
|
+
- test/fixtures/custom.rb
|
|
250
|
+
- test/logger_formatting_test.rb
|
|
251
|
+
- test/logger_test.rb
|
|
252
|
+
- test/recipes_test.rb
|
|
253
|
+
- test/server_definition_test.rb
|
|
254
|
+
- test/ssh_test.rb
|
|
255
|
+
- test/task_definition_test.rb
|
|
256
|
+
- test/transfer_test.rb
|
|
257
|
+
- test/utils.rb
|
|
258
|
+
- test/version_test.rb
|