corl 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (122) hide show
  1. data/Gemfile +5 -10
  2. data/Gemfile.lock +13 -11
  3. data/README.rdoc +1 -1
  4. data/Rakefile +3 -3
  5. data/VERSION +1 -1
  6. data/bin/corl +2 -54
  7. data/bootstrap/bootstrap.sh +91 -0
  8. data/bootstrap/lib/shell/LICENSE.txt +674 -0
  9. data/bootstrap/lib/shell/command.sh +214 -0
  10. data/bootstrap/lib/shell/filesystem.sh +139 -0
  11. data/bootstrap/lib/shell/load.sh +73 -0
  12. data/bootstrap/lib/shell/os.sh +67 -0
  13. data/bootstrap/lib/shell/script.sh +160 -0
  14. data/bootstrap/lib/shell/starter.sh +64 -0
  15. data/bootstrap/lib/shell/validators.sh +50 -0
  16. data/bootstrap/os/ubuntu/00_base.sh +5 -0
  17. data/bootstrap/os/ubuntu/01_git.sh +5 -0
  18. data/bootstrap/os/ubuntu/05_ruby.sh +7 -0
  19. data/bootstrap/os/ubuntu/06_puppet.sh +38 -0
  20. data/bootstrap/os/ubuntu/10_corl.sh +9 -0
  21. data/corl.gemspec +61 -124
  22. data/lib/{corl → CORL}/action/bootstrap.rb +13 -7
  23. data/lib/CORL/action/exec.rb +39 -0
  24. data/lib/CORL/action/image.rb +31 -0
  25. data/lib/{corl → CORL}/action/images.rb +1 -1
  26. data/lib/CORL/action/lookup.rb +34 -0
  27. data/lib/{corl → CORL}/action/machines.rb +1 -1
  28. data/lib/CORL/action/provision.rb +31 -0
  29. data/lib/{corl → CORL}/action/seed.rb +3 -3
  30. data/lib/{corl → CORL}/action/spawn.rb +2 -2
  31. data/lib/CORL/action/start.rb +31 -0
  32. data/lib/CORL/action/stop.rb +31 -0
  33. data/lib/{corl → CORL}/configuration/file.rb +1 -1
  34. data/lib/{corl → CORL}/event/puppet.rb +1 -1
  35. data/lib/{corl → CORL}/extension/puppetloader.rb +1 -1
  36. data/lib/{corl → CORL}/machine/fog.rb +3 -3
  37. data/lib/{corl → CORL}/machine/physical.rb +2 -2
  38. data/lib/{corl → CORL}/network/default.rb +1 -1
  39. data/lib/{corl → CORL}/node/aws.rb +0 -4
  40. data/lib/{corl → CORL}/node/google.rb +0 -4
  41. data/lib/{corl → CORL}/node/local.rb +1 -1
  42. data/lib/{corl → CORL}/node/rackspace.rb +0 -4
  43. data/lib/{corl → CORL}/provisioner/puppetnode.rb +1 -14
  44. data/lib/{corl → CORL}/provisioner/puppetnode/resource.rb +0 -0
  45. data/lib/{corl → CORL}/provisioner/puppetnode/resource_group.rb +0 -0
  46. data/lib/{corl → CORL}/template/environment.rb +1 -1
  47. data/lib/core/facade.rb +49 -0
  48. data/lib/{corl_core → core}/mixin/action/keypair.rb +10 -10
  49. data/lib/{corl_core → core}/mixin/lookup.rb +0 -0
  50. data/lib/{corl_core → core}/mod/hiera_backend.rb +0 -0
  51. data/lib/{corl_core/mixin/action/node.rb → core/plugin/action.rb} +66 -33
  52. data/lib/{corl_core → core}/plugin/configuration.rb +2 -2
  53. data/lib/{corl/node → core/plugin}/fog.rb +5 -1
  54. data/lib/{corl_core → core}/plugin/machine.rb +2 -2
  55. data/lib/{corl_core → core}/plugin/network.rb +4 -4
  56. data/lib/{corl_core → core}/plugin/node.rb +11 -9
  57. data/lib/{corl_core → core}/plugin/provisioner.rb +2 -2
  58. data/lib/{corl_core → core}/util/ssh.rb +1 -1
  59. data/lib/corl.rb +53 -112
  60. data/lib/puppet/parser/functions/ensure.rb +0 -4
  61. data/locales/en.yml +55 -148
  62. metadata +84 -222
  63. data/lib/corl/action/add.rb +0 -69
  64. data/lib/corl/action/clone.rb +0 -40
  65. data/lib/corl/action/create.rb +0 -55
  66. data/lib/corl/action/exec.rb +0 -41
  67. data/lib/corl/action/extract.rb +0 -49
  68. data/lib/corl/action/image.rb +0 -30
  69. data/lib/corl/action/lookup.rb +0 -35
  70. data/lib/corl/action/provision.rb +0 -37
  71. data/lib/corl/action/remove.rb +0 -51
  72. data/lib/corl/action/save.rb +0 -53
  73. data/lib/corl/action/start.rb +0 -37
  74. data/lib/corl/action/stop.rb +0 -30
  75. data/lib/corl/action/update.rb +0 -37
  76. data/lib/corl/command/shell.rb +0 -164
  77. data/lib/corl/event/regex.rb +0 -52
  78. data/lib/corl/project/git.rb +0 -465
  79. data/lib/corl/project/github.rb +0 -108
  80. data/lib/corl/template/json.rb +0 -16
  81. data/lib/corl/template/wrapper.rb +0 -16
  82. data/lib/corl/template/yaml.rb +0 -16
  83. data/lib/corl/translator/json.rb +0 -27
  84. data/lib/corl/translator/yaml.rb +0 -27
  85. data/lib/corl_core/codes.rb +0 -107
  86. data/lib/corl_core/config.rb +0 -337
  87. data/lib/corl_core/config/collection.rb +0 -57
  88. data/lib/corl_core/config/options.rb +0 -70
  89. data/lib/corl_core/core.rb +0 -59
  90. data/lib/corl_core/corl.rb +0 -254
  91. data/lib/corl_core/errors.rb +0 -84
  92. data/lib/corl_core/facade.rb +0 -126
  93. data/lib/corl_core/gems.rb +0 -72
  94. data/lib/corl_core/manager.rb +0 -425
  95. data/lib/corl_core/mixin/action/commit.rb +0 -58
  96. data/lib/corl_core/mixin/action/project.rb +0 -53
  97. data/lib/corl_core/mixin/action/push.rb +0 -52
  98. data/lib/corl_core/mixin/config/collection.rb +0 -53
  99. data/lib/corl_core/mixin/config/ops.rb +0 -53
  100. data/lib/corl_core/mixin/config/options.rb +0 -39
  101. data/lib/corl_core/mixin/macro/object_interface.rb +0 -361
  102. data/lib/corl_core/mixin/macro/plugin_interface.rb +0 -380
  103. data/lib/corl_core/mixin/settings.rb +0 -46
  104. data/lib/corl_core/mixin/sub_config.rb +0 -148
  105. data/lib/corl_core/mod/hash.rb +0 -29
  106. data/lib/corl_core/plugin/action.rb +0 -381
  107. data/lib/corl_core/plugin/base.rb +0 -374
  108. data/lib/corl_core/plugin/command.rb +0 -98
  109. data/lib/corl_core/plugin/event.rb +0 -53
  110. data/lib/corl_core/plugin/extension.rb +0 -12
  111. data/lib/corl_core/plugin/project.rb +0 -927
  112. data/lib/corl_core/plugin/template.rb +0 -80
  113. data/lib/corl_core/plugin/translator.rb +0 -38
  114. data/lib/corl_core/util/cli.rb +0 -352
  115. data/lib/corl_core/util/data.rb +0 -404
  116. data/lib/corl_core/util/disk.rb +0 -114
  117. data/lib/corl_core/util/git.rb +0 -47
  118. data/lib/corl_core/util/interface.rb +0 -319
  119. data/lib/corl_core/util/liquid.rb +0 -17
  120. data/lib/corl_core/util/package.rb +0 -93
  121. data/lib/corl_core/util/shell.rb +0 -239
  122. data/spec/corl_core/interface_spec.rb +0 -489
@@ -1,239 +0,0 @@
1
-
2
- module CORL
3
- module Util
4
- class Shell < Core
5
-
6
- include Celluloid
7
-
8
- #-----------------------------------------------------------------------------
9
-
10
- @@supervisors = {}
11
-
12
- #-----------------------------------------------------------------------------
13
- # Execution result interface
14
-
15
- class Result
16
- attr_accessor :status
17
- attr_reader :command
18
-
19
- def initialize(command)
20
- @command = command
21
- @output = ''
22
- @errors = ''
23
- @status = CORL.code.success
24
- end
25
-
26
- #---
27
-
28
- def output
29
- @output.strip
30
- end
31
-
32
- def errors
33
- @errors.strip
34
- end
35
-
36
- #---
37
-
38
- def append_output(output_str)
39
- @output << output_str
40
- end
41
-
42
- def append_errors(error_str)
43
- @errors << error_str
44
- end
45
- end
46
-
47
- #-----------------------------------------------------------------------------
48
- # Shell interface
49
-
50
- def self.connection(name = :core)
51
- name = name.to_sym
52
- init_shell(name) unless @@supervisors.has_key?(name)
53
- @@supervisors[name]
54
- end
55
-
56
- def self.init_shell(name)
57
- name = name.to_sym
58
-
59
- Shell.supervise_as name
60
- @@supervisors[name] = Celluloid::Actor[name]
61
- end
62
-
63
- #---
64
-
65
- execute_block_on_receiver :exec
66
-
67
- def exec(command, options = {}, &code)
68
- config = Config.ensure(options)
69
-
70
- min = config.get(:min, 1).to_i
71
- tries = config.get(:tries, min).to_i
72
- tries = ( min > tries ? min : tries )
73
-
74
- info_prefix = config.get(:info_prefix, '')
75
- info_suffix = config.get(:info_suffix, '')
76
- error_prefix = config.get(:error_prefix, '')
77
- error_suffix = config.get(:error_suffix, '')
78
-
79
- ui = config.get(:ui, CORL.ui)
80
-
81
- conditions = CORL.events(config.get(:exit, {}), true)
82
-
83
- $stdout.sync = true
84
- $stderr.sync = true
85
-
86
- system_result = Result.new(command)
87
-
88
- for i in tries.downto(1)
89
- logger.info(">> running: #{command}")
90
-
91
- begin
92
- t1, output_new, output_orig, output_reader = pipe_exec_stream($stdout, conditions, {
93
- :prefix => info_prefix,
94
- :suffix => info_suffix,
95
- }, 'output') do |data|
96
- system_result.append_output(data)
97
- block_given? ? code.call(:output, command, data) : true
98
- end
99
-
100
- t2, error_new, error_orig, error_reader = pipe_exec_stream($stderr, conditions, {
101
- :prefix => error_prefix,
102
- :suffix => error_suffix,
103
- }, 'error') do |data|
104
- system_result.append_errors(data)
105
- block_given? ? code.call(:error, command, data) : true
106
- end
107
-
108
- system_success = system(command)
109
- system_result.status = $?.exitstatus
110
-
111
- ensure
112
- output_success = close_exec_pipe(t1, $stdout, output_orig, output_new, 'output')
113
- error_success = close_exec_pipe(t2, $stderr, error_orig, error_new, 'error')
114
- end
115
-
116
- success = ( system_success && output_success && error_success )
117
-
118
- min -= 1
119
- break if success && min <= 0 && conditions.empty?
120
- end
121
- system_result
122
- end
123
-
124
- #---
125
-
126
- def pipe_exec_stream(output, conditions, options, label, &code)
127
- original = output.dup
128
- read, write = IO.pipe
129
-
130
- match_prefix = ( options[:match_prefix] ? options[:match_prefix] : 'EXIT' )
131
-
132
- thread = process_stream(read, original, options, label) do |data|
133
- check_conditions(data, conditions, match_prefix) do
134
- block_given? ? code.call(data) : true
135
- end
136
- end
137
-
138
- thread.abort_on_exception = false
139
-
140
- output.reopen(write)
141
- return thread, write, original, read
142
- end
143
- protected :pipe_exec_stream
144
-
145
- #---
146
-
147
- def close_exec_pipe(thread, output, original, write, label)
148
- output.reopen(original)
149
-
150
- write.close
151
- success = thread.value
152
-
153
- original.close
154
- return success
155
- end
156
- protected :close_exec_pipe
157
-
158
- #---
159
-
160
- def check_conditions(data, conditions, match_prefix = '', &code)
161
- prefix = ''
162
-
163
- unless ! conditions || conditions.empty?
164
- conditions.each do |key, event|
165
- if event.check(data)
166
- prefix = match_prefix
167
- conditions.delete(key)
168
- end
169
- end
170
- end
171
-
172
- result = true
173
- if block_given?
174
- result = code.call
175
-
176
- unless prefix.empty?
177
- case result
178
- when Hash
179
- result[:prefix] = prefix
180
- else
181
- result = { :success => result, :prefix => prefix }
182
- end
183
- end
184
- end
185
- return result
186
- end
187
- protected :check_conditions
188
-
189
- #---
190
-
191
- def process_stream(input, output, options, label, &code)
192
- return Thread.new do
193
- success = true
194
- default_prefix = ( options[:prefix] ? options[:prefix] : '' )
195
- default_suffix = ( options[:suffix] ? options[:suffix] : '' )
196
-
197
- begin
198
- while ( data = input.readpartial(1024) )
199
- message = data.strip
200
- newline = ( data[-1,1].match(/\n/) ? true : false )
201
-
202
- unless message.empty?
203
- lines = message.split(/\n/)
204
- lines.each_with_index do |line, index|
205
- prefix = default_prefix
206
- suffix = default_suffix
207
-
208
- unless line.empty?
209
- if block_given?
210
- result = code.call(line)
211
-
212
- if result && result.is_a?(Hash)
213
- prefix = result[:prefix]
214
- suffix = result[:suffix]
215
- result = result[:success]
216
- end
217
- success = result if success
218
- end
219
-
220
- prefix = ( prefix && ! prefix.empty? ? "#{prefix}: " : '' )
221
- suffix = ( suffix && ! suffix.empty? ? suffix : '' )
222
- eol = ( index < lines.length - 1 || newline ? "\n" : ' ' )
223
-
224
- output.write(prefix.lstrip + line + suffix.rstrip + eol)
225
- end
226
- end
227
- end
228
- end
229
- rescue EOFError
230
- end
231
-
232
- input.close()
233
- success
234
- end
235
- end
236
- protected :process_stream
237
- end
238
- end
239
- end
@@ -1,489 +0,0 @@
1
-
2
- require 'spec_helper'
3
-
4
- module CORL
5
-
6
- describe Util::Interface do
7
-
8
- #---------------------------------------------------------------------------
9
- # UI functionality
10
-
11
- describe "#say" do
12
-
13
- #-------------------------------------------------------------------------
14
- # Delegation
15
-
16
- it "can delegate to another class that contains this method" do
17
- output = double('output')
18
- output.should_receive(:puts).with('message')
19
-
20
- ui = Util::Interface.new({
21
- :output => output,
22
- :printer => :puts,
23
- })
24
- Util::Interface.new({ :ui_delegate => ui }).say(:info, 'message')
25
- end
26
-
27
- #-------------------------------------------------------------------------
28
- # Output formats
29
-
30
- it "prints a message with default options" do
31
- output1 = double('output1')
32
- output1.should_receive(:puts).with('message')
33
-
34
- Util::Interface.new({ :output => output1 }).say(:info, 'message')
35
-
36
- output2 = double('output2')
37
- output2.should_receive(:puts).with('[component] message')
38
-
39
- Util::Interface.new({
40
- :resource => 'component',
41
- :output => output2,
42
- }).say(:info, 'message')
43
- end
44
-
45
- #---
46
-
47
- it "prints a message with and without newlines included" do
48
- output1 = double('output1')
49
- output1.should_receive(:puts).with('message')
50
-
51
- test = Util::Interface.new({ :output => output1 })
52
- test.say(:info, 'message', { :new_line => true })
53
-
54
- output2 = double('output2')
55
- output2.should_receive(:print).with('message')
56
-
57
- test = Util::Interface.new({ :output => output2 })
58
- test.say(:info, 'message', { :new_line => false })
59
- end
60
-
61
- #---
62
-
63
- it "routes message to output and error channels based on type given" do
64
- [:info, :warn, :success].each do |type|
65
- output = double('output')
66
- output.should_receive(:puts).with('message')
67
-
68
- Util::Interface.new({
69
- :output => output,
70
- :printer => :puts,
71
- :color => false,
72
- }).say(type, 'message')
73
- end
74
-
75
- error = double('error')
76
- error.should_receive(:puts).with('message')
77
-
78
- Util::Interface.new({
79
- :error => error,
80
- :printer => :puts,
81
- :color => false,
82
- }).say(:error, 'message')
83
- end
84
-
85
- #---
86
-
87
- it "routes message to output and error channels based on channel given" do
88
- [:info, :warn, :success].each do |type|
89
- output = double('output')
90
- output.should_receive(:puts).with('message')
91
-
92
- Util::Interface.new({
93
- :output => output,
94
- :printer => :puts,
95
- }).say(:info, 'message', { :channel => type })
96
- end
97
-
98
- error = double('error')
99
- error.should_receive(:puts).with('message')
100
-
101
- Util::Interface.new({
102
- :error => error,
103
- :printer => :puts,
104
- :color => false,
105
- }).say(:info, 'message', { :channel => :error })
106
- end
107
- end
108
-
109
- #---
110
-
111
- describe "#ask" do
112
-
113
- #-------------------------------------------------------------------------
114
- # Delegation
115
-
116
- it "can delegate to another class that contains this method"
117
-
118
- #-------------------------------------------------------------------------
119
- # Input
120
-
121
- it "displays a prompt and returns user feedback"
122
- end
123
-
124
- #---
125
-
126
- describe "#info" do
127
-
128
- #-------------------------------------------------------------------------
129
- # Delegation
130
-
131
- it "can delegate to another class that contains this method" do
132
- output = double('output')
133
- output.should_receive(:puts).with('message')
134
-
135
- ui = Util::Interface.new({
136
- :output => output,
137
- :printer => :puts,
138
- })
139
- Util::Interface.new({ :ui_delegate => ui }).info('message')
140
- end
141
-
142
- #-------------------------------------------------------------------------
143
- # Printing
144
-
145
- it "prints an uncolored information message" do
146
- output = double('output')
147
- output.should_receive(:puts).with('message')
148
-
149
- Util::Interface.new({
150
- :output => output,
151
- :printer => :puts,
152
- }).info('message')
153
- end
154
- end
155
-
156
- #---
157
-
158
- describe "#warn" do
159
-
160
- #-------------------------------------------------------------------------
161
- # Delegation
162
-
163
- it "can delegate to another class that contains this method" do
164
- output = double('output')
165
- output.should_receive(:puts).with('message')
166
-
167
- ui = Util::Interface.new({
168
- :output => output,
169
- :printer => :puts,
170
- :color => false,
171
- })
172
- Util::Interface.new({ :ui_delegate => ui }).warn('message')
173
- end
174
-
175
- #-------------------------------------------------------------------------
176
- # Printing
177
-
178
- it "prints an uncolored warning message" do
179
- output = double('output')
180
- output.should_receive(:puts).with('message')
181
-
182
- Util::Interface.new({
183
- :output => output,
184
- :printer => :puts,
185
- :color => false,
186
- }).warn('message')
187
- end
188
-
189
- #---
190
-
191
- it "prints a colored warning message" do
192
- output = double('output')
193
- output.should_receive(:print).with(/^\e\[33mmessage\e\[0m$/)
194
-
195
- Util::Interface.new({
196
- :output => output,
197
- :color => true,
198
- }).warn('message', { :new_line => false })
199
- end
200
- end
201
-
202
- #---
203
-
204
- describe "#error" do
205
-
206
- #-------------------------------------------------------------------------
207
- # Delegation
208
-
209
- it "can delegate to another class that contains this method" do
210
- error = double('error')
211
- error.should_receive(:puts).with('message')
212
-
213
- ui = Util::Interface.new({
214
- :error => error,
215
- :printer => :puts,
216
- :color => false,
217
- })
218
- Util::Interface.new({ :ui_delegate => ui }).error('message')
219
- end
220
-
221
- #-------------------------------------------------------------------------
222
- # Printing
223
-
224
- it "prints an uncolored error message" do
225
- error = double('error')
226
- error.should_receive(:puts).with('message')
227
-
228
- Util::Interface.new({
229
- :error => error,
230
- :printer => :puts,
231
- :color => false,
232
- }).error('message')
233
- end
234
-
235
- #---
236
-
237
- it "prints a colored error message" do
238
- error = double('error')
239
- error.should_receive(:print).with(/^\e\[31mmessage\e\[0m$/)
240
-
241
- Util::Interface.new({
242
- :error => error,
243
- :color => true,
244
- }).error('message', { :new_line => false })
245
- end
246
- end
247
-
248
- #---
249
-
250
- describe "#success" do
251
-
252
- #-------------------------------------------------------------------------
253
- # Delegation
254
-
255
- it "can delegate to another class that contains this method" do
256
- output = double('output')
257
- output.should_receive(:puts).with('message')
258
-
259
- ui = Util::Interface.new({
260
- :output => output,
261
- :printer => :puts,
262
- :color => false,
263
- })
264
- Util::Interface.new({ :ui_delegate => ui }).success('message')
265
- end
266
-
267
- #-------------------------------------------------------------------------
268
- # Printing
269
-
270
- it "prints an uncolored success message" do
271
- output = double('output')
272
- output.should_receive(:puts).with('message')
273
-
274
- Util::Interface.new({
275
- :output => output,
276
- :printer => :puts,
277
- :color => false,
278
- }).success('message')
279
- end
280
-
281
- #---
282
-
283
- it "prints a colored success message" do
284
- output = double('output')
285
- output.should_receive(:print).with(/^\e\[32mmessage\e\[0m$/)
286
-
287
- Util::Interface.new({
288
- :output => output,
289
- :color => true,
290
- }).success('message', { :new_line => false })
291
- end
292
- end
293
-
294
- #---------------------------------------------------------------------------
295
- # Utilities
296
-
297
- describe "#format_message" do
298
-
299
- #-------------------------------------------------------------------------
300
- # Delegation
301
-
302
- it "can delegate to another class that contains this method" do
303
- message = Util::Interface.new({
304
- :ui_delegate => Util::Interface.new('delegate')
305
- }).format_message(:info, 'message', { :prefix => true })
306
-
307
- message.should == '[delegate] message'
308
- end
309
-
310
- #-------------------------------------------------------------------------
311
- # Prefix specifications
312
-
313
- it "returns without a prefix because no resource" do
314
- message = Util::Interface.new.format_message(:info, 'message', { :prefix => true })
315
- message.should == 'message'
316
- end
317
-
318
- #---
319
-
320
- it "returns without a prefix because prefix is false" do
321
- message = Util::Interface.new('component').format_message(:info, 'message', { :prefix => false })
322
- message.should == 'message'
323
- end
324
-
325
- #---
326
-
327
- it "returns without a prefix because no prefix option given" do
328
- message = Util::Interface.new('component').format_message(:info, 'message')
329
- message.should == 'message'
330
- end
331
-
332
- #---
333
-
334
- it "returns with a prefix if resource and prefix option given" do
335
- message = Util::Interface.new('component').format_message(:info, 'message', { :prefix => true })
336
- message.should == '[component] message'
337
- end
338
-
339
- #-------------------------------------------------------------------------
340
- # Color specifications
341
-
342
- it "formats a error message in red if color enabled" do
343
- message = Util::Interface.new({
344
- :resource => 'component',
345
- :color => true,
346
- }).format_message(:error, 'message')
347
- message.should match(/^\e\[31mmessage\e\[0m$/)
348
- end
349
-
350
- #---
351
-
352
- it "formats a warning message in yellow if color enabled" do
353
- message = Util::Interface.new({
354
- :resource => 'component',
355
- :color => true,
356
- }).format_message(:warn, 'message')
357
- message.should match(/^\e\[33mmessage\e\[0m$/)
358
- end
359
-
360
- #---
361
-
362
- it "formats a success message in green if color enabled" do
363
- message = Util::Interface.new({
364
- :resource => 'component',
365
- :color => true,
366
- }).format_message(:success, 'message')
367
- message.should match(/^\e\[32mmessage\e\[0m$/)
368
- end
369
- end
370
-
371
- #---------------------------------------------------------------------------
372
-
373
- describe "#safe_puts" do
374
-
375
- #-------------------------------------------------------------------------
376
- # Delegation
377
-
378
- it "can delegate to another class that contains this method" do
379
- output = double('output')
380
- output.should_receive(:puts).with('message')
381
-
382
- ui = Util::Interface.new({
383
- :output => output,
384
- :printer => :puts,
385
- })
386
- Util::Interface.new({ :ui_delegate => ui }).safe_puts('message')
387
- end
388
-
389
- #-------------------------------------------------------------------------
390
- # Instance configuration
391
-
392
- it "prints an empty string unless message given" do
393
- output = double('output')
394
- output.should_receive(:puts).with('')
395
-
396
- Util::Interface.new({
397
- :output => output,
398
- :printer => :puts,
399
- }).safe_puts()
400
- end
401
-
402
- #---
403
-
404
- it "prints to different output channels if they are given" do
405
- output1 = double('output1')
406
- output1.should_receive(:puts).with('message')
407
-
408
- test = Util::Interface.new({
409
- :output => output1,
410
- :printer => :puts,
411
- })
412
- test.safe_puts('message')
413
-
414
- output2 = double('output2')
415
- output2.should_receive(:puts).with('message')
416
-
417
- test.output = output2
418
- test.safe_puts('message')
419
- end
420
-
421
- #---
422
-
423
- it "prints with puts if puts printer option given" do
424
- output = double('output')
425
- output.should_receive(:puts).with('message')
426
-
427
- Util::Interface.new({
428
- :output => output,
429
- :printer => :puts,
430
- }).safe_puts('message')
431
- end
432
-
433
- #---
434
-
435
- it "prints with print if print printer option given" do
436
- output = double('output')
437
- output.should_receive(:print).with('message')
438
-
439
- Util::Interface.new({
440
- :output => output,
441
- :printer => :print,
442
- }).safe_puts('message')
443
- end
444
-
445
- #-------------------------------------------------------------------------
446
- # Method configuration
447
-
448
- it "can override the instance output channel" do
449
- output1 = double('output1')
450
- output1.should_not_receive(:puts).with('message')
451
-
452
- output2 = double('output2')
453
- output2.should_receive(:puts).with('message')
454
-
455
- Util::Interface.new({
456
- :output => output1,
457
- :printer => :puts,
458
- }).safe_puts('message', { :channel => output2 })
459
- end
460
-
461
- #---
462
-
463
- it "can override the instance printer handler" do
464
- output = double('output')
465
- output.should_not_receive(:puts).with('message')
466
- output.should_receive(:print).with('message')
467
-
468
- Util::Interface.new({
469
- :output => output,
470
- :printer => :puts,
471
- }).safe_puts('message', { :printer => :print })
472
- end
473
- end
474
-
475
- #---------------------------------------------------------------------------
476
-
477
- describe "#check_delegate" do
478
-
479
- it "returns false if no delegate exists" do
480
- Util::Interface.new.check_delegate('safe_puts').should be_false
481
- end
482
- it "returns true if a delegate exists and it implements given method" do
483
- test = Util::Interface.new({ :ui_delegate => Util::Interface.new })
484
- test.check_delegate('safe_puts').should be_true
485
- test.check_delegate('nonexistent').should be_false
486
- end
487
- end
488
- end
489
- end