capistrano-soa 0.0.6 → 0.0.8

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/Guardfile ADDED
@@ -0,0 +1,9 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard :rspec, :cli => "--color --format nested" do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
7
+ watch('spec/spec_helper.rb') { "spec" }
8
+ end
9
+
@@ -5,11 +5,11 @@ require "capistrano/version"
5
5
  Gem::Specification.new do |s|
6
6
 
7
7
  s.name = "capistrano-soa"
8
- s.version = "0.0.6"
8
+ s.version = "0.0.8"
9
9
  s.platform = Gem::Platform::RUBY
10
10
  s.authors = ["Ben Wu"]
11
11
  s.email = ["wucheokman@gmail.com"]
12
- s.homepage = "http://github.com/capistrano/capistrano-soa"
12
+ s.homepage = "http://github.com/cheokman/capistrano-soa"
13
13
  s.summary = %q{An extension for Capistrano supporting SOA Services Deployment}
14
14
  s.description = %q{Capistrano SOA let you management services group in SOA architecuture with multi-stage support.}
15
15
  s.files = `git ls-files`.split("\n")
@@ -2,6 +2,19 @@ require 'capistrano'
2
2
  require 'fileutils'
3
3
  require 'colored'
4
4
 
5
+ module Capistrano
6
+ class Configuration
7
+ module Namespaces
8
+ def rename_task(new_name, old_name)
9
+ metaclass = class << self; self; end
10
+ metaclass.send(:alias_method, new_name.to_s, old_name.to_s)
11
+ metaclass.send(:remove_method, old_name.to_s)
12
+ tasks[new_name.to_sym] = tasks.delete(old_name.to_sym)
13
+ end
14
+ end
15
+ end
16
+ end
17
+
5
18
  module Capistrano::Ext
6
19
  module SOA
7
20
  def get_config_files(config_root)
@@ -61,22 +74,22 @@ module Capistrano::Ext
61
74
  stages.include?(possible_stage_name) ? possible_stage_name : nil
62
75
  end
63
76
 
64
- #
77
+ #
65
78
  # One Environment with different applications deployment
66
79
  # cap integration prj0:subprj0:app0 prj1:subprj0:app1 deploy
67
- # cap prj0:subprj0:app0:integration prj0:subprj0:app0:integration deploy
80
+ # cap prj0:subprj0:app0:integration prj0:subprj0:app0:integration deploy
68
81
  #
69
82
  # One environment with one application
70
- # cap prj0:subprj0:app0:integration deploy
71
- #
72
- # Different Environments with different applications deployment
83
+ # cap prj0:subprj0:app0:integration deploy
84
+ #
85
+ # Different Environments with different applications deployment
73
86
  # cap prj0:subprj0:app0:integration prj0:subprj0:app0:staging deploy
74
87
  #
75
88
 
76
89
  def parse_args(args, stages, services)
77
90
  args = args.dup
78
91
  selected_services = []
79
- task = nil
92
+ tasks = nil
80
93
  selected_stage = nil
81
94
 
82
95
  selected_stage = if stages.include?(args.first)
@@ -88,7 +101,8 @@ module Capistrano::Ext
88
101
  else
89
102
  nil
90
103
  end
91
- args.each do |a|
104
+
105
+ args.each_with_index do |a, i|
92
106
  if selected_stage.nil? && !get_stage_name(a, stages).nil?
93
107
  selected_stage = get_stage_name(a, stages)
94
108
  _service = get_service_name(a, services)
@@ -97,41 +111,51 @@ module Capistrano::Ext
97
111
  _service = get_service_name(a, services)
98
112
  selected_services << _service unless selected_services.include?(_service)
99
113
  else
100
- task = a
114
+ tasks = args[i..args.length].join(" ")
101
115
  break
102
116
  end
103
117
  end
104
- [selected_stage, selected_services.flatten.uniq, task]
118
+ [selected_stage, selected_services.flatten.uniq, tasks]
105
119
  end
106
120
 
107
121
  def build_task(stage, services, this_task)
108
-
109
122
  if services.size > 1
110
- segments = this_task.split(':')
111
- if segments.size > 1
112
- namespace_names = segments[0, segments.size-1]
113
- task_name = segments.last
114
- else
115
- namespace_names = [segments[0]]
116
- task_name = "default"
117
- end
118
-
119
- block = lambda do |parent|
120
- alias_task "_#{task_name}".to_sym, task_name.to_sym
123
+ these_tasks = this_task.split(" ")
124
+ these_tasks.each do |current_task|
125
+ next if find_task(current_task).nil?
126
+
127
+ segments = current_task.split(':')
128
+ if segments.size > 1
129
+ namespace_names = segments[0, segments.size-1]
130
+ task_name = segments.last
131
+ else
132
+ namespace_names = [segments[0]]
133
+ task_name = "default"
134
+ end
135
+ original_task = "original_#{task_name}"
121
136
 
122
- task(task_name) do
123
- services.each do |service|
124
- system("cap #{stage} #{service} #{this_task}")
125
- end
126
- end
127
- end
137
+ block = lambda do |parent|
138
+ before current_task do
139
+ logger.debug "find_task:#{task_name}: #{find_task task_name}"
140
+ rename_task "original_#{task_name}", task_name
141
+ logger.debug "find_task:#{task_name}: #{find_task task_name}"
142
+ task(task_name.to_sym) do
143
+ logger.debug "call..."
144
+ services.each do |service|
145
+ system("cap #{stage} #{service} #{namespace_names.join(":")}:#{task_name}")
146
+ end
147
+ end
148
+ logger.debug "find_task:#{task_name}: #{find_task task_name}"
149
+ end
150
+ end
128
151
 
129
- block = namespace_names.reverse.inject(block) do |child, name|
130
- lambda do |parent|
131
- parent.namespace(name, &child)
152
+ block = namespace_names.reverse.inject(block) do |child, name|
153
+ lambda do |parent|
154
+ parent.namespace(name, &child)
155
+ end
132
156
  end
157
+ block.call(top)
133
158
  end
134
- block.call(top)
135
159
  end
136
160
  end
137
161
 
@@ -145,7 +169,7 @@ module Capistrano::Ext
145
169
  config_files = get_config_files(config_root)
146
170
 
147
171
  set :stages, collect_stages(config_files) unless exists?(:stages)
148
-
172
+
149
173
  # build configuration names list
150
174
  config_names = get_config_names(config_files,config_root)
151
175
 
@@ -160,7 +184,7 @@ module Capistrano::Ext
160
184
  stages.each do |s|
161
185
  desc "Set the target stage to `#{s}'."
162
186
 
163
- task(s.to_sym) do
187
+ task(s.to_sym) do
164
188
  top.set :stage, s.to_sym
165
189
  end
166
190
  end
@@ -234,70 +258,15 @@ module Capistrano::Ext
234
258
  block.call(top)
235
259
  end
236
260
 
237
- STDOUT.sync
238
- before "deploy:update_code" do
239
- print "Updating Code........ "
240
- start_spinner()
241
- end
242
-
243
- after "deploy:update_code" do
244
- stop_spinner()
245
- puts "Done.".green
246
- end
247
-
248
- before "deploy:cleanup" do
249
- print "Cleaning Up.......... "
250
- start_spinner()
251
- end
252
-
253
- after "deploy:restart" do
254
- stop_spinner()
255
- puts "Done.".green
256
- end
257
-
258
- before "deploy:restart" do
259
- print "Restarting .......... "
260
- start_spinner()
261
- end
262
-
263
- after "deploy:cleanup" do
264
- stop_spinner()
265
- puts "Done.".green
266
- end
267
- # spinner stuff
268
- @spinner_running = false
269
- @chars = ['|', '/', '-', '\\']
270
- @spinner = Thread.new do
271
- loop do
272
- unless @spinner_running
273
- Thread.stop
274
- end
275
- print @chars[0]
276
- sleep(0.1)
277
- print "\b"
278
- @chars.push @chars.shift
279
- end
280
- end
281
-
282
- def start_spinner
283
- @spinner_running = true
284
- @spinner.wakeup
285
- end
286
-
287
- # stops the spinner and backspaces over last displayed character
288
- def stop_spinner
289
- @spinner_running = false
290
- print "\b"
291
- end
292
-
261
+
293
262
  on :load do
294
263
  services_name = get_services_name(config_names)
295
264
 
296
- selected_stage, selected_services, selected_task = parse_args(ARGV, stages, services_name)
265
+ selected_stage, selected_services, selected_tasks = parse_args(ARGV, stages, services_name)
297
266
 
298
267
  set :stage, selected_stage
299
268
  set :services, selected_services
300
- build_task(selected_stage, selected_services, selected_task)
269
+ build_task(selected_stage, selected_services, selected_tasks)
301
270
 
302
271
  if stages.include?(stage)
303
272
  # Execute the specified stage so that recipes required in stage can contribute to task list
@@ -356,8 +325,63 @@ module Capistrano::Ext
356
325
  # end
357
326
  # end
358
327
  # end
359
- end
360
328
 
329
+ STDOUT.sync
330
+ before "deploy:update_code" do
331
+ print "Updating Code........ "
332
+ start_spinner()
333
+ end
334
+
335
+ after "deploy:update_code" do
336
+ stop_spinner()
337
+ puts "Done.".green
338
+ end
339
+
340
+ before "deploy:cleanup" do
341
+ print "Cleaning Up.......... "
342
+ start_spinner()
343
+ end
344
+
345
+ after "deploy:restart" do
346
+ stop_spinner()
347
+ puts "Done.".green
348
+ end
349
+
350
+ before "deploy:restart" do
351
+ print "Restarting .......... "
352
+ start_spinner()
353
+ end
354
+
355
+ after "deploy:cleanup" do
356
+ stop_spinner()
357
+ puts "Done.".green
358
+ end
359
+ # spinner stuff
360
+ @spinner_running = false
361
+ @chars = ['|', '/', '-', '\\']
362
+ @spinner = Thread.new do
363
+ loop do
364
+ unless @spinner_running
365
+ Thread.stop
366
+ end
367
+ print @chars[0]
368
+ sleep(0.1)
369
+ print "\b"
370
+ @chars.push @chars.shift
371
+ end
372
+ end
373
+
374
+ def start_spinner
375
+ @spinner_running = true
376
+ @spinner.wakeup
377
+ end
378
+
379
+ # stops the spinner and backspaces over last displayed character
380
+ def stop_spinner
381
+ @spinner_running = false
382
+ print "\b"
383
+ end
384
+ end
361
385
  end
362
386
 
363
387
  end
@@ -13,6 +13,10 @@ require 'capistrano'
13
13
  run ('do inner some stuff')
14
14
  end
15
15
  end
16
+ desc "foo and run foo"
17
+ task :foo do
18
+ set :cool, "cool"
19
+ end
16
20
  desc "thing and run fake manifests"
17
21
  task :thing do
18
22
  set :bar, "baz"
data/spec/soa_spec.rb CHANGED
@@ -7,10 +7,10 @@ describe Capistrano::Ext::SOA, "loaded into a configuration" do
7
7
  @configuration.extend(Capistrano::Spec::ConfigurationExtension)
8
8
  config_root = "/opt/deploy"
9
9
 
10
- File.stub!(:expand_path) {config_root}
10
+ File.stub(:expand_path) {config_root}
11
11
  @project_dir = ["a/b/production.rb", "a/b/staging.rb", "a/b.rb", "a/c/staging.rb"]
12
12
 
13
- Dir.stub!(:[]) {@project_dir.map {|dir| "#{config_root}/#{dir}"}}
13
+ Dir.stub(:[]) {@project_dir.map {|dir| "#{config_root}/#{dir}"}}
14
14
  @configuration.extend(Capistrano::Fakerecipe)
15
15
  Capistrano::Fakerecipe.load_into(@configuration)
16
16
  Capistrano::Ext::SOA.load_into(@configuration)
@@ -40,7 +40,7 @@ describe Capistrano::Ext::SOA, "loaded into a configuration" do
40
40
  task.should == nil
41
41
  end
42
42
 
43
- it "should parse single stage with one or more services" do
43
+ it "should parse single stage with one service and different environment" do
44
44
  args = ["staging", "a:b", "a:b:production"]
45
45
  selected_stage, selected_services, task = @configuration.parse_args(args, @stages, @services)
46
46
  selected_services.should == ["a:b"]
@@ -48,7 +48,7 @@ describe Capistrano::Ext::SOA, "loaded into a configuration" do
48
48
  task.should == nil
49
49
  end
50
50
 
51
- it "should parse single stage with one or more services" do
51
+ it "should parse default stage with two services" do
52
52
  args = ["a:b", "a:c"]
53
53
  selected_stage, selected_services, task = @configuration.parse_args(args, @stages, @services)
54
54
  selected_services.should == ["a:b", "a:c"]
@@ -56,7 +56,7 @@ describe Capistrano::Ext::SOA, "loaded into a configuration" do
56
56
  task.should == nil
57
57
  end
58
58
 
59
- it "should parse single stage with one or more services" do
59
+ it "should one or more services with undefined environment" do
60
60
  args = ["a:b:integration", "a:c"]
61
61
  selected_stage, selected_services, task = @configuration.parse_args(args, @stages, @services)
62
62
  selected_services.should == ["a:b", "a:c"]
@@ -64,7 +64,15 @@ describe Capistrano::Ext::SOA, "loaded into a configuration" do
64
64
  task.should == nil
65
65
  end
66
66
 
67
- it "should parse single stage with one or more services" do
67
+ it "should one or more services with differnt environment" do
68
+ args = ["a:b:staging", "a:c"]
69
+ selected_stage, selected_services, task = @configuration.parse_args(args, @stages, @services)
70
+ selected_services.should == ["a:b", "a:c"]
71
+ selected_stage.should == "staging"
72
+ task.should == nil
73
+ end
74
+
75
+ it "should parse multiple service and different default and specific environment" do
68
76
  args = ["staging", "a:b", "a:c:production"]
69
77
  selected_stage, selected_services, task = @configuration.parse_args(args, @stages, @services)
70
78
  selected_services.should == ["a:b", "a:c"]
@@ -72,7 +80,7 @@ describe Capistrano::Ext::SOA, "loaded into a configuration" do
72
80
  task.should == nil
73
81
  end
74
82
 
75
- it "should parse single stage with one or more services" do
83
+ it "should parse multiple services with different specific environments" do
76
84
  args = ["a:b:staging", "a:c:production"]
77
85
  selected_stage, selected_services, task = @configuration.parse_args(args, @stages, @services)
78
86
  selected_services.should == ["a:b", "a:c"]
@@ -80,7 +88,7 @@ describe Capistrano::Ext::SOA, "loaded into a configuration" do
80
88
  task.should == nil
81
89
  end
82
90
 
83
- it "should parse single stage with one or more services" do
91
+ it "should parse multiple services with one specific environment" do
84
92
  args = ["a:b", "a:c:production"]
85
93
  selected_stage, selected_services, task = @configuration.parse_args(args, @stages, @services)
86
94
  selected_services.should == ["a:b", "a:c"]
@@ -88,7 +96,7 @@ describe Capistrano::Ext::SOA, "loaded into a configuration" do
88
96
  task.should == nil
89
97
  end
90
98
 
91
- it "should parse single stage with one or more services" do
99
+ it "should parse default environment, service and task" do
92
100
  args = ["staging","a:b", "deploy:start"]
93
101
  selected_stage, selected_services, task = @configuration.parse_args(args, @stages, @services)
94
102
  selected_services.should == ["a:b"]
@@ -96,20 +104,28 @@ describe Capistrano::Ext::SOA, "loaded into a configuration" do
96
104
  task.should == "deploy:start"
97
105
  end
98
106
 
99
- it "should parse single stage with one or more services" do
107
+ it "should parse default stage and one service" do
100
108
  args = ["staging","a:b", "deploy:start", "a:d"]
101
109
  selected_stage, selected_services, task = @configuration.parse_args(args, @stages, @services)
102
110
  selected_services.should == ["a:b"]
103
111
  selected_stage.should == "staging"
104
- task.should == "deploy:start"
112
+ task.should == "deploy:start a:d"
105
113
  end
106
114
 
107
- it "should parse single stage with one or more services" do
115
+ it "should parse one stage, multiple services and task" do
108
116
  args = ["staging","a:b", "a:d", "deploy:start"]
109
117
  selected_stage, selected_services, task = @configuration.parse_args(args, @stages, @services)
110
118
  selected_services.should == ["a:b"]
111
119
  selected_stage.should == "staging"
112
- task.should == "a:d"
120
+ task.should == "a:d deploy:start"
121
+ end
122
+
123
+ it "should parse one stage, multiple services and task" do
124
+ args = ["staging","a:b", "a:c", "deploy:start"]
125
+ selected_stage, selected_services, task = @configuration.parse_args(args, @stages, @services)
126
+ selected_services.should == ["a:b", "a:c"]
127
+ selected_stage.should == "staging"
128
+ task.should == "deploy:start"
113
129
  end
114
130
 
115
131
  it "should parse single stage with one or more services" do
@@ -128,23 +144,48 @@ describe Capistrano::Ext::SOA, "loaded into a configuration" do
128
144
  task.should == "deploy:start"
129
145
  end
130
146
 
131
- it "should run one stage and service on load" do
132
- args = ["staging"]
133
- ARGV = args
134
- @configuration.trigger(:load)
135
- @configuration.fetch(:stage).should == "staging"
136
- @configuration.fetch(:services).should == []
147
+ it "should build task with multiple services" do
148
+ stage = "staging"
149
+ services = ["a:b", "a:c"]
150
+ task = "fake:thing"
151
+
152
+ @configuration.build_task(stage, services, task)
153
+ @configuration.find_task("fake:al_thing").should_not be_nil
154
+ @configuration.find_task("fake:thing").should_not be_nil
137
155
  end
138
156
 
139
- it "should build a task for services" do
140
- @configuration.stub!(:services).and_return(["a:b", "a:c"])
157
+ it "should build multiple task with multiple services" do
158
+ stage = "staging"
159
+ services = ["a:b", "a:c"]
160
+ task = "fake:thing fake:foo"
141
161
 
142
- @configuration.build_task("staging", ["a:b", "a:c"],"fake:thing")
143
-
144
- @configuration.find_task("fake:_thing").should_not == nil
145
- @configuration.find_task("fake:thing").should_not == nil
162
+ @configuration.build_task(stage, services, task)
163
+ @configuration.find_task("fake:al_thing").should_not be_nil
164
+ @configuration.find_task("fake:thing").should_not be_nil
146
165
 
147
- @configuration.find_and_execute_task("fake:thing")
148
- @configuration.fetch(:bar).should == "baz"
166
+ @configuration.find_task("fake:al_foo").should_not be_nil
167
+ @configuration.find_task("fake:foo").should_not be_nil
149
168
  end
169
+
170
+
171
+
172
+ # it "should run one stage and service on load" do
173
+ # args = ["staging"]
174
+ # ARGV = args
175
+ # @configuration.trigger(:load)
176
+ # @configuration.fetch(:stage).should == "staging"
177
+ # @configuration.fetch(:services).should == []
178
+ # end
179
+
180
+ # it "should build a task for services" do
181
+ # @configuration.stub(:services).and_return(["a:b", "a:c"])
182
+
183
+ # @configuration.build_task("staging", ["a:b", "a:c"],"fake:thing")
184
+
185
+ # @configuration.find_task("fake:_thing").should_not == nil
186
+ # @configuration.find_task("fake:thing").should_not == nil
187
+
188
+ # @configuration.find_and_execute_task("fake:thing")
189
+ # @configuration.fetch(:bar).should == "baz"
190
+ # end
150
191
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capistrano-soa
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-09-06 00:00:00.000000000 Z
12
+ date: 2013-09-30 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Capistrano SOA let you management services group in SOA architecuture
15
15
  with multi-stage support.
@@ -20,6 +20,7 @@ extensions: []
20
20
  extra_rdoc_files:
21
21
  - README.md
22
22
  files:
23
+ - Guardfile
23
24
  - README.md
24
25
  - capistrano-soa.gemspec
25
26
  - lib/capistrano/ext/soa.rb
@@ -27,7 +28,7 @@ files:
27
28
  - spec/recipes/fake_recipe.rb
28
29
  - spec/soa_spec.rb
29
30
  - spec/spec_helper.rb
30
- homepage: http://github.com/capistrano/capistrano-soa
31
+ homepage: http://github.com/cheokman/capistrano-soa
31
32
  licenses: []
32
33
  post_install_message:
33
34
  rdoc_options: []