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.
Files changed (96) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/main.yml +32 -0
  3. data/.gitignore +5 -0
  4. data/Gemfile +10 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +35 -0
  7. data/Rakefile +10 -0
  8. data/bin/capify +89 -0
  9. data/bin/min +5 -0
  10. data/docs/lib-codebase-map.md +162 -0
  11. data/docs/lib-dependency-graph.svg +129 -0
  12. data/lib/minestrone/callback.rb +45 -0
  13. data/lib/minestrone/cli/help.rb +131 -0
  14. data/lib/minestrone/cli/help.txt +72 -0
  15. data/lib/minestrone/cli/options.rb +232 -0
  16. data/lib/minestrone/cli.rb +159 -0
  17. data/lib/minestrone/command.rb +177 -0
  18. data/lib/minestrone/configuration/actions/file_transfer.rb +53 -0
  19. data/lib/minestrone/configuration/actions/inspect.rb +46 -0
  20. data/lib/minestrone/configuration/actions/invocation.rb +202 -0
  21. data/lib/minestrone/configuration/alias_task.rb +29 -0
  22. data/lib/minestrone/configuration/callbacks.rb +129 -0
  23. data/lib/minestrone/configuration/connections.rb +66 -0
  24. data/lib/minestrone/configuration/execution.rb +139 -0
  25. data/lib/minestrone/configuration/loading.rb +207 -0
  26. data/lib/minestrone/configuration/log_formatters.rb +75 -0
  27. data/lib/minestrone/configuration/namespaces.rb +225 -0
  28. data/lib/minestrone/configuration/servers.rb +70 -0
  29. data/lib/minestrone/configuration/variables.rb +115 -0
  30. data/lib/minestrone/configuration.rb +69 -0
  31. data/lib/minestrone/errors.rb +17 -0
  32. data/lib/minestrone/ext/string.rb +7 -0
  33. data/lib/minestrone/extensions.rb +56 -0
  34. data/lib/minestrone/logger.rb +171 -0
  35. data/lib/minestrone/processable.rb +50 -0
  36. data/lib/minestrone/recipes/deploy/assets.rb +194 -0
  37. data/lib/minestrone/recipes/deploy/bundler.rb +81 -0
  38. data/lib/minestrone/recipes/deploy/dependencies.rb +44 -0
  39. data/lib/minestrone/recipes/deploy/local_dependency.rb +45 -0
  40. data/lib/minestrone/recipes/deploy/remote_dependency.rb +119 -0
  41. data/lib/minestrone/recipes/deploy/scm/base.rb +204 -0
  42. data/lib/minestrone/recipes/deploy/scm/git.rb +284 -0
  43. data/lib/minestrone/recipes/deploy/scm/none.rb +54 -0
  44. data/lib/minestrone/recipes/deploy/scm.rb +22 -0
  45. data/lib/minestrone/recipes/deploy/strategy/base.rb +87 -0
  46. data/lib/minestrone/recipes/deploy/strategy/copy.rb +353 -0
  47. data/lib/minestrone/recipes/deploy/strategy/remote_cache.rb +80 -0
  48. data/lib/minestrone/recipes/deploy/strategy.rb +22 -0
  49. data/lib/minestrone/recipes/deploy.rb +639 -0
  50. data/lib/minestrone/recipes/standard.rb +23 -0
  51. data/lib/minestrone/recipes/templates/maintenance.rhtml +53 -0
  52. data/lib/minestrone/server_definition.rb +56 -0
  53. data/lib/minestrone/ssh.rb +81 -0
  54. data/lib/minestrone/task_definition.rb +82 -0
  55. data/lib/minestrone/transfer.rb +205 -0
  56. data/lib/minestrone/version.rb +11 -0
  57. data/lib/minestrone.rb +3 -0
  58. data/minestrone.gemspec +32 -0
  59. data/test/cli/execute_test.rb +130 -0
  60. data/test/cli/help_test.rb +178 -0
  61. data/test/cli/options_test.rb +315 -0
  62. data/test/cli/ui_test.rb +26 -0
  63. data/test/cli_test.rb +17 -0
  64. data/test/command_test.rb +305 -0
  65. data/test/configuration/actions/file_transfer_test.rb +61 -0
  66. data/test/configuration/actions/inspect_test.rb +76 -0
  67. data/test/configuration/actions/invocation_test.rb +258 -0
  68. data/test/configuration/alias_task_test.rb +110 -0
  69. data/test/configuration/callbacks_test.rb +201 -0
  70. data/test/configuration/connections_test.rb +192 -0
  71. data/test/configuration/execution_test.rb +176 -0
  72. data/test/configuration/loading_test.rb +149 -0
  73. data/test/configuration/namespace_dsl_test.rb +325 -0
  74. data/test/configuration/servers_test.rb +100 -0
  75. data/test/configuration/variables_test.rb +191 -0
  76. data/test/configuration_test.rb +77 -0
  77. data/test/deploy/local_dependency_test.rb +61 -0
  78. data/test/deploy/remote_dependency_test.rb +146 -0
  79. data/test/deploy/scm/base_test.rb +55 -0
  80. data/test/deploy/scm/git_test.rb +260 -0
  81. data/test/deploy/scm/none_test.rb +26 -0
  82. data/test/deploy/strategy/copy_test.rb +360 -0
  83. data/test/extensions_test.rb +69 -0
  84. data/test/fixtures/cli_integration.rb +5 -0
  85. data/test/fixtures/config.rb +4 -0
  86. data/test/fixtures/custom.rb +3 -0
  87. data/test/logger_formatting_test.rb +149 -0
  88. data/test/logger_test.rb +134 -0
  89. data/test/recipes_test.rb +26 -0
  90. data/test/server_definition_test.rb +121 -0
  91. data/test/ssh_test.rb +99 -0
  92. data/test/task_definition_test.rb +117 -0
  93. data/test/transfer_test.rb +172 -0
  94. data/test/utils.rb +28 -0
  95. data/test/version_test.rb +11 -0
  96. 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