tango 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.
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ pkg/*
2
+ *.gem
3
+ .bundle
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in tango.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,24 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ tango (0.0.1)
5
+
6
+ GEM
7
+ remote: http://rubygems.org/
8
+ specs:
9
+ diff-lcs (1.1.2)
10
+ rspec (2.4.0)
11
+ rspec-core (~> 2.4.0)
12
+ rspec-expectations (~> 2.4.0)
13
+ rspec-mocks (~> 2.4.0)
14
+ rspec-core (2.4.0)
15
+ rspec-expectations (2.4.0)
16
+ diff-lcs (~> 1.1.2)
17
+ rspec-mocks (2.4.0)
18
+
19
+ PLATFORMS
20
+ ruby
21
+
22
+ DEPENDENCIES
23
+ rspec
24
+ tango!
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require 'rspec/core/rake_task'
2
+
3
+ RSpec::Core::RakeTask.new(:spec)
4
+
5
+ task :default => :spec
6
+
7
+
8
+ require 'bundler'
9
+
10
+ Bundler::GemHelper.install_tasks
data/lib/tango.rb ADDED
@@ -0,0 +1,6 @@
1
+ require 'tango/dance'
2
+ require 'tango/dance_builder'
3
+ require 'tango/step'
4
+ require 'tango/step_builder'
5
+ require 'tango/step_runner'
6
+ require 'tango/step_runner_context'
@@ -0,0 +1,24 @@
1
+ module Tango
2
+ class Dance
3
+
4
+ class StepAlreadyDefinedError < RuntimeError; end
5
+ class UndefinedStepError < RuntimeError; end
6
+
7
+ def initialize(&block)
8
+ @steps = {}
9
+ DanceBuilder.new(self).instance_eval(&block)
10
+ end
11
+
12
+ def define_step(name, step)
13
+ raise StepAlreadyDefinedError, "Step #{name} already defined" if @steps.has_key?(name)
14
+ step.dance = self
15
+ @steps[name] = step
16
+ end
17
+
18
+ def run(step_name, options = {})
19
+ raise UndefinedStepError, "Step #{step_name} not defined" unless @steps.has_key?(step_name)
20
+ @steps[step_name].run(options)
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,13 @@
1
+ module Tango
2
+ class DanceBuilder
3
+
4
+ def initialize(dance)
5
+ @dance = dance
6
+ end
7
+
8
+ def step(name, &block)
9
+ @dance.define_step(name, Step.new(&block))
10
+ end
11
+
12
+ end
13
+ end
data/lib/tango/step.rb ADDED
@@ -0,0 +1,13 @@
1
+ module Tango
2
+ class Step
3
+ def initialize(&block)
4
+ StepBuilder.new(self).instance_eval(&block)
5
+ end
6
+
7
+ attr_accessor :dance, :met_block, :meet_block
8
+
9
+ def run(options = {})
10
+ StepRunner.new(self, options).run
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ module Tango
2
+ class StepBuilder
3
+
4
+ def initialize(step)
5
+ @step = step
6
+ end
7
+
8
+ def met?(&block)
9
+ @step.met_block = block
10
+ end
11
+
12
+ def meet(&block)
13
+ @step.meet_block = block
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,40 @@
1
+ module Tango
2
+ class StepRunner
3
+
4
+ def initialize(step, options)
5
+ @step = step
6
+ @options = options
7
+ @context = StepRunnerContext.new(@step)
8
+ end
9
+
10
+ def run
11
+ if @step.met_block
12
+ run_with_met_block
13
+ else
14
+ run_without_met_block
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def run_with_met_block
21
+ unless met?
22
+ meet
23
+ raise "Couldn't meet" unless met?
24
+ end
25
+ end
26
+
27
+ def run_without_met_block
28
+ meet
29
+ end
30
+
31
+ def met?
32
+ @context.instance_exec(@options, &@step.met_block)
33
+ end
34
+
35
+ def meet
36
+ @context.instance_exec(@options, &@step.meet_block)
37
+ end
38
+
39
+ end
40
+ end
@@ -0,0 +1,13 @@
1
+ module Tango
2
+ class StepRunnerContext
3
+
4
+ def initialize(step)
5
+ @step = step
6
+ end
7
+
8
+ def run(step_name, options = {})
9
+ @step.dance.run(step_name, options)
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,3 @@
1
+ module Tango
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,86 @@
1
+ require 'tango'
2
+
3
+ module Tango
4
+ describe Dance do
5
+
6
+ it "should run a step" do
7
+ step_run = false
8
+
9
+ dance = Dance.new do
10
+ step "example step" do
11
+ meet { step_run = true }
12
+ end
13
+ end
14
+
15
+ dance.run "example step"
16
+ step_run.should be_true
17
+ end
18
+
19
+ it "should run one step from within another" do
20
+ inner_step_run = false
21
+
22
+ dance = Dance.new do
23
+ step "outer step" do
24
+ meet { run "inner step" }
25
+ end
26
+
27
+ step "inner step" do
28
+ meet { inner_step_run = true }
29
+ end
30
+ end
31
+
32
+ dance.run "outer step"
33
+ inner_step_run.should be_true
34
+ end
35
+
36
+ context "option passing" do
37
+ it "should pass options to a step when running" do
38
+ step_options = { :example => "example" }
39
+
40
+ dance = Dance.new do
41
+ step "example step" do
42
+ meet {|options| options.should == step_options }
43
+ end
44
+ end
45
+
46
+ dance.run "example step", step_options
47
+ end
48
+
49
+ it "should pass options when running other steps" do
50
+ step_options = { :example => "example" }
51
+
52
+ dance = Dance.new do
53
+ step "outer step" do
54
+ meet { run "inner step", step_options }
55
+ end
56
+
57
+ step "inner step" do
58
+ meet {|options| options.should == step_options }
59
+ end
60
+ end
61
+
62
+ dance.run "outer step"
63
+ end
64
+ end
65
+
66
+ context "error handling" do
67
+ it "should raise an error on an attempt to redefine a step" do
68
+ expect do
69
+ Dance.new do
70
+ step "example step" do; end
71
+ step "example step" do; end
72
+ end
73
+ end.should raise_error(Dance::StepAlreadyDefinedError)
74
+ end
75
+
76
+ it "should raise an error on an attempt to run an undefined step" do
77
+ dance = Dance.new do; end
78
+
79
+ expect do
80
+ dance.run "undefined step"
81
+ end.should raise_error(Dance::UndefinedStepError)
82
+ end
83
+ end
84
+
85
+ end
86
+ end
data/spec/step_spec.rb ADDED
@@ -0,0 +1,94 @@
1
+ require 'tango'
2
+
3
+ module Tango
4
+ describe Step do
5
+
6
+ context "with just a meet block" do
7
+ it "should run the meet block" do
8
+ meet_block_calls = 0
9
+ step = Step.new do
10
+ meet { meet_block_calls += 1 }
11
+ end
12
+
13
+ step.run
14
+ meet_block_calls.should == 1
15
+ end
16
+ end
17
+
18
+ context "with a meet block and a met block" do
19
+ it "should check the met?, run the meet, then check the met? again" do
20
+ met_block_calls = 0
21
+ meet_block_calls = 0
22
+ step = Step.new do
23
+ met? do
24
+ met_block_calls += 1
25
+ meet_block_calls > 0
26
+ end
27
+ meet { meet_block_calls += 1 }
28
+ end
29
+
30
+ step.run
31
+ met_block_calls.should == 2
32
+ meet_block_calls.should == 1
33
+ end
34
+
35
+ it "should not run the meet if the met? succeeds the first time" do
36
+ met_block_calls = 0
37
+ meet_block_calls = 0
38
+ step = Step.new do
39
+ met? do
40
+ met_block_calls += 1
41
+ true
42
+ end
43
+ meet { meet_block_calls += 1 }
44
+ end
45
+
46
+ step.run
47
+ met_block_calls.should == 1
48
+ meet_block_calls.should == 0
49
+ end
50
+
51
+ it "should raise if the met? block fails twice" do
52
+ met_block_calls = 0
53
+ meet_block_calls = 0
54
+ step = Step.new do
55
+ met? do
56
+ met_block_calls += 1
57
+ false
58
+ end
59
+ meet { meet_block_calls += 1 }
60
+ end
61
+
62
+ expect { step.run }.should raise_error
63
+ met_block_calls.should == 2
64
+ meet_block_calls.should == 1
65
+ end
66
+ end
67
+
68
+ context "run with options" do
69
+ it "should pass the options to the met block" do
70
+ step_options = { :example => "example" }
71
+
72
+ step = Step.new do
73
+ met? do |options|
74
+ options.should == step_options
75
+ true
76
+ end
77
+ end
78
+
79
+ step.run(step_options)
80
+ end
81
+
82
+ it "should pass the options to the meet block" do
83
+ step_options = { :example => "example" }
84
+
85
+ step = Step.new do
86
+ meet {|options| options.should == step_options }
87
+ end
88
+
89
+ step.run(step_options)
90
+ end
91
+ end
92
+
93
+ end
94
+ end
data/tango.gemspec ADDED
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "tango/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "tango"
7
+ s.version = Tango::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Pete Yandell"]
10
+ s.email = ["pete@notahat.com"]
11
+ s.homepage = ""
12
+ s.summary = %q{Experiment in deployment tools.}
13
+ s.description = %q{Experiment in deployment tools, taking ideas from babushka and elsewhere.}
14
+
15
+ s.add_development_dependency "rspec"
16
+
17
+ s.rubyforge_project = "tango"
18
+
19
+ s.files = `git ls-files`.split("\n")
20
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
21
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
22
+ s.require_paths = ["lib"]
23
+ end
metadata ADDED
@@ -0,0 +1,93 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tango
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
10
+ platform: ruby
11
+ authors:
12
+ - Pete Yandell
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-01-17 00:00:00 +11:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rspec
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 0
30
+ version: "0"
31
+ type: :development
32
+ version_requirements: *id001
33
+ description: Experiment in deployment tools, taking ideas from babushka and elsewhere.
34
+ email:
35
+ - pete@notahat.com
36
+ executables: []
37
+
38
+ extensions: []
39
+
40
+ extra_rdoc_files: []
41
+
42
+ files:
43
+ - .gitignore
44
+ - .rspec
45
+ - Gemfile
46
+ - Gemfile.lock
47
+ - Rakefile
48
+ - lib/tango.rb
49
+ - lib/tango/dance.rb
50
+ - lib/tango/dance_builder.rb
51
+ - lib/tango/step.rb
52
+ - lib/tango/step_builder.rb
53
+ - lib/tango/step_runner.rb
54
+ - lib/tango/step_runner_context.rb
55
+ - lib/tango/version.rb
56
+ - spec/dance_spec.rb
57
+ - spec/step_spec.rb
58
+ - tango.gemspec
59
+ has_rdoc: true
60
+ homepage: ""
61
+ licenses: []
62
+
63
+ post_install_message:
64
+ rdoc_options: []
65
+
66
+ require_paths:
67
+ - lib
68
+ required_ruby_version: !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ segments:
74
+ - 0
75
+ version: "0"
76
+ required_rubygems_version: !ruby/object:Gem::Requirement
77
+ none: false
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ segments:
82
+ - 0
83
+ version: "0"
84
+ requirements: []
85
+
86
+ rubyforge_project: tango
87
+ rubygems_version: 1.3.7
88
+ signing_key:
89
+ specification_version: 3
90
+ summary: Experiment in deployment tools.
91
+ test_files:
92
+ - spec/dance_spec.rb
93
+ - spec/step_spec.rb