tango 0.0.5 → 0.0.6
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/Gemfile.lock +1 -1
- data/LICENSE +21 -0
- data/README.md +54 -20
- data/bin/tango +1 -1
- data/lib/tango.rb +1 -3
- data/lib/tango/delegate.rb +24 -0
- data/lib/tango/runner.rb +40 -0
- data/lib/tango/shell.rb +2 -0
- data/lib/tango/version.rb +1 -1
- data/spec/{namespace_spec.rb → runner_spec.rb} +13 -13
- data/spec/shell_spec.rb +3 -2
- metadata +9 -7
- data/lib/tango/namespace.rb +0 -47
data/Gemfile.lock
CHANGED
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
Copyright (c) 2011 Envato & Pete Yandell.
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
data/README.md
CHANGED
@@ -10,36 +10,70 @@ that really don't fit with the way we want to use it at
|
|
10
10
|
of Babushka's fundamentals to try to find a better fit.
|
11
11
|
|
12
12
|
|
13
|
-
|
14
|
-
|
13
|
+
Bootstrapping Ubuntu
|
14
|
+
--------------------
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
sudo apt-get install -y ruby irb rdoc
|
17
|
+
|
18
|
+
# Use the real rubygems, not the silly apt version.
|
19
|
+
wget http://production.cf.rubygems.org/rubygems/rubygems-1.6.2.tgz
|
20
|
+
tar -zxvf rubygems-1.6.2.tgz
|
21
|
+
cd rubygems-1.6.2
|
22
|
+
sudo ruby setup.rb --no-format-executable
|
23
|
+
|
24
|
+
sudo gem install tango
|
25
|
+
|
26
|
+
Example Runner
|
27
|
+
--------------
|
28
|
+
|
29
|
+
class AptInstaller < Tango::Runner
|
30
|
+
def installed?(package)
|
31
|
+
shell("dpkg-query", "--status", package, :echo => false).output !~ /not.installed|deinstall/
|
19
32
|
end
|
20
33
|
|
21
|
-
step "
|
22
|
-
met? {
|
23
|
-
|
34
|
+
step "install" do |package|
|
35
|
+
met? { installed?(package) }
|
36
|
+
# Need to figure out how to make this non-interactive. See:
|
37
|
+
# http://ubuntuforums.org/showthread.php?t=1218525
|
38
|
+
meet { shell("apt-get", "install", "-y", package) }
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class GemInstaller < Tango::Runner
|
43
|
+
def installed?(gem)
|
44
|
+
shell("gem", "query", "--installed", "--name-matches", gem, :echo => false).output =~ /true/
|
24
45
|
end
|
25
46
|
|
26
|
-
step "install" do |
|
27
|
-
met? { installed?(
|
28
|
-
meet { shell("
|
47
|
+
step "install" do |gem|
|
48
|
+
met? { installed?(gem) }
|
49
|
+
meet { shell("gem", "install", gem) }
|
29
50
|
end
|
30
51
|
end
|
31
52
|
|
32
|
-
class
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
Homebrew.run "install", "mysql"
|
37
|
-
run "install mtr"
|
53
|
+
class ExampleInstaller < Tango::Runner
|
54
|
+
def initialize
|
55
|
+
@apt = AptInstaller.new
|
56
|
+
@gem = GemInstaller.new
|
38
57
|
end
|
39
58
|
|
40
|
-
step "install
|
41
|
-
|
42
|
-
|
59
|
+
step "install" do
|
60
|
+
@apt.install "build-essential"
|
61
|
+
|
62
|
+
@apt.install "mysql-server"
|
63
|
+
@apt.install "libmysqlclient-dev"
|
64
|
+
|
65
|
+
@apt.install "git-core"
|
66
|
+
|
67
|
+
@gem.install "bundler"
|
43
68
|
end
|
44
69
|
end
|
45
70
|
|
71
|
+
Running the Example
|
72
|
+
-------------------
|
73
|
+
|
74
|
+
tango example_installer.rb ExampleInstaller.install
|
75
|
+
|
76
|
+
Copyright
|
77
|
+
---------
|
78
|
+
|
79
|
+
Copyright © 2011 Envato & Pete Yandell. See LICENSE for details.
|
data/bin/tango
CHANGED
data/lib/tango.rb
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
module Tango
|
2
|
+
module Delegate
|
3
|
+
|
4
|
+
def self.included(base)
|
5
|
+
base.extend(ClassMethods)
|
6
|
+
end
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
|
10
|
+
def delegate(*methods)
|
11
|
+
options = methods.pop
|
12
|
+
methods.each do |method|
|
13
|
+
define_method(method) do |*args|
|
14
|
+
send(options[:to]).send(method, *args)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
|
data/lib/tango/runner.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'tango/as_user'
|
2
|
+
require 'tango/delegate'
|
3
|
+
require 'tango/met_and_meet'
|
4
|
+
require 'tango/shell'
|
5
|
+
|
6
|
+
module Tango
|
7
|
+
class Runner
|
8
|
+
include AsUser
|
9
|
+
include Delegate
|
10
|
+
include MetAndMeet
|
11
|
+
include Shell
|
12
|
+
|
13
|
+
def self.step(step_name, &block)
|
14
|
+
define_method(step_name) do |*args|
|
15
|
+
description = step_description(step_name, args)
|
16
|
+
|
17
|
+
logger.enter(description)
|
18
|
+
result = instance_exec(*args, &block)
|
19
|
+
logger.leave(description)
|
20
|
+
|
21
|
+
result
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def step_description(step_name, args)
|
26
|
+
description = "#{self.class.name}.#{step_name}"
|
27
|
+
description << "(" + args.map {|arg| arg.inspect }.join(", ") + ")" unless args.empty?
|
28
|
+
description
|
29
|
+
end
|
30
|
+
|
31
|
+
alias_method :run, :send
|
32
|
+
|
33
|
+
delegate :log, :log_raw, :to => :logger
|
34
|
+
|
35
|
+
def logger
|
36
|
+
Logger.instance
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
data/lib/tango/shell.rb
CHANGED
data/lib/tango/version.rb
CHANGED
@@ -1,37 +1,37 @@
|
|
1
1
|
require 'tango'
|
2
2
|
|
3
|
-
class
|
3
|
+
class StubbedLogger
|
4
4
|
def enter(name); end
|
5
5
|
def leave(name); end
|
6
6
|
def log(message); end
|
7
7
|
end
|
8
8
|
|
9
|
-
class
|
10
|
-
def
|
11
|
-
@logger ||=
|
9
|
+
class StubbedRunner < Tango::Runner
|
10
|
+
def logger
|
11
|
+
@logger ||= StubbedLogger.new
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
15
|
module Tango
|
16
|
-
describe
|
16
|
+
describe Runner do
|
17
17
|
|
18
18
|
it "should run a step" do
|
19
19
|
step_run = false
|
20
20
|
|
21
|
-
|
21
|
+
runner = Class.new(StubbedRunner) do
|
22
22
|
step "example step" do
|
23
23
|
step_run = true
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
|
27
|
+
runner.new.run "example step"
|
28
28
|
step_run.should be_true
|
29
29
|
end
|
30
30
|
|
31
31
|
it "should run one step from within another" do
|
32
32
|
inner_step_run = false
|
33
33
|
|
34
|
-
|
34
|
+
runner = Class.new(StubbedRunner) do
|
35
35
|
step "outer step" do
|
36
36
|
run "inner step"
|
37
37
|
end
|
@@ -41,24 +41,24 @@ module Tango
|
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
-
|
44
|
+
runner.new.run "outer step"
|
45
45
|
inner_step_run.should be_true
|
46
46
|
end
|
47
47
|
|
48
48
|
context "passing arguments" do
|
49
49
|
it "should pass arguments to a step" do
|
50
|
-
|
50
|
+
runner = Class.new(StubbedRunner) do
|
51
51
|
step "example step" do |a, b|
|
52
52
|
a.should == 1
|
53
53
|
b.should == 2
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
-
|
57
|
+
runner.new.run "example step", 1, 2
|
58
58
|
end
|
59
59
|
|
60
60
|
it "should pass arguments when running other steps" do
|
61
|
-
|
61
|
+
runner = Class.new(StubbedRunner) do
|
62
62
|
step "outer step" do
|
63
63
|
run "inner step", 1, 2
|
64
64
|
end
|
@@ -69,7 +69,7 @@ module Tango
|
|
69
69
|
end
|
70
70
|
end
|
71
71
|
|
72
|
-
|
72
|
+
runner.new.run "outer step"
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
data/spec/shell_spec.rb
CHANGED
@@ -33,8 +33,9 @@ module Tango
|
|
33
33
|
|
34
34
|
it "should echo the command and its output" do
|
35
35
|
@stub = @stub_class.new
|
36
|
-
@stub.should_receive(:log).with("% echo Hello, world!\n\n")
|
37
|
-
@stub.should_receive(:log_raw).with("Hello, world!\n")
|
36
|
+
@stub.should_receive(:log).with("% echo Hello, world!\n\n").once.ordered
|
37
|
+
@stub.should_receive(:log_raw).with("Hello, world!\n").once.ordered
|
38
|
+
@stub.should_receive(:log).with("").once.ordered
|
38
39
|
|
39
40
|
@stub.shell("echo", "Hello, world!")
|
40
41
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tango
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 6
|
10
|
+
version: 0.0.6
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Pete Yandell
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-04-
|
18
|
+
date: 2011-04-02 00:00:00 +11:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -46,19 +46,21 @@ files:
|
|
46
46
|
- .rspec
|
47
47
|
- Gemfile
|
48
48
|
- Gemfile.lock
|
49
|
+
- LICENSE
|
49
50
|
- README.md
|
50
51
|
- Rakefile
|
51
52
|
- bin/tango
|
52
53
|
- lib/tango.rb
|
53
54
|
- lib/tango/as_user.rb
|
55
|
+
- lib/tango/delegate.rb
|
54
56
|
- lib/tango/logger.rb
|
55
57
|
- lib/tango/met_and_meet.rb
|
56
|
-
- lib/tango/
|
58
|
+
- lib/tango/runner.rb
|
57
59
|
- lib/tango/shell.rb
|
58
60
|
- lib/tango/version.rb
|
59
61
|
- spec/logger_spec.rb
|
60
62
|
- spec/met_and_meet_spec.rb
|
61
|
-
- spec/
|
63
|
+
- spec/runner_spec.rb
|
62
64
|
- spec/shell_spec.rb
|
63
65
|
- tango.gemspec
|
64
66
|
has_rdoc: true
|
@@ -98,5 +100,5 @@ summary: Experiment in deployment tools.
|
|
98
100
|
test_files:
|
99
101
|
- spec/logger_spec.rb
|
100
102
|
- spec/met_and_meet_spec.rb
|
101
|
-
- spec/
|
103
|
+
- spec/runner_spec.rb
|
102
104
|
- spec/shell_spec.rb
|
data/lib/tango/namespace.rb
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
require 'tango/as_user'
|
2
|
-
require 'tango/met_and_meet'
|
3
|
-
require 'tango/shell'
|
4
|
-
|
5
|
-
module Tango
|
6
|
-
class Namespace
|
7
|
-
include AsUser
|
8
|
-
include MetAndMeet
|
9
|
-
include Shell
|
10
|
-
|
11
|
-
def self.step(step_name, &block)
|
12
|
-
define_method(step_name, &block)
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.run(step_name, *args)
|
16
|
-
description = "#{name}.#{step_name}"
|
17
|
-
description << "(" + args.map {|arg| arg.inspect }.join(", ") + ")" unless args.empty?
|
18
|
-
|
19
|
-
logger.enter(description)
|
20
|
-
new.send(step_name, *args)
|
21
|
-
logger.leave(description)
|
22
|
-
end
|
23
|
-
|
24
|
-
def run(step_name, *args)
|
25
|
-
self.class.run(step_name, *args)
|
26
|
-
end
|
27
|
-
|
28
|
-
def log(message)
|
29
|
-
self.class.logger.log(message)
|
30
|
-
end
|
31
|
-
|
32
|
-
def log_raw(message)
|
33
|
-
self.class.logger.log_raw(message)
|
34
|
-
end
|
35
|
-
|
36
|
-
def self.method_missing(method, *args)
|
37
|
-
new.send(method, *args)
|
38
|
-
end
|
39
|
-
|
40
|
-
private
|
41
|
-
|
42
|
-
def self.logger
|
43
|
-
Logger.instance
|
44
|
-
end
|
45
|
-
|
46
|
-
end
|
47
|
-
end
|