taketo 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -6,6 +6,12 @@ Take Me To
6
6
 
7
7
  A tiny helper utility to make access to servers easier for different projects and environments.
8
8
 
9
+ Taketo is known to work on:
10
+
11
+ * ree 1.8.7
12
+ * MRI 1.9.2
13
+ * MRI 1.9.3
14
+
9
15
  Important note:
10
16
  ---------------
11
17
 
@@ -30,6 +36,7 @@ puts a config into ```~/.taketo.rc.rb```:
30
36
  env :TERM => "xterm-256color"
31
37
  command :console do
32
38
  execute "rails c"
39
+ desc "Run rails console"
33
40
  end
34
41
  end
35
42
  end
@@ -39,6 +46,8 @@ puts a config into ```~/.taketo.rc.rb```:
39
46
  Then execute ```taketo my_project:staging:server -c console``` to execute the "rails c" with corresponding environment variables set on desired server
40
47
  or just ```taketo my_project:staging:server``` to open bash
41
48
 
49
+ To have a brief overview of the config run ```taketo [destination] --view```
50
+
42
51
  Destination resolving works intelligently. Given the following config:
43
52
 
44
53
  ```ruby
@@ -81,6 +90,10 @@ To-Do:
81
90
  The Changelog:
82
91
  --------------
83
92
 
93
+ ### v0.0.4 (22.07.2012) ###
94
+ * Add --view option. Now you can view your config quickly: ```taketo my_project:environment:server --view``` or just ```taketo --view```
95
+ * Now commands can have description
96
+
84
97
  ### v0.0.3 (22.07.2012) ###
85
98
  * Add default_destination config option
86
99
  * Add intelligent destination resolving
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.3
1
+ 0.0.4
data/bin/taketo CHANGED
@@ -24,20 +24,34 @@ end
24
24
 
25
25
  include Taketo
26
26
 
27
+ DEFAULT_CONFIG_FILE = File.join(ENV['HOME'], ".taketo.rc.rb")
28
+
27
29
  def parse_options
28
- options = { :config => File.join(ENV['HOME'], ".taketo.rc.rb") }
30
+ options = { :config => DEFAULT_CONFIG_FILE }
29
31
 
30
32
  OptionParser.new do |opts|
31
- opts.banner = <<-DESC
32
- A tiny helper utility to make access to servers
33
- eaiser for different projects and environments.
34
- DESC
33
+ opts.banner = "Usage: taketo [destination] [options]"
34
+ opts.version = VERSION
35
+ opts.separator ""
36
+ opts.separator "Common options:"
35
37
 
36
- opts.on("-f CONFIG", "--config") do |c|
38
+ opts.on("-f CONFIG", "--config", "Use custom config file (default: #{DEFAULT_CONFIG_FILE})") do |c|
37
39
  options[:config] = c
38
40
  end
39
41
 
40
- opts.on("--dry-run") do |v|
42
+ opts.on("-c COMMAND", "--command", "Command to execute on destination server",
43
+ " (COMMAND either declared in config or passed as an argument)") do |c|
44
+ raise OptionParser::MissingArgument if String(c).strip.empty?
45
+ options[:command] = c
46
+ end
47
+
48
+ opts.on("-v", "--view", "Show config contents and exit") do |v|
49
+ options[:view] = v
50
+ end
51
+
52
+ opts.separator "Special options:"
53
+
54
+ opts.on("--dry-run", "Print out what would be run") do |v|
41
55
  options[:dry_run] = v
42
56
  end
43
57
 
@@ -45,10 +59,6 @@ eaiser for different projects and environments.
45
59
  options[:debug] = d
46
60
  end
47
61
 
48
- opts.on("-c COMMAND", "--command") do |c|
49
- raise OptionParser::MissingArgument if String(c).strip.empty?
50
- options[:command] = c
51
- end
52
62
  end.parse!
53
63
 
54
64
  options
@@ -72,19 +82,25 @@ def default_command(options)
72
82
  end
73
83
 
74
84
  begin
75
- options = parse_options
76
- config = parse_config(options[:config])
77
-
85
+ options = parse_options
86
+ config = parse_config(options[:config])
78
87
  destination_path = ARGV.shift.to_s
79
- server = DestinationResolver.new(config, destination_path).resolve
88
+ resolver = DestinationResolver.new(config, destination_path)
80
89
 
81
- server_command = remote_command(server, options)
82
- command_to_execute = Commands::SSHCommand.new(server).render(server_command)
83
-
84
- if options[:dry_run]
85
- puts command_to_execute
90
+ if options[:view]
91
+ node = resolver.get_node
92
+ puts ConfigPrinter.new.render(node).chomp
86
93
  else
87
- system command_to_execute
94
+ server = resolver.resolve
95
+
96
+ server_command = remote_command(server, options)
97
+ command_to_execute = Commands::SSHCommand.new(server).render(server_command)
98
+
99
+ if options[:dry_run]
100
+ puts command_to_execute
101
+ else
102
+ system command_to_execute
103
+ end
88
104
  end
89
105
  rescue SystemExit
90
106
  # Do nothing
@@ -9,7 +9,7 @@ Feature:
9
9
  """
10
10
  project :slots do
11
11
  environment :staging do
12
- server :s1 do
12
+ server do
13
13
  host "1.2.3.4"
14
14
  location "/var/apps/slots"
15
15
  end
@@ -27,7 +27,7 @@ Feature:
27
27
  """
28
28
  project :slots do
29
29
  environment :staging do
30
- server :s1 do
30
+ server do
31
31
  host "1.2.3.4"
32
32
  location "/var/apps/slots"
33
33
  command :console do
@@ -37,7 +37,7 @@ Feature:
37
37
  end
38
38
  end
39
39
  """
40
- And I successfully run `taketo --config=/tmp/taketo_test_cfg.rb --dry-run --command console slots:staging:s1`
40
+ And I successfully run `taketo --config=/tmp/taketo_test_cfg.rb --dry-run --command console slots:staging`
41
41
  Then the output should contain
42
42
  """
43
43
  ssh -t 1.2.3.4 "cd /var/apps/slots; RAILS_ENV=staging rails c"
@@ -33,7 +33,7 @@ Feature:
33
33
  """
34
34
  project :slots do
35
35
  environment :staging do
36
- server :s1 do
36
+ server do
37
37
  host "1.2.3.4"
38
38
  location "/var/apps/slots"
39
39
  end
@@ -51,7 +51,7 @@ Feature:
51
51
  """
52
52
  project :slots do
53
53
  environment :staging do
54
- server :s1 do
54
+ server do
55
55
  host "1.2.3.4"
56
56
  location "/var/apps/slots"
57
57
  env :FOO => "the value"
@@ -74,7 +74,7 @@ Feature:
74
74
  """
75
75
  project :slots do
76
76
  environment :staging do
77
- server :s1 do
77
+ server do
78
78
  host "1.2.3.4"
79
79
  end
80
80
  end
@@ -82,13 +82,13 @@ Feature:
82
82
 
83
83
  project :slots do
84
84
  environment :staging do
85
- server :s1 do
85
+ server do
86
86
  env :FOO => "bar"
87
87
  end
88
88
  end
89
89
  end
90
90
  """
91
- And I successfully run `taketo --config=/tmp/taketo_test_cfg.rb slots:staging:s1 --dry-run`
91
+ And I successfully run `taketo --config=/tmp/taketo_test_cfg.rb slots:staging --dry-run`
92
92
  Then the output should match /ssh -t 1\.2\.3\.4 "(RAILS_ENV=staging FOO=bar|FOO=bar RAILS_ENV=staging) bash"/
93
93
 
94
94
  Scenario: Default destination
@@ -0,0 +1,71 @@
1
+ Feature:
2
+ In order to be able to use the tool effectively
3
+ As a user
4
+ I want to view what's set up in config quickly
5
+
6
+ Background:
7
+ When I have the following config in "/tmp/taketo_test_cfg.rb"
8
+ """
9
+ project :foo do
10
+ environment :bar do
11
+ server do
12
+ host "1.2.3.4"
13
+ port 5678
14
+ user "pivo"
15
+ location "/var/apps/vodka"
16
+ end
17
+ end
18
+ end
19
+
20
+ project :baz do
21
+ environment :qux do
22
+ server :bart do
23
+ host "2.3.4.5"
24
+ command :console do
25
+ execute "something_to_execute"
26
+ end
27
+ command :killall do
28
+ execute "killall humans"
29
+ desc "Kill ALL humans"
30
+ end
31
+ end
32
+ end
33
+ end
34
+ """
35
+
36
+ Scenario: View full config
37
+ When I run `taketo --config=/tmp/taketo_test_cfg.rb --view`
38
+ Then the output should contain exactly:
39
+ """
40
+ Project: foo
41
+ Environment: bar
42
+ Server: default
43
+ Host: 1.2.3.4
44
+ Port: 5678
45
+ User: pivo
46
+ Default location: /var/apps/vodka
47
+ Environment: RAILS_ENV=bar
48
+
49
+ Project: baz
50
+ Environment: qux
51
+ Server: bart
52
+ Host: 2.3.4.5
53
+ Environment: RAILS_ENV=qux
54
+ Commands:
55
+ console
56
+ killall - Kill ALL humans
57
+
58
+ """
59
+
60
+ Scenario: View particular server
61
+ When I run `taketo --config=/tmp/taketo_test_cfg.rb --view foo:bar:default`
62
+ Then the output should contain exactly:
63
+ """
64
+ Server: default
65
+ Host: 1.2.3.4
66
+ Port: 5678
67
+ User: pivo
68
+ Default location: /var/apps/vodka
69
+ Environment: RAILS_ENV=bar
70
+
71
+ """
@@ -0,0 +1,84 @@
1
+ module Taketo
2
+ class ConfigPrinter
3
+ def initialize
4
+ @indent_level = 0
5
+ @result = ""
6
+ end
7
+
8
+ def result
9
+ @result.chomp
10
+ end
11
+
12
+ def render(object)
13
+ method = "render_#{object.class.name.gsub(/[\w:]*::/, '').downcase}"
14
+ send(method, object)
15
+ end
16
+
17
+ def render_command(command)
18
+ put command.name.to_s + (" - " + command.description if command.description).to_s
19
+ result
20
+ end
21
+
22
+ def render_server(server)
23
+ section("Server: #{server.name}") do
24
+ put "Host: #{server.host}"
25
+ put "Port: #{server.port}" if server.port
26
+ put "User: #{server.username}" if server.username
27
+ put "Default location: #{server.default_location}" if server.default_location
28
+ put "Environment: " + server.environment_variables.map { |n, v| "#{n}=#{v}" }.join(" ")
29
+ unless server.commands.empty?
30
+ section("Commands:") do
31
+ server.commands.each { |c| render_command(c) }
32
+ end
33
+ end
34
+ end
35
+ result
36
+ end
37
+
38
+ def render_environment(environment)
39
+ section("Environment: #{environment.name}", ("(No servers)" if environment.servers.empty?)) do
40
+ if environment.servers.any?
41
+ environment.servers.each { |s| render_server(s) }
42
+ end
43
+ end
44
+ result
45
+ end
46
+
47
+ def render_project(project)
48
+ section("Project: #{project.name}", ("(No environments)" if project.environments.empty?)) do
49
+ if project.environments.any?
50
+ project.environments.each { |e| render_environment(e) }
51
+ end
52
+ end
53
+ put
54
+ result
55
+ end
56
+
57
+ def render_config(config)
58
+ if config.projects.any?
59
+ config.projects.each { |p| render_project(p) }
60
+
61
+ put
62
+ put "Default destination: #{config.default_destination}" if config.default_destination
63
+ else
64
+ put "There are no projects yet..."
65
+ end
66
+ result
67
+ end
68
+
69
+ private
70
+
71
+
72
+ def section(title = nil, note = nil)
73
+ put [title, note].compact.join(" ") if title
74
+ @indent_level += 1
75
+ yield
76
+ @indent_level -= 1
77
+ end
78
+
79
+ def put(str = nil)
80
+ @result += " " * @indent_level + str.to_s.chomp + "\n"
81
+ end
82
+ end
83
+ end
84
+
@@ -6,7 +6,7 @@ module Taketo
6
6
  class Command < BaseConstruct
7
7
  include Shellwords
8
8
 
9
- attr_accessor :command
9
+ attr_accessor :command, :description
10
10
 
11
11
  def render(server)
12
12
  %Q[#{location(server)} #{environment_variables(server)} #{command}].strip.squeeze(" ")
@@ -18,6 +18,15 @@ module Taketo
18
18
  end
19
19
  end
20
20
 
21
+ def get_node
22
+ case @path.size
23
+ when 3 then get_server(*@path)
24
+ when 2 then get_project_and_environment(*@path).last
25
+ when 1 then get_project(*@path)
26
+ when 0 then @config
27
+ end
28
+ end
29
+
21
30
  private
22
31
 
23
32
  def set_destination(path)
data/lib/taketo/dsl.rb CHANGED
@@ -5,12 +5,13 @@ module Taketo
5
5
  class ScopeError < StandardError; end
6
6
 
7
7
  class << self
8
- def define_scope(scope, parent_scope)
9
- define_method scope do |name, &block|
8
+ def define_scope(scope, parent_scope, options = {})
9
+ define_method scope do |*args, &block|
10
10
  unless current_scope?(parent_scope)
11
11
  raise ScopeError,
12
12
  "#{scope} can't be defined in #{current_scope} scope"
13
13
  end
14
+ name = args.shift || options[:default_name] or raise(ArgumentError, "Name not specified")
14
15
  scope_object = current_scope_object.find(scope, name) { @factory.create(scope, name) }
15
16
  in_scope(scope, scope_object) do
16
17
  block.call
@@ -52,7 +53,7 @@ module Taketo
52
53
 
53
54
  define_scope :project, :config
54
55
  define_scope :environment, :project
55
- define_scope :server, :environment
56
+ define_scope :server, :environment, :default_name => :default
56
57
  define_scope :command, :server
57
58
 
58
59
  define_attribute(:default_destination, :config) { |destination| current_scope_object.default_destination = destination }
@@ -62,6 +63,7 @@ module Taketo
62
63
  define_attribute(:location, :server) { |path| current_scope_object.default_location = path }
63
64
  define_attribute(:env, :server) { |env| current_scope_object.env(env) }
64
65
  define_attribute(:execute, :command) { |command| current_scope_object.command = command }
66
+ define_attribute(:desc, :command) { |description| current_scope_object.description = description }
65
67
 
66
68
  private
67
69
 
data/lib/taketo.rb CHANGED
@@ -7,4 +7,5 @@ require 'taketo/support'
7
7
  require 'taketo/dsl'
8
8
  require 'taketo/commands'
9
9
  require 'taketo/config_validator'
10
+ require 'taketo/config_printer'
10
11
 
@@ -7,7 +7,7 @@ describe "Taketo DSL" do
7
7
  config = Taketo::DSL.new(factory).configure do
8
8
  project :slots do
9
9
  environment :staging do
10
- server :staging do
10
+ server do
11
11
  host "127.0.0.2"
12
12
  user "deployer"
13
13
  location "/var/app"
@@ -40,7 +40,8 @@ describe "Taketo DSL" do
40
40
  staging = project.environments[:staging]
41
41
 
42
42
  staging.servers.length.should == 1
43
- staging_server = staging.servers[:staging]
43
+ staging_server = staging.servers[:default]
44
+ staging_server.name.should == :default
44
45
  staging_server.host.should == "127.0.0.2"
45
46
  staging_server.username.should == "deployer"
46
47
  staging_server.default_location.should == "/var/app"
@@ -0,0 +1,115 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+ require 'taketo/config_printer'
3
+
4
+ include Taketo
5
+
6
+ describe "ConfigPrinter" do
7
+ describe "#render" do
8
+ it "should render based on node class name" do
9
+ printer.should_receive(:render_fixnum)
10
+ printer.render(1)
11
+ end
12
+ end
13
+
14
+ describe "#render_command" do
15
+ let(:command) { stub(:Command, :name => :foo, :description => nil) }
16
+
17
+ it "should render command name" do
18
+ printer.render_command(command).should == "foo"
19
+ end
20
+
21
+ it "should also render description if available" do
22
+ command.stub(:description => "The description")
23
+ printer.render_command(command).should == "foo - The description"
24
+ end
25
+ end
26
+
27
+ describe "#render_server" do
28
+ let(:server) do
29
+ stub(:Server,
30
+ :name => :sponge,
31
+ :host => "1.2.3.4",
32
+ :port => 8000,
33
+ :username => "bob",
34
+ :default_location => "/var/app",
35
+ :environment_variables => { :FOO => "bar", :BOO => "baz" })
36
+ end
37
+
38
+ it "should render available server info and commands" do
39
+ server.stub(:commands => [:the_command])
40
+ printer.should_receive(:render_command).with(:the_command)
41
+ printer.render_server(server).should =~
42
+ %r[Server: sponge
43
+ Host: 1\.2\.3\.4
44
+ Port: 8000
45
+ User: bob
46
+ Default location: /var/app
47
+ Environment: (FOO=bar BOO=baz|BOO=baz FOO=bar)
48
+ Commands:]
49
+ end
50
+
51
+ it "should not render commands if there are none" do
52
+ server.stub(:commands => [])
53
+ printer.render_server(server).should_not include("Commands:")
54
+ end
55
+ end
56
+
57
+ describe "#render_environment" do
58
+ let(:environment) do
59
+ stub(:Environment,
60
+ :name => :foo)
61
+ end
62
+
63
+ it "should render environment info and servers" do
64
+ environment.stub(:servers => [:the_server])
65
+ printer.should_receive(:render_server).with(:the_server)
66
+ printer.render_environment(environment).should == "Environment: foo"
67
+ end
68
+
69
+ it "should render appropriate message if there are no servers" do
70
+ environment.stub(:servers => [])
71
+ printer.render_environment(environment).should == "Environment: foo (No servers)"
72
+ end
73
+ end
74
+
75
+ describe "#render_project" do
76
+ let(:project) do
77
+ stub(:Project,
78
+ :name => :quux)
79
+ end
80
+
81
+ it "should render project info and it's environments" do
82
+ project.stub(:environments => [:the_environment])
83
+ printer.should_receive(:render_environment).with(:the_environment)
84
+ printer.render_project(project).should == "Project: quux\n"
85
+ end
86
+
87
+ it "should render appropriate message if there are no environments for project" do
88
+ project.stub(:environments => [])
89
+ printer.render_project(project).should == "Project: quux (No environments)\n"
90
+ end
91
+ end
92
+
93
+ describe "#render_config" do
94
+ let(:config) do
95
+ stub(:Config,
96
+ :default_destination => "hello:bye")
97
+ end
98
+
99
+ it "should render default destination and all projects" do
100
+ config.stub(:projects => [:the_project])
101
+ printer.should_receive(:render_project).with(:the_project)
102
+ printer.render_config(config).should == "\nDefault destination: hello:bye"
103
+ end
104
+
105
+ it "should render appropriate message if there are no projects" do
106
+ config.stub(:projects => [])
107
+ printer.render_config(config).should == "There are no projects yet..."
108
+ end
109
+ end
110
+
111
+ def printer
112
+ @printer ||= ConfigPrinter.new
113
+ end
114
+ end
115
+
@@ -11,6 +11,11 @@ describe "Command" do
11
11
  cmd.command.should == "rails c"
12
12
  end
13
13
 
14
+ specify "#description= should set command description" do
15
+ cmd.description= "Run rails console"
16
+ cmd.description.should == "Run rails console"
17
+ end
18
+
14
19
  describe "#render" do
15
20
  it "should pick up server's environment variables and location" do
16
21
  server = mock(:Server, :environment_variables => { :FOO => "bar baz" }, :default_location => "/var/apps/the app")
@@ -157,6 +157,27 @@ describe "DestinationResolver" do
157
157
  end
158
158
  end
159
159
 
160
+ describe "#get_node" do
161
+ it "should return server when path has 3 segments and is correct" do
162
+ resolver(config, "foo:bar:s1").get_node.should == server1
163
+ end
164
+
165
+ it "should return environment when path has 2 segments and is correct" do
166
+ resolver(config, "foo:bar").get_node.name.should == :bar
167
+ end
168
+
169
+ it "should return project when path has 1 segment and is correct" do
170
+ resolver(config, "foo").get_node.name.should == :foo
171
+ end
172
+
173
+ it "should return the config if path has is empty" do
174
+ resolver(config, "").get_node.should == config
175
+ end
176
+
177
+ it "should raise NonExistentDestinationError when path is not correct" do
178
+ expect { resolver(config, "i").get_node }.to raise_error(NonExistentDestinationError)
179
+ end
180
+ end
160
181
 
161
182
  def resolver(*args)
162
183
  DestinationResolver.new(*args)
@@ -20,29 +20,27 @@ describe "DSL" do
20
20
 
21
21
  it "should create a #{scope_name} and set it as current scope object" do # it "should create project and set it as current scope object"
22
22
  dsl(parent_scope, factory.create(parent_scope_name)) do |c| # dsl([:config], factory.create(:config)) do |c|
23
- c.current_scope_object.should_receive(:find).with(scope_name, :bar). # c.current_scope_object.should_receive(:find).with(:project, :bar).
24
- and_yield.and_return(:bacon) # and_yield.and_return(:bacon)
25
- factory.should_receive(:create).with(scope_name, :bar) # factory.should_receive(:create).with(:project, :bar)
23
+ stub_find_or_create_scope_object(c, scope_name, :bar) # stub_find_or_create_scope_object(c, :project, :bar)
26
24
  c.send(scope_name, :bar) do # c.project(:bar) do
27
25
  c.current_scope_object.should_not be_nil # c.current_scope_object.should_not be_nil
28
- c.current_scope_object.should == :bacon # c.current_scope_object.should == factory.project
26
+ c.current_scope_object.should == factory.send(scope_name) # c.current_scope_object.should == factory.project
29
27
  end # end
30
28
  end # end
31
29
  end # end
32
30
 
33
- it "should not leak #{scope_name} as current scope object" do # it "should not leak project as current scope object"
34
- dsl(parent_scope, factory.create(parent_scope_name)) do |c| # dsl([:config], factory.create(:config)) do |c|
35
- c.current_scope_object.stub(:find => factory.create(scope_name, :bar)) # c.current_scope.stub(:find => factory.create(:project, :bar))
36
- c.send(scope_name, :bar) do # c.project(:bar) do
37
- c.current_scope_object.should == factory.send(scope_name) # c.current_scope_object.should == factory.project
38
- end # end
39
- c.current_scope_object.should_not == factory.send(scope_name) # c.current_scope_object.should_not == factory.project
40
- end # end
41
- end # end
31
+ it "should not leak #{scope_name} as current scope object" do # it "should not leak project as current scope object"
32
+ dsl(parent_scope, factory.create(parent_scope_name)) do |c| # dsl([:config], factory.create(:config)) do |c|
33
+ stub_find_or_create_scope_object(c, scope_name, :bar) # stub_find_or_create_scope_object(c, :project, :bar)
34
+ c.send(scope_name, :bar) do # c.project(:bar) do
35
+ c.current_scope_object.should == factory.send(scope_name) # c.current_scope_object.should == factory.project
36
+ end # end
37
+ c.current_scope_object.should_not == factory.send(scope_name) # c.current_scope_object.should_not == factory.project
38
+ end # end
39
+ end # end
42
40
 
43
41
  it "should add a #{scope_name} to the #{parent_scope_name}'s #{scope_name}s collection" do # it "should add a project to the config's projects collection" do
44
42
  dsl(parent_scope, factory.create(parent_scope_name)) do |c| # dsl([:config], factory.create(:config)) do |c|
45
- c.current_scope_object.stub(:find => factory.create(scope_name, :bar)) # c.current_scope_object.stub(:find => factory.create(:project, :bar))
43
+ stub_find_or_create_scope_object(c, scope_name, :bar) # stub_find_or_create_scope_object(c, :project, :bar)
46
44
  c.current_scope_object.should_receive("append_#{scope_name}"). # c.current_scope_object.should_receive(:append_project).
47
45
  with(factory.send(scope_name)) # with(factory.project)
48
46
  c.send(scope_name, :bar) {} # c.project(:bar) {}
@@ -80,6 +78,15 @@ describe "DSL" do
80
78
  describe "#server" do
81
79
  it_behaves_like "a scope", :server, :environment
82
80
 
81
+ it "should have name optional" do
82
+ dsl(scopes[:environment], factory.create(:environment, :foo)) do |c|
83
+ stub_find_or_create_scope_object(c, :server, :default)
84
+ c.server do
85
+ c.current_scope_object.name.should == :default
86
+ end
87
+ end
88
+ end
89
+
83
90
  describe "#host" do
84
91
  it_behaves_like "an attribute", :host, :server, :host=, "127.0.0.2"
85
92
  end
@@ -106,6 +113,10 @@ describe "DSL" do
106
113
  describe "#execute" do
107
114
  it_behaves_like "an attribute", :execute, :command, :command=, "rails c"
108
115
  end
116
+
117
+ describe "#desc" do
118
+ it_behaves_like "an attribute", :desc, :command, :description=, "Run rails console"
119
+ end
109
120
  end
110
121
  end
111
122
  end
@@ -154,5 +165,10 @@ describe "DSL" do
154
165
 
155
166
  it "should raise meaningful error if config parse failed"
156
167
  end
168
+
169
+ def stub_find_or_create_scope_object(scope_object, scope, name)
170
+ scope_object.current_scope_object.should_receive(:find).and_yield.and_return(factory.create(scope, name))
171
+ factory.should_receive(:create).with(scope, name)
172
+ end
157
173
  end
158
174
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: taketo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -85,6 +85,7 @@ files:
85
85
  - bin/taketo
86
86
  - lib/taketo/commands/ssh_command.rb
87
87
  - lib/taketo/commands.rb
88
+ - lib/taketo/config_printer.rb
88
89
  - lib/taketo/config_validator.rb
89
90
  - lib/taketo/constructs/base_construct.rb
90
91
  - lib/taketo/constructs/command.rb
@@ -103,6 +104,7 @@ files:
103
104
  - lib/taketo.rb
104
105
  - spec/integration/dsl_integration_spec.rb
105
106
  - spec/lib/taketo/commands/ssh_command_spec.rb
107
+ - spec/lib/taketo/config_printer_spec.rb
106
108
  - spec/lib/taketo/config_validator_spec.rb
107
109
  - spec/lib/taketo/constructs/base_construct_spec.rb
108
110
  - spec/lib/taketo/constructs/command_spec.rb
@@ -122,6 +124,7 @@ files:
122
124
  - features/commands.feature
123
125
  - features/config_validation.feature
124
126
  - features/connect_to_server.feature
127
+ - features/help.feature
125
128
  - features/step_definitions/main_steps.rb
126
129
  - features/support/env.rb
127
130
  - Gemfile