do 0.0.3 → 0.1.0

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/lib/do/tasks.rb ADDED
@@ -0,0 +1,66 @@
1
+ module DO
2
+ module Tasks
3
+ class NotFound < StandardError; end
4
+ extend self
5
+
6
+ def tasks
7
+ @_tasks ||= []
8
+ end
9
+
10
+ def desc(*args)
11
+ @_desc = args.shift
12
+ end
13
+
14
+ def namespace(text, &block)
15
+ namespace_was, @_namespace = @_namespace, text.to_s
16
+ @_namespace = '%s:%s' % [namespace_was, @_namespace] if namespace_was && namespace_was != ''
17
+ block.call
18
+ ensure
19
+ @_namespace = namespace_was
20
+ end
21
+
22
+ def task(name, options={}, &block)
23
+ name, deps = name.is_a?(Hash) ? [name.keys[0], Array(name.values[0])] : [name, []]
24
+ tasks << options.merge({
25
+ :name => name.to_s,
26
+ :desc => @_desc.to_s,
27
+ :deps => deps,
28
+ :namespace => @_namespace.to_s,
29
+ :block => block,
30
+ :in => Array(options[:in])
31
+ })
32
+ tasks[-1]
33
+ ensure
34
+ @_desc = nil
35
+ end
36
+
37
+ def task_run(*args)
38
+ args_was = args.dup
39
+ task = task_find(args.shift)
40
+ opts = DO::Parser.new(*args)
41
+ task[:deps].each { |d| task_run(*args.unshift(d).push('--dependency')) }
42
+ if task[:in].empty?
43
+ task[:block].arity == 1 ? task[:block].call(opts) : task[:block].call if task[:block]
44
+ else
45
+ task[:in] = send(task[:in][0]) if task[:in].size == 1 && method_defined?(task[:in][0])
46
+ task[:in].each do |d|
47
+ parent = task_find(d)
48
+ case parent[:block].arity
49
+ when 1 then parent[:block].call(task[:block])
50
+ when 2 then parent[:block].call(opts, task[:block])
51
+ else parent[:block].call
52
+ end
53
+ end
54
+ end
55
+ rescue NotFound => e
56
+ method_defined?(args_was[0]) ? send(args_was.shift) : raise(e)
57
+ end
58
+ alias :run_task :task_run
59
+
60
+ def task_find(name)
61
+ spaces = name.to_s.split(":")
62
+ task = spaces.pop
63
+ tasks.find { |t| t[:name] == task && t[:namespace] == spaces.join(":") } || raise(NotFound, 'Task with "%s" not found' % name)
64
+ end
65
+ end # Tasks
66
+ end # DO
data/lib/do/utils.rb CHANGED
@@ -10,12 +10,12 @@ module DO
10
10
  # end
11
11
  #
12
12
  def wait
13
- puts "\e[36mPress ENTER to continue...\e[0m"
14
- STDIN.gets
13
+ log "\e[36mPress ENTER to continue...\e[0m"
14
+ $stdin.gets
15
15
  end
16
16
 
17
17
  ##
18
- # Ask question to your STDIN.
18
+ # Ask question to your $stdin.
19
19
  # This command is useful in conjunction with a CLI
20
20
  #
21
21
  # ==== Example
@@ -23,13 +23,17 @@ module DO
23
23
  # new_pwd = ask "Tell me the new password of mysql"
24
24
  # run "mysqladmin -u root -p password '#{new_pwd}', :input => old_pwd
25
25
  #
26
- def ask(question, allow_blank=false)
26
+ def ask(*args)
27
+ question = args[0]
28
+ options = args.last.is_a?(Hash) ? args.pop : {}
27
29
  result = ""
30
+ `stty -echo` if options[:silent]
28
31
  loop do
29
32
  log("\e[36m%s: \e[0m" % question, false)
30
- result = STDIN.gets.chomp
31
- break if allow_blank || result != ""
33
+ result = $stdin.gets.chomp
34
+ break if options[:allow_blank] || result != ""
32
35
  end
36
+ `stty echo` && log("\n", false) if options[:silent]
33
37
  result
34
38
  end
35
39
 
@@ -46,10 +50,29 @@ module DO
46
50
  question += "?" if question[-1] != ??
47
51
  loop do
48
52
  log("\e[36m%s (y/n): \e[0m" % question, false)
49
- result = STDIN.gets.chomp
53
+ result = $stdin.gets.chomp
50
54
  break if result =~ /y|yes|n|no/i
51
55
  end
52
56
  return result =~ /y|yes/i
53
57
  end
58
+
59
+ ##
60
+ # Print the text into logger buffer, if you want to change
61
+ # the stream edit the constant DO_LOGGER
62
+ #
63
+ def log(text, new_line=false)
64
+ text += "\n" if new_line && text[-1] != ?\n
65
+ DO_LOGGER.print text
66
+ end
67
+
68
+ ##
69
+ # Execute a local command
70
+ #
71
+ def run(*cmds)
72
+ cmd = cmds.map(&:to_s).join(' ')
73
+ log DO_LOGGER_FORMAT % [:do, :local, cmd]
74
+ system cmd
75
+ end
76
+ alias :sh :run # keep old compatibility
54
77
  end # Utils
55
78
  end # DO
data/lib/do/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module DO
2
- VERSION = "0.0.3" unless defined?(DO::VERSION)
2
+ VERSION = "0.1.0" unless defined?(DO::VERSION)
3
3
  end
data/lib/do.rb CHANGED
@@ -1,27 +1,13 @@
1
1
  DO_PATH = ENV['DO_PATH'] ||= File.expand_path("~/.do") unless defined?(DO_PATH)
2
+ DO_LOGGER = $stdout unless defined?(DO_LOGGER)
3
+ DO_LOGGER_FORMAT = "\e[36m%s\e[33m@\e[31m%s \e[33m~ \e[35m#\e[0m %s" unless defined?(DO_LOGGER_FORMAT)
2
4
 
3
5
  module DO
4
-
6
+ autoload :CLI, 'do/cli.rb'
5
7
  autoload :Server, 'do/server.rb'
6
8
  autoload :Utils, 'do/utils.rb'
9
+ autoload :Commands, 'do/commands.rb'
10
+ autoload :Tasks, 'do/tasks.rb'
11
+ autoload :Parser, 'do/parser.rb'
7
12
  autoload :VERSION, 'do/version.rb'
8
-
9
- extend self
10
-
11
- ##
12
- # DO loads rakefiles in these locations:
13
- #
14
- # ~/do/dorc
15
- # ~/do/*.rake
16
- # ./Do
17
- # ./Dofile
18
- #
19
- # DO_PATH, default is ~/do.
20
- #
21
- def recipes
22
- @_recipes ||= (
23
- %w[dorc *.rake].map { |f| Dir[File.join(DO_PATH, f)] }.flatten +
24
- %w[./Do ./Dofile].map { |f| File.expand_path(f) }
25
- ).reject { |f| !File.exist?(f) }
26
- end
27
13
  end # DO
data/spec/cli_spec.rb ADDED
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe DO::CLI do
4
+
5
+ def cli; DO::CLI end
6
+
7
+ it 'should show help if args are empty' do
8
+ DO::CLI.start
9
+ logger.should match(/Usage/)
10
+ end
11
+
12
+ it 'should show task list if task does not exist' do
13
+ DO::CLI.start
14
+ logger.should match(/list/)
15
+ logger.should match(/version/)
16
+ end
17
+
18
+ it 'should run task' do
19
+ DO::CLI.start(:version)
20
+ logger.should match(DO::VERSION)
21
+ end
22
+ end
@@ -0,0 +1,157 @@
1
+ require 'spec_helper'
2
+ require 'do/commands.rb'
3
+
4
+ class Faker
5
+ extend DO::Commands
6
+
7
+ load_recipes
8
+
9
+ task :sample do
10
+ puts "I'm a fantastic sample"
11
+ end
12
+
13
+ def demos
14
+ @a=1
15
+ end
16
+ end
17
+
18
+ describe DO::Commands do
19
+
20
+ def cmd; DO::Commands; end
21
+
22
+ before(:each){ cmd.tasks.clear; cmd.load_recipes; cmd.servers.clear }
23
+ before(:all) { FileUtils.rm_rf(DO_PATH) }
24
+ after(:all) { FileUtils.rm_rf(DO_PATH) }
25
+
26
+ it 'should set DO_PATH' do
27
+ DO_PATH.should == File.expand_path('../tmp', __FILE__)
28
+ end
29
+
30
+ it 'should have not an existent DO_PATH' do
31
+ File.exist?(DO_PATH).should be_false
32
+ end
33
+
34
+ it 'should have common tasks' do
35
+ Faker.tasks.size.should == 6
36
+ end
37
+
38
+ it 'should have not servers' do
39
+ cmd.servers.should be_empty
40
+ Faker.servers.should be_empty
41
+ end
42
+
43
+ it 'should create a new task' do
44
+ tasks_was = cmd.tasks.size
45
+ cmd.task(:nope) { }
46
+ cmd.tasks.size.should == tasks_was+1
47
+ end
48
+
49
+ it 'should have one server' do
50
+ cmd.server :srv1, 'srv1.domain.local', 'root'
51
+ cmd.servers.size.should == 1
52
+ Faker.servers.should be_empty
53
+ end
54
+
55
+ it 'should setup a new environment' do
56
+ cmd.task_run(:setup)
57
+ File.exist?(File.join(DO_PATH, 'dorc')).should be_true
58
+ logger.should match("Generated template, now you can add your config to:")
59
+ end
60
+
61
+ it 'should generate a correct template' do
62
+ dorc = File.read(File.join(DO_PATH, 'dorc'))
63
+ dorc.should match(/# Server definitions/)
64
+ dorc.should match(/# Here my plugins/)
65
+ end
66
+
67
+ it 'should add a plugin' do
68
+ recipe = "https://raw.github.com/gist/1143314/4e1c504e4dfbd988c76e6e28a445d985df2644d0/sample.rake"
69
+ begin
70
+ stdout_was = STDERR.dup; STDERR.reopen('/dev/null')
71
+ cmd.task_run(:download, '--url=%s' % recipe)
72
+ expect { Faker.task_run(:download, '--url=%s' % recipe) }.to raise_error(SystemExit)
73
+ ensure
74
+ STDERR.reopen(stdout_was)
75
+ end
76
+ logger.should match(/already has plugin/)
77
+ dorc = File.read(File.join(DO_PATH, 'dorc'))
78
+ dorc.should match("plugin :sample, '%s'" % recipe)
79
+ dest = File.join(DO_PATH, 'sample.rake')
80
+ File.exist?(dest).should be_true
81
+ logger.should match("## Installing plugin sample")
82
+ cmd.run_task('sample')
83
+ logger.should match("Hey")
84
+ end
85
+
86
+ it 'should print unformatted logs' do
87
+ cmd.task :sample do
88
+ cmd.log 'standard log'
89
+ end
90
+ cmd.task_run :sample
91
+ logger.should match("standard log")
92
+ end
93
+
94
+ it 'should set correclty an option to the given value' do
95
+ cmd.set :foo, :bar
96
+ cmd.foo.should == :bar
97
+ end
98
+
99
+ it 'should show version number' do
100
+ cmd.run_task(:version)
101
+ logger.should match(DO::VERSION)
102
+ end
103
+
104
+ it 'should show help' do
105
+ cmd.run_task(:help)
106
+ logger.should match(/Usage/)
107
+ end
108
+
109
+ context DO::Server do
110
+
111
+ it 'should create a basic server' do
112
+ cmd.server :sho0, 'sho0.lipsiasoft.biz', 'root', :keys => Dir['/Developer/keys/*.pem']
113
+ cmd.task :test, :in => :sho0 do
114
+ cmd.run('uname').should == 'Linux'
115
+ end
116
+ cmd.task_run(:test)
117
+ end
118
+
119
+ it 'should connect to two servers' do
120
+ cmd.server :sho0, 'sho0.lipsiasoft.biz', 'root', :keys => Dir['/Developer/keys/*.pem']
121
+ cmd.server :srv1, 'srv1.lipsiasoft.biz', 'root', :keys => Dir['/Developer/keys/*.pem']
122
+ cmd.task :connection, :in => [:srv1, :sho0] do
123
+ cmd.run('uname -a').should match(cmd.current_server.name.to_s)
124
+ end
125
+ cmd.task_run(:connection)
126
+ cmd.current_server.should be_nil
127
+ end
128
+
129
+ it 'should works with complex tasks' do
130
+ cmd.server :sho0, 'sho0.lipsiasoft.biz', 'root', :keys => Dir['/Developer/keys/*.pem']
131
+ cmd.server :srv1, 'srv1.lipsiasoft.biz', 'root', :keys => Dir['/Developer/keys/*.pem']
132
+ cmd.task :connection, :in => :remote do
133
+ cmd.run('uname -a').should match(cmd.current_server.name.to_s)
134
+ end
135
+ cmd.task_run(:connection)
136
+ cmd.current_server.should be_nil
137
+ end
138
+
139
+ it 'should skip if --no-xx' do
140
+ cmd.server :sho0, 'sho0.lipsiasoft.biz', 'root', :keys => Dir['/Developer/keys/*.pem']
141
+ cmd.server :srv1, 'srv1.lipsiasoft.biz', 'root', :keys => Dir['/Developer/keys/*.pem']
142
+ cmd.task :hostname, :in => :remote do |options|
143
+ cmd.run('hostname').should match(/srv1/)
144
+ end
145
+ cmd.task_run(:hostname, '--no-sho0')
146
+ end
147
+
148
+ it 'should match one if --xx' do
149
+ cmd.server :sho0, 'sho0.lipsiasoft.biz', 'root', :keys => Dir['/Developer/keys/*.pem']
150
+ cmd.server :srv1, 'srv1.lipsiasoft.biz', 'root', :keys => Dir['/Developer/keys/*.pem']
151
+ cmd.task :hostname, :in => :remote do |options|
152
+ cmd.run('hostname').should match(/srv1/)
153
+ end
154
+ cmd.task_run(:hostname, '--srv1')
155
+ end
156
+ end # DO::Server
157
+ end # DO::Commands
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+
3
+ describe DO::Parser do
4
+
5
+ it 'should parse --foo=bar' do
6
+ parsed = DO::Parser.new('--foo=bar')
7
+ parsed[:foo].should == 'bar'
8
+ end
9
+
10
+ it 'should parse -foo=bar' do
11
+ parsed = DO::Parser.new('-foo=bar')
12
+ parsed[:foo].should == 'bar'
13
+ end
14
+
15
+ it 'should parse --foo-bar=hey' do
16
+ parsed = DO::Parser.new('--foo-bar=hey')
17
+ parsed[:'foo-bar'].should == 'hey'
18
+ end
19
+
20
+ it 'should parse -foo-bar=hey' do
21
+ parsed = DO::Parser.new('-foo-bar=hey')
22
+ parsed[:'foo-bar'].should == 'hey'
23
+ end
24
+
25
+ it 'should parse --foo bar' do
26
+ parsed = DO::Parser.new('--foo', 'bar')
27
+ parsed[:foo].should == 'bar'
28
+ end
29
+
30
+ it 'should parse -foo bar' do
31
+ parsed = DO::Parser.new('-foo', 'bar')
32
+ parsed[:foo].should == 'bar'
33
+ end
34
+
35
+ it 'should parse --foo' do
36
+ parsed = DO::Parser.new('--foo')
37
+ parsed[:foo].should == true
38
+ end
39
+
40
+ it 'should parse -foo' do
41
+ parsed = DO::Parser.new('-foo')
42
+ parsed[:foo].should == true
43
+ end
44
+
45
+ it 'should parse --no-foo' do
46
+ parsed = DO::Parser.new('--no-foo')
47
+ parsed[:foo].should == false
48
+ end
49
+
50
+ it 'should parse -no-foo' do
51
+ parsed = DO::Parser.new('-no-foo')
52
+ parsed[:foo].should == false
53
+ end
54
+
55
+ it 'should parse int' do
56
+ parsed = DO::Parser.new('--foo=1')
57
+ parsed[:foo].should == 1
58
+ end
59
+
60
+ it 'should parse boolean' do
61
+ parsed = DO::Parser.new('--foo=true')
62
+ parsed[:foo].should == true
63
+ parsed = DO::Parser.new('--foo=false')
64
+ parsed[:foo].should == false
65
+ end
66
+
67
+ it 'should parse float' do
68
+ parsed = DO::Parser.new('--foo=100.99')
69
+ parsed[:foo].should == 100.99
70
+ end
71
+
72
+ it 'should parse array' do
73
+ parsed = DO::Parser.new('--foo=1,a,b,2')
74
+ parsed[:foo].should == ['1', 'a', 'b', '2']
75
+ end
76
+ end
data/spec/server_spec.rb CHANGED
@@ -2,9 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe DO::Server do
4
4
  before do
5
- keys = %w(/Developer/src/LipsiaSoft/lipsiahosting/lib/lipsiarec/recipes/servers/resources/keys/Lipsiasoft.pem)
6
- @server = DO::Server.new(:sho0, 'sho0.lipsiasoft.biz', 'ec2-user', :keys => keys)
7
- @server.logger = StringIO.new
5
+ @server = DO::Server.new(:sho0, 'sho0.lipsiasoft.biz', 'ec2-user', :keys => Dir['/Developer/keys/*.pem'])
8
6
  @fixture = File.expand_path('../fixtures/sample', __FILE__)
9
7
  @fixture_was = File.read(@fixture)
10
8
  end
@@ -14,7 +12,7 @@ describe DO::Server do
14
12
  release.should match(/Linux/)
15
13
  end
16
14
 
17
- it 'should upload a something' do
15
+ it 'should upload something' do
18
16
  @server.upload @fixture, '/tmp/sample'
19
17
  @server.exist?('/tmp/sample').should be_true
20
18
  end
data/spec/spec_helper.rb CHANGED
@@ -1,19 +1,20 @@
1
1
  require 'rubygems' unless defined?(Gem)
2
+ require 'stringio'
3
+
4
+ DO_PATH = File.expand_path('../tmp', __FILE__)
5
+ DO_LOGGER = StringIO.new
6
+
2
7
  require 'bundler/setup'
3
8
  require 'rspec'
4
9
  require 'fileutils'
5
10
  require 'do'
6
11
 
7
- module Helper
8
- def capture_stdout(&block)
9
- stdout_was, $stdout = $stdout, StringIO.new
10
- block.call
11
- return $stdout
12
- ensure
13
- $stdout = stdout_was
12
+ module Helpers
13
+ def logger
14
+ DO_LOGGER.string
14
15
  end
15
16
  end
16
17
 
17
- RSpec.configure do |config|
18
- config.include(Helper)
18
+ RSpec.configure do |c|
19
+ c.include Helpers
19
20
  end
@@ -0,0 +1,154 @@
1
+ require 'spec_helper'
2
+
3
+ describe DO::Tasks do
4
+
5
+ def cmd; DO::Tasks; end
6
+
7
+ before(:each){ cmd.tasks.clear }
8
+
9
+ it 'should init a basic task' do
10
+ DO::Commands.load_recipes
11
+ task = cmd.task(:name){}
12
+ task[:name].should == 'name'
13
+ task[:desc].should == ''
14
+ task[:namespace].should == ''
15
+ task[:block] == nil
16
+ cmd.tasks.size.should == 1
17
+ end
18
+
19
+ it 'should clear old task' do
20
+ cmd.tasks.size.should == 0
21
+ end
22
+
23
+ it 'should have description' do
24
+ cmd.desc :desc
25
+ task = cmd.task(:name){}
26
+ task[:desc].should == 'desc'
27
+ end
28
+
29
+ it 'should not confuse desc' do
30
+ cmd.desc :desc
31
+ task = cmd.task(:name){}
32
+ task[:desc].should == 'desc'
33
+ task = cmd.task(:name_alt){}
34
+ task[:desc].should == ''
35
+ end
36
+
37
+ it 'should have namespace' do
38
+ cmd.tasks.clear
39
+ @a = 0
40
+ cmd.namespace :namespace do
41
+ cmd.task(:one){ @a+=1 }
42
+ cmd.task(:two){ @a+=1 }
43
+ end
44
+ cmd.task(:three){ @a+=1 }
45
+ cmd.tasks.should have(3).items
46
+ @a.should == 0
47
+ cmd.tasks.each { |t| t[:block].call }
48
+ @a.should == 3
49
+ cmd.tasks[0][:namespace].should == 'namespace'
50
+ cmd.tasks[1][:namespace].should == 'namespace'
51
+ cmd.tasks[2][:namespace].should == ''
52
+ end
53
+
54
+ it 'should have nested namespaces' do
55
+ cmd.namespace :foo do
56
+ cmd.task(:one)
57
+ cmd.namespace :bar do
58
+ cmd.task(:two)
59
+ cmd.namespace :bax do
60
+ cmd.task(:three)
61
+ end
62
+ end
63
+ cmd.task(:four)
64
+ end
65
+ cmd.task(:five)
66
+ cmd.tasks[0][:namespace].should == 'foo'
67
+ cmd.tasks[1][:namespace].should == 'foo:bar'
68
+ cmd.tasks[2][:namespace].should == 'foo:bar:bax'
69
+ cmd.tasks[3][:namespace].should == 'foo'
70
+ cmd.tasks[4][:namespace].should == ''
71
+ end
72
+
73
+ it 'should raise notfound' do
74
+ expect { cmd.task_run(:foobar) }.to raise_error(DO::Tasks::NotFound)
75
+ end
76
+
77
+ it 'should have a dependency flag' do
78
+ cmd.task(:foo) { |o| o[:dependency].should be_true }
79
+ cmd.task(:bar => :foo) { |o| o.should_not have_key(:dependency) }
80
+ cmd.task_run(:bar)
81
+ end
82
+
83
+ context 'when using #task_run' do
84
+ it 'should run correctly' do
85
+ cmd.namespace :foo do
86
+ cmd.task(:one){@a=1}
87
+ cmd.namespace :bar do
88
+ cmd.task(:two){@b=2}
89
+ end
90
+ cmd.task(:three){@c=3}
91
+ end
92
+ cmd.task(:four){@d=4}
93
+ cmd.task_run('foo:one'); @a.should == 1
94
+ cmd.task_run('foo:bar:two'); @b.should == 2
95
+ cmd.task_run('foo:three'); @c.should == 3
96
+ cmd.task_run('four'); @d.should == 4
97
+ end
98
+
99
+ it 'should parse options' do
100
+ cmd.namespace :foo do
101
+ cmd.task(:one){ |o| @o=o }
102
+ cmd.namespace :bar do
103
+ cmd.task(:two){ |o| @o=o }
104
+ end
105
+ cmd.task(:three){ |o| @o=o }
106
+ end
107
+ cmd.task(:four){ |o| @o=o }
108
+ cmd.task_run('foo:one', '--name=mine'); @o[:name].should == 'mine'
109
+ cmd.task_run('foo:bar:two', '--age=2'); @o[:age].should == 2
110
+ cmd.task_run('foo:three', '--yes'); @o[:yes].should == true
111
+ cmd.task_run('four', '--no-value'); @o[:value].should == false
112
+ end
113
+
114
+ it 'should run deps' do
115
+ cmd.task(:dep1){@deps=1}
116
+ cmd.task(:last => [:dep1]){@deps}
117
+ cmd.task_run(:last) == 1
118
+ end
119
+
120
+ it 'should share with opts with deps' do
121
+ cmd.task(:dep1){ |d| @value = d[:value] }
122
+ cmd.task(:dep2){ |d| @value+=1 }
123
+ cmd.task(:dep3){ |d| @value+=1 }
124
+ cmd.task(:last => [:dep1, :dep2, :dep3]){ |d| @value+=1 }
125
+ cmd.task_run(:last, '--value=5')
126
+ @value.should == 8
127
+ end
128
+
129
+ it 'should repeat itself with blocks' do
130
+ cmd.task(:dep1){ |b| @value=3; b.call }
131
+ cmd.task(:last, :in => :dep1){ @value+=1 }
132
+ cmd.task_run(:last)
133
+ @value.should == 4
134
+ end
135
+
136
+ it 'should repeat itself without blocks' do
137
+ cmd.tasks.clear
138
+ cmd.task(:dep1) { @value = 5 }
139
+ cmd.task(:dep2) { @value += 1 }
140
+ cmd.task(:dep3) { @value += 1 }
141
+ cmd.task(:dep4) { @value += 1 }
142
+ cmd.task(:last, :in => [:dep1, :dep2, :dep3, :dep4])
143
+ cmd.task_run(:last)
144
+ @value.should == 8
145
+ end
146
+
147
+ it 'should run methods if NotFound raised' do
148
+ cmd.tasks.clear
149
+ cmd.send(:define_method, :demos) {}
150
+ cmd.task(:demo => :demos)
151
+ expect { cmd.task_run(:demo) }.to_not raise_error
152
+ end
153
+ end
154
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'DO::Utils' do
4
+ def shell
5
+ @_shell ||= Class.new { include DO::Utils }.new
6
+ end
7
+
8
+ it 'should log' do
9
+ DO_LOGGER.should_receive(:print).with('foo')
10
+ shell.log 'foo'
11
+ end
12
+
13
+ it 'should should ask' do
14
+ DO_LOGGER.should_receive(:print).with("\e[36mShould I overwrite it?: \e[0m")
15
+ $stdin.should_receive(:gets).and_return('Sure')
16
+ shell.ask("Should I overwrite it?").should == "Sure"
17
+ end
18
+
19
+ it 'should yes? and return true' do
20
+ DO_LOGGER.should_receive(:print).with("\e[36mIt is true? (y/n): \e[0m")
21
+ $stdin.should_receive(:gets).and_return('y')
22
+ shell.yes?('It is true').should be_true
23
+ end
24
+
25
+ it 'should yes? and return false' do
26
+ DO_LOGGER.should_receive(:print).with("\e[36mIt is true? (y/n): \e[0m")
27
+ $stdin.should_receive(:gets).and_return('n')
28
+ shell.yes?('It is true').should be_false
29
+ end
30
+
31
+ it 'should wait' do
32
+ DO_LOGGER.should_receive(:print).with("\e[36mPress ENTER to continue...\e[0m")
33
+ $stdin.should_receive(:gets).and_return('fooo')
34
+ shell.wait
35
+ end
36
+ end