blazing 0.0.14 → 0.0.15

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.
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- blazing (0.0.14)
4
+ blazing (0.0.15)
5
5
  activesupport (>= 3.0.5)
6
6
  grit
7
7
  i18n
@@ -19,9 +19,10 @@ Gem::Specification.new do |s|
19
19
 
20
20
  # TODO: better to use ~ ?
21
21
  s.add_dependency "thor", ">= 0.14.6"
22
+ s.add_dependency "grit"
22
23
 
23
24
  # TODO: Get rid of those, just used for guessing recipe names etc in lib/recipes.rb
24
25
  s.add_dependency "activesupport", ">= 3.0.5"
25
26
  s.add_dependency "i18n"
26
- s.add_dependency "grit"
27
+
27
28
  end
@@ -5,9 +5,7 @@ require 'blazing/config'
5
5
  require 'blazing/runner'
6
6
  require 'blazing/logger'
7
7
  require 'blazing/target'
8
- require 'blazing/remote'
9
8
  require 'blazing/recipe'
10
- require 'blazing/object'
11
9
  require 'blazing/cli/base'
12
10
  require 'blazing/cli/create'
13
11
  require 'blazing/cli/hook'
@@ -4,7 +4,7 @@ module Blazing
4
4
  module Base
5
5
 
6
6
  def config
7
- @config ||= Blazing::Config.load
7
+ @config ||= Blazing::Config.parse
8
8
  end
9
9
 
10
10
  def log(type, message)
@@ -30,5 +30,12 @@ module Blazing
30
30
  Grit::Repo.new(Dir.pwd).config['remote.origin.url'] || 'user@host:/some/path'
31
31
  end
32
32
 
33
+ #
34
+ # Return true if a Gemfile exists in pwd
35
+ #
36
+ def gemfile_present?
37
+ File.exists? 'Gemfile'
38
+ end
39
+
33
40
  end
34
41
  end
@@ -0,0 +1,27 @@
1
+ module Blazing
2
+ class Target
3
+ module Bootstrap
4
+
5
+ def clone_command
6
+ "if [ -e #{@path} ]; then \
7
+ echo 'directory exists already'; else \
8
+ git clone #{@repository} #{"--branch #{@branch}" if @branch} #{@path} && cd #{@path} && git config receive.denyCurrentBranch ignore; fi"
9
+ end
10
+
11
+ def clone_repository
12
+ @runner.run "ssh #{@user}@#{@host} '#{clone_command}'"
13
+ end
14
+
15
+ def add_target_as_remote
16
+ @runner.run "git remote add #{@name} #{@user}@#{@host}:#{@path}"
17
+ end
18
+
19
+ def setup_post_receive_hook
20
+ @hook.new([use_rvm?]).generate
21
+ @runner.run "scp /tmp/post-receive #{@user}@#{@host}:#{@path}/.git/hooks/post-receive"
22
+ @runner.run "ssh #{@user}@#{@host} 'chmod +x #{@path}/.git/hooks/post-receive'"
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -18,31 +18,32 @@ module Blazing
18
18
  @task.invoke_all
19
19
  end
20
20
 
21
- desc 'setup TARGET_NAME', 'setup or update blazing on specified target and deploy'
22
- def setup(target_name = nil)
23
- target = config.find_target(target_name)
24
- log :info, "setting up target #{target.name}"
25
- target.setup
21
+ desc 'bootstrap TARGET_NAME', 'setup or update blazing on specified target and deploy'
22
+ def bootstrap(target_name = nil)
23
+ Blazing::Target.bootstrap(target_name)
26
24
 
27
25
  # TODO: Abstract this into module and load it where we need it. Methods / actions should have
28
26
  # a success and failure message
29
27
  if exit_status == 0
30
- log :success, "successfully set up target #{target.name}"
28
+ log :success, "successfully bootstrapped target #{target_name}"
31
29
  else
32
- log :error, "failed setting up target #{target.name}"
30
+ log :error, "failed bootstrapping target #{target_name}"
33
31
  end
34
32
  end
35
33
 
34
+ desc 'setup TARGET_NAME', 'setup git remote for one or all targets'
35
+ def setup(target_name = nil)
36
+ Blazing::Target.setup(target_name)
37
+ end
38
+
36
39
  desc 'deploy TARGET', 'deploy to TARGET'
37
40
  def deploy(target_name = nil)
38
- target = config.find_target(target_name)
39
- log :info, "deploying target #{target.name}"
40
- target.deploy
41
+ Blazing::Target.deploy(target_name)
41
42
 
42
43
  if exit_status == 0
43
- log :success, "successfully deployed target #{target.name}"
44
+ log :success, "successfully deployed target #{target_name}"
44
45
  else
45
- log :error, "failed deploying on target #{target.name}"
46
+ log :error, "failed deploying on target #{target_name}"
46
47
  end
47
48
  end
48
49
 
@@ -54,12 +55,9 @@ module Blazing
54
55
  report
55
56
  end
56
57
 
57
- #TODO: move post_recevie and rvm somewhere else, they must only be called by the post-receive hook and not visible to user
58
-
59
58
  desc 'post_receive', 'trigger the post-receive actions'
60
59
  def post_receive(target_name = nil)
61
- target = config.find_target(target_name)
62
- Blazing::Remote.new(target.name).post_receive
60
+ Blazing::Target.post_receive(target_name)
63
61
  end
64
62
  end
65
63
  end
@@ -19,7 +19,7 @@ module Blazing
19
19
  #
20
20
  # Load configuration file and parse it
21
21
  #
22
- def load
22
+ def parse
23
23
  read do
24
24
  instance_eval(File.read(Blazing::CONFIGURATION_FILE))
25
25
  end
@@ -53,7 +53,7 @@ module Blazing
53
53
  end
54
54
 
55
55
  def target(name, options = {})
56
- @targets << Blazing::Target.new(name, options)
56
+ @targets << Blazing::Target.new(name, options.merge(:config => self))
57
57
  end
58
58
 
59
59
  def use(name, options = {})
@@ -65,23 +65,25 @@ module Blazing
65
65
  # If only one target is defined, it is the default one
66
66
  #
67
67
  def find_target(target_name = nil)
68
+ active_target = nil
69
+
68
70
  if target_name
69
- target = targets.find {|target| target.name == target_name }
71
+ active_target = targets.find {|target| target.name == target_name }
70
72
  end
71
73
 
72
- if target.nil? && targets.size == 1
73
- target = targets.first
74
+ if active_target.nil? && targets.size == 1
75
+ active_target = targets.first
74
76
  end
75
77
 
76
- if target.nil?
77
- target = targets.find {|target| target.default }
78
+ if active_target.nil?
79
+ active_target = targets.find {|target| target.default }
78
80
  end
79
81
 
80
- if target.nil?
82
+ if active_target.nil?
81
83
  raise 'no target specified and no default targets found'
82
84
  end
83
85
 
84
- target
86
+ active_target
85
87
  end
86
88
 
87
89
  end
@@ -18,10 +18,17 @@ module Blazing
18
18
  end
19
19
 
20
20
  def recipe_class
21
- ('Blazing::' + (@name.to_s + '_recipe').camelize).constantize
21
+ # TODO: Unify naming conventions
22
+ # Gem Recipe Naming Convention
23
+ ('Blazing::' + @name.to_s.gsub('_','/').camelize).constantize
22
24
  rescue NameError
23
- @logger.log :error, "unable to load #{@name} recipe"
24
- return nil
25
+ begin
26
+ # Builtin Recipe Naming Convention
27
+ ('Blazing::' + (@name.to_s + '_recipe').camelize).constantize
28
+ rescue NameError
29
+ @logger.log :error, "unable to load #{@name} recipe"
30
+ return nil
31
+ end
25
32
  end
26
33
 
27
34
  def run
@@ -42,7 +49,15 @@ module Blazing
42
49
  end
43
50
 
44
51
  def load_gem_recipes
45
- #TODO: Implement
52
+ # TODO: I'm sure there is a better way to do this...
53
+ gems = open('Gemfile').grep(/blazing-/).map { |l| l.match(/(blazing-.*)\'\,/)[1] }
54
+ gems.each do |gem|
55
+ gem_lib_path = $:.find { |p| p.include? gem }
56
+ recipes_path = File.join(gem_lib_path, gem, 'recipes')
57
+ recipes = Dir.entries(recipes_path).delete_if { |r| r == '.' || r == '..' }
58
+ debugger
59
+ recipes.each { |recipe| require File.join(gem, 'recipes', recipe) }
60
+ end
46
61
  end
47
62
 
48
63
  def load_local_recipes
@@ -57,6 +72,7 @@ module Blazing
57
72
  descendants = []
58
73
 
59
74
  load_builtin_recipes
75
+ load_gem_recipes
60
76
 
61
77
  ObjectSpace.each_object(Class) do |k|
62
78
  descendants.unshift k if k < self
@@ -1,40 +1,80 @@
1
1
  require 'blazing'
2
- require 'blazing/object'
2
+ require 'blazing/core_ext/object'
3
+ require 'blazing/config'
4
+ require 'blazing/bootstrap'
3
5
 
4
6
  module Blazing
5
7
  class Target
6
8
 
9
+ include Blazing::Target::Bootstrap
10
+
7
11
  attr_accessor :name, :recipes
8
12
 
9
13
  AVAILABLE_SETTINGS = [:deploy_to, :host, :user, :path, :default, :branch]
10
14
 
15
+ class << self
16
+
17
+ def bootstrap(name)
18
+ target = config.find_target(name)
19
+ runner = Blazing::Runner.new
20
+ # TODO: Use a Wrapper to Net::SSH
21
+ target.clone_repository
22
+ target.setup_post_receive_hook
23
+ setup target.name
24
+ end
25
+
26
+ def deploy(name)
27
+ target = config.find_target(name)
28
+ runner = Blazing::Runner.new
29
+ deploy_command = "git push #{name}"
30
+ deploy_command += " #{target.branch}:#{target.branch}" if target.branch
31
+
32
+ # TODO: checkout branch if we pushed to a branch which is not checked out
33
+ runner.run deploy_command
34
+ end
35
+
36
+ def setup(name)
37
+ if name
38
+ config.find_target(name).add_target_as_remote
39
+ else
40
+ config.targets.each do |target|
41
+ target.add_target_as_remote
42
+ end
43
+ end
44
+ end
45
+
46
+ def post_receive(name)
47
+ target = config.find_target(name)
48
+ target.set_git_dir
49
+ target.reset_head!
50
+ @recipes.delete_if { |recipe| recipe.name == 'rvm' }
51
+ target.run_recipes
52
+ end
53
+
54
+ def config
55
+ Blazing::Config.parse
56
+ end
57
+
58
+ def runner
59
+ Blazing::Runner.new
60
+ end
61
+
62
+ end
63
+
11
64
  def initialize(name, options = {})
12
65
  @name = name.to_s
13
66
  @logger = options[:_logger] ||= Blazing::Logger.new
14
67
  @runner = options[:_runner] ||= Blazing::Runner.new
15
68
  @hook = options[:_hook] ||= Blazing::CLI::Hook
16
- create_accessors(options)
17
- end
18
69
 
19
- def setup
20
- # TODO: Use a Wrapper to Net::SSH
21
- clone_repository
22
- add_target_as_remote
23
- setup_post_receive_hook
24
- end
70
+ @config = options[:config] || Blazing::Config.parse
25
71
 
26
- def deploy
27
- deploy_command = "git push #{name}"
28
- deploy_command += " #{@branch}:#{@branch}" if @branch
29
- @runner.run deploy_command
72
+ @repository = @config.repository
73
+ create_accessors_from_config(options)
74
+ load_recipes
30
75
  end
31
76
 
32
- def config
33
- @_config ||= Blazing::Config
34
- @_config.load
35
- end
36
-
37
- def create_accessors(options)
77
+ def create_accessors_from_config(options)
38
78
  assign_settings(options)
39
79
  parse_deploy_to_string unless @deploy_to.blank?
40
80
  ensure_mandatory_settings
@@ -61,25 +101,51 @@ module Blazing
61
101
  end
62
102
  end
63
103
 
64
- def clone_command
65
- "if [ -e #{@path} ]; then \
66
- echo 'directory exists already'; else \
67
- git clone #{config.repository} #{"--branch #{@branch}" if @branch} #{@path} && cd #{@path} && git config receive.denyCurrentBranch ignore; fi"
104
+ def set_git_dir
105
+ ENV['GIT_DIR'] = '.git'
106
+ end
107
+
108
+ def reset_head!
109
+ @runner ||= Blazing::Runner.new
110
+ @runner.run 'git reset --hard HEAD'
68
111
  end
69
112
 
70
- def clone_repository
71
- @runner.run "ssh #{@user}@#{@host} '#{clone_command}'"
113
+ #
114
+ # Called by post-receive hook to determine rvm usage
115
+ #
116
+ def use_rvm?
117
+ @rvm_recipe = @recipes.find { |recipe| recipe.name == 'rvm' }
118
+ @recipes.delete_if { |recipe| recipe.name == 'rvm' }
119
+ if @rvm_recipe
120
+ @rvm_recipe.options[:rvm_string]
121
+ else
122
+ 'none'
123
+ end
72
124
  end
73
125
 
74
- def add_target_as_remote
75
- @runner.run "git remote add #{@name} #{@user}@#{@host}:#{@path}"
126
+ def load_recipes
127
+
128
+ # TODO: For now, recipes can be assigned only in the global
129
+ # namespace of the config. Make it possible for targets to
130
+ # define recipes individually
131
+
132
+ @recipes = @config.recipes if @recipes.blank?
133
+ Blazing::Recipe.load_builtin_recipes
76
134
  end
77
135
 
78
- def setup_post_receive_hook
79
- @hook.new([Blazing::Remote.new(@name).use_rvm?]).generate
80
- @runner.run "scp /tmp/post-receive #{@user}@#{@host}:#{@path}/.git/hooks/post-receive"
81
- @runner.run "ssh #{@user}@#{@host} 'chmod +x #{@path}/.git/hooks/post-receive'"
136
+ def run_recipes
137
+ run_bootstrap_recipes
138
+ @recipes.each do |recipe|
139
+ recipe.run
140
+ end
82
141
  end
83
142
 
143
+ def run_bootstrap_recipes
144
+ bundler = @recipes.find { |r| r.name == 'bundler' }
145
+ if bundler
146
+ bundler.run
147
+ @recipes.delete_if { |r| r.name == 'bundler' }
148
+ end
149
+ end
84
150
  end
85
151
  end
@@ -1,3 +1,3 @@
1
1
  module Blazing
2
- VERSION = "0.0.14"
2
+ VERSION = "0.0.15"
3
3
  end
@@ -14,6 +14,7 @@ describe Blazing::CLI::Base do
14
14
  @hook = double('hook', :new => double('template', :generate => nil))
15
15
  @base = Blazing::CLI::Base.new
16
16
  @base.instance_variable_set('@logger', @logger)
17
+ @some_target_name = 'test_target'
17
18
  end
18
19
 
19
20
  describe '#init' do
@@ -25,68 +26,51 @@ describe Blazing::CLI::Base do
25
26
  end
26
27
  end
27
28
 
28
- describe '#setup' do
29
-
30
- before :each do
31
- @some_target_name = 'test_target'
32
- hook = double('hook', :new => double('template', :generate => nil))
33
- config = Blazing::Config.new
34
- config.target(@some_target_name, :deploy_to => 'smoeone@somewhere:/asdasdasd', :_logger => @logger, :_runner => @runner, :_hook => hook)
35
- @base.instance_variable_set('@config', config)
36
- end
29
+ describe '#bootstrap' do
37
30
 
38
- it 'says what target is being setup' do
39
- @logger.should_receive(:log).with(:info, "setting up target test_target")
40
- @base.setup(@some_target_name)
41
- end
42
-
43
- it 'runs setup on selected target' do
44
- @target = @base.instance_variable_get('@config').instance_variable_get('@targets').first
45
- @target.should_receive(:setup)
46
- @base.setup(@some_target_name)
31
+ it 'runs bootstrap on selected target' do
32
+ Blazing::Target.should_receive(:bootstrap).with(@some_target_name)
33
+ @base.bootstrap(@some_target_name)
47
34
  end
48
35
 
49
36
  it 'logs a success message if exitstatus of setup was 0' do
37
+ Blazing::Target.stub!(:bootstrap)
50
38
  @base.instance_variable_set('@exit_status', 0)
51
- @logger.should_receive(:log).with(:success, "successfully set up target test_target")
52
- @base.setup(@some_target_name)
39
+ @logger.should_receive(:log).with(:success, "successfully bootstrapped target test_target")
40
+ @base.bootstrap(@some_target_name)
53
41
  end
54
42
 
55
43
  it 'logs an error if exitstatus of setup was not 0' do
44
+ Blazing::Target.stub!(:bootstrap)
56
45
  @base.instance_variable_set('@exit_status', 1)
57
- @logger.should_receive(:log).with(:error, "failed setting up target test_target")
58
- @base.setup(@some_target_name)
46
+ @logger.should_receive(:log).with(:error, "failed bootstrapping target test_target")
47
+ @base.bootstrap(@some_target_name)
59
48
  end
60
49
  end
61
50
 
62
- describe '#deploy' do
63
-
64
- before :each do
65
- @some_target_name = 'test_target'
66
- hook = double('hook', :new => double('template', :generate => nil))
67
- config = Blazing::Config.new
68
- config.target(@some_target_name, :deploy_to => 'smoeone@somewhere:/asdasdasd', :_logger => @logger, :_runner => @runner, :_hook => hook)
69
- @base.instance_variable_set('@config', config)
51
+ describe '#setup' do
52
+ it 'runs setup on given target' do
53
+ Blazing::Target.should_receive(:setup).with(@some_target_name)
54
+ @base.setup(@some_target_name)
70
55
  end
56
+ end
71
57
 
72
- it 'says what target is being deployed' do
73
- @logger.should_receive(:log).with(:info, "deploying target test_target")
74
- @base.deploy(@some_target_name)
75
- end
58
+ describe '#deploy' do
76
59
 
77
60
  it 'runs setup on selected target' do
78
- @target = @base.instance_variable_get('@config').instance_variable_get('@targets').first
79
- @target.should_receive(:deploy)
61
+ Blazing::Target.should_receive(:deploy).with(@some_target_name)
80
62
  @base.deploy(@some_target_name)
81
63
  end
82
64
 
83
65
  it 'logs a success message if exitstatus of setup was 0' do
66
+ Blazing::Target.stub!(:deploy)
84
67
  @base.instance_variable_set('@exit_status', 0)
85
68
  @logger.should_receive(:log).with(:success, "successfully deployed target test_target")
86
69
  @base.deploy(@some_target_name)
87
70
  end
88
71
 
89
72
  it 'logs an error if exitstatus of setup was not 0' do
73
+ Blazing::Target.stub!(:deploy)
90
74
  @base.instance_variable_set('@exit_status', 1)
91
75
  @logger.should_receive(:log).with(:error, "failed deploying on target test_target")
92
76
  @base.deploy(@some_target_name)
@@ -102,39 +86,9 @@ describe Blazing::CLI::Base do
102
86
 
103
87
  describe '#post_receive' do
104
88
 
105
- before :each do
106
- @some_target_name = 'test_target'
107
- config = Blazing::Config.new
108
- config.target(@some_target_name, :deploy_to => 'smoeone@somewhere:/asdasdasd')
109
- @base.instance_variable_set('@config', config)
110
- end
111
-
112
89
  it 'instantiates a new remote and calls its post_receive method' do
113
- Blazing::Remote.should_receive(:new).with(@some_target_name).and_return(double('remote', :post_receive => nil))
114
- @base.post_receive
115
- end
116
- end
117
-
118
- describe '#rvm' do
119
-
120
- before :each do
121
- @some_target_name = 'test_target'
122
- hook = double('hook', :new => double('template', :generate => nil))
123
- @config = Blazing::Config.new
124
- @config.target(@some_target_name, :deploy_to => 'smoeone@somewhere:/asdasdasd', :_logger => @logger, :_runner => @runner, :_hook => hook)
125
- @base.instance_variable_set('@config', @config)
126
- end
127
-
128
- it 'writes a log with the rvm string if the target has rvm enabled' do
129
- @logger.should_receive(:log).with(:info, 'someruby@somegemset')
130
- Blazing::Remote.stub!(:new).and_return(double('remote', :use_rvm? => 'someruby@somegemset'))
131
- @base.rvm(@some_target_name)
132
- end
133
-
134
- it 'writes a log saying false if the target has no rvm enabled' do
135
- @logger.should_receive(:log).with(:info, false)
136
- Blazing::Remote.stub!(:new).and_return(double('remote', :use_rvm? => false))
137
- @base.rvm(@some_target_name)
90
+ Blazing::Target.should_receive(:post_receive).with(@some_target_name)
91
+ @base.post_receive(@some_target_name)
138
92
  end
139
93
  end
140
94
  end
@@ -69,7 +69,7 @@ describe Blazing::Config do
69
69
  it 'reads and parses the config file and returns a config object' do
70
70
  Blazing.send(:remove_const, 'CONFIGURATION_FILE')
71
71
  Blazing::CONFIGURATION_FILE = 'spec/support/config.rb'
72
- Blazing::Config.load.should be_a Blazing::Config
72
+ Blazing::Config.parse.should be_a Blazing::Config
73
73
  end
74
74
  end
75
75
 
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+ require 'blazing'
3
+ require 'fileutils'
4
+
5
+ describe 'blazing init' do
6
+
7
+ before :each do
8
+ @blazing_root = Dir.pwd
9
+ @sandbox_directory = File.join(@blazing_root, 'spec/support/sandbox')
10
+ @blazing = Blazing::CLI::Base.new
11
+
12
+ # Sometimes, when specs failed, the sandbox would stick around
13
+ FileUtils.rm_rf(@sandbox_directory) if Dir.exists?(@sandbox_directory)
14
+
15
+ # Setup Sandbox
16
+ Dir.mkdir(@sandbox_directory)
17
+ Dir.chdir(@sandbox_directory)
18
+
19
+ # Setup empty repository
20
+ @repository_dir = 'repo_without_config'
21
+ Dir.mkdir(@repository_dir)
22
+ Dir.chdir(@repository_dir)
23
+ `git init`
24
+ end
25
+
26
+ after :each do
27
+ # Teardown Sandbox
28
+ Dir.chdir(@blazing_root)
29
+ FileUtils.rm_rf(@sandbox_directory)
30
+ end
31
+
32
+ it 'creates the config directory if it does not exist' do
33
+ silence(:stdout) { @blazing.init }
34
+ Dir.exists?('config').should be true
35
+ end
36
+
37
+ it 'does not fail when config directory exists already' do
38
+ silence(:stdout) { lambda { @blazing.init }.should_not raise_error }
39
+ end
40
+
41
+ it 'attempts to use the origin remote to setup the repository in the config' do
42
+ @origin = 'git@github.com:someone/somerepo.git'
43
+ `git remote add origin #{@origin}`
44
+ silence(:stdout) { @blazing.init }
45
+ Blazing::Config.parse.repository.should == @origin
46
+ end
47
+
48
+ it 'sets a dummy repository config when no remote was found' do
49
+ silence(:stdout) { @blazing.init }
50
+ Blazing::Config.parse.repository.should == 'user@host:/some/path'
51
+ end
52
+
53
+ end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
  require 'blazing/logger'
3
- require 'blazing/object'
3
+ require 'blazing/core_ext/object'
4
4
 
5
5
  describe Blazing::Logger do
6
6
 
@@ -1,136 +1,136 @@
1
- require 'spec_helper'
2
- require 'blazing/remote'
3
-
4
- describe Blazing::Remote do
5
-
6
- before :each do
7
- # recipes = []
8
- # @config = double('config', :load => double('actual_config', :recipes => recipes, :find_target => double('target', :recipes => recipes)))
9
- @config = Blazing::Config.new
10
- @config.target :some_name, :deploy_to => 'user@hostname:/path'
11
- @remote = Blazing::Remote.new('some_name', :config => @config)
12
- @remote.instance_variable_set('@_dir', double('Dir', :chdir => nil))
13
- end
14
-
15
- describe '#post_receive' do
16
- before :each do
17
- @remote.instance_variable_set('@runner', double('runner', :run => true))
18
- Dir.stub!(:chdir)
19
- end
20
-
21
- it 'sets up the git dir' do
22
- @remote.should_receive(:set_git_dir)
23
- @remote.post_receive
24
- end
25
-
26
- it 'runs the recipes' do
27
- @remote.should_receive(:run_recipes)
28
- @remote.post_receive
29
- end
30
-
31
- it 'resets the git repository' do
32
- @remote.should_receive(:reset_head!)
33
- @remote.post_receive
34
- end
35
- end
36
-
37
- describe '#gemfile_present?' do
38
- it 'checks if a Gemfile is in the cwd' do
39
- File.should_receive(:exists?).with('Gemfile')
40
- @remote.gemfile_present?
41
- end
42
- end
43
-
44
- describe '#set_git_dir' do
45
- it 'sets .git as gitdir if git dir is "."' do
46
- # Dir.should_receive(:chdir).with('.git')
47
- # @remote.set_git_dir
48
- end
49
- end
50
-
51
- describe '#reset_head!' do
52
- it 'does a git reset --hard HEAD' do
53
- runner = double('runner', :run => nil)
54
- @remote.instance_variable_set('@runner', runner)
55
- runner.should_receive(:run).with('git reset --hard HEAD')
56
- @remote.reset_head!
57
- end
58
- end
59
-
60
- describe '#use_rvm?' do
61
- context 'with rvm recipe enabled' do
62
- it 'returns the rvm string' do
63
- @remote.instance_variable_set('@recipes', double('recipes', :find => double('recipe', :options => { :rvm_string => 'someruby@somegemset'}), :delete_if => nil))
64
- @remote.use_rvm?.should == 'someruby@somegemset'
65
- end
66
-
67
- it 'deletes the rvm recipes from the recipes array' do
68
- @remote.instance_variable_set('@recipes', [double('rvm_recipe', :name => 'rvm', :options => {})])
69
- @remote.use_rvm?
70
- @remote.instance_variable_get('@recipes').should be_blank
71
- end
72
- end
73
-
74
- context 'without rvm_recipe' do
75
- it 'returns false' do
76
- @remote.instance_variable_set('@recipes', double('rvm_recipe', :find => false, :delete_if => nil))
77
- @remote.use_rvm?.should be false
78
- end
79
- end
80
- end
81
-
82
- describe '#setup_recipes' do
83
- context 'when the target has no recipes' do
84
- it 'assigns the global recipes settings from the config' do
85
- recipe_probe = double('recipe_probe', :name => 'noname', :run => nil)
86
- config = double('config', :recipes => [recipe_probe])
87
- @remote.instance_variable_set('@config', config)
88
- @remote.setup_recipes
89
- @remote.instance_variable_get('@recipes').first.should be recipe_probe
90
- end
91
- end
92
-
93
- context 'when the target has recipes' do
94
- it 'does not touch the target recipes' do
95
- target_recipe_probe = double('target_recipe_probe', :name => 'target', :run => nil)
96
- global_recipe_probe = double('global_recipe_probe', :name => 'global', :run => nil)
97
- global_config = double('config', :recipes => [global_recipe_probe])
98
- blazing_config_class = double('blazing_config', :load => global_config)
99
- @remote.instance_variable_set('@_config', blazing_config_class)
100
- @remote.instance_variable_set('@recipes', [target_recipe_probe])
101
- @remote.setup_recipes
102
- @remote.instance_variable_get('@recipes').first.name.should == 'target'
103
- end
104
- end
105
- end
106
-
107
- describe '#run_recipes' do
108
- it 'runs all recipes' do
109
- recipes = [double('one', :name => nil), double('two', :name => nil), double('three', :name => nil)]
110
- @remote.instance_variable_set('@recipes', recipes)
111
- recipes.each do |recipe|
112
- recipe.should_receive(:run)
113
- end
114
- @remote.run_recipes
115
- end
116
- end
117
-
118
- describe '#run_bootstrap_recipes' do
119
-
120
- before :each do
121
- @bundler = double('bundler', :name => 'bundler', :run => nil)
122
- @recipes = [@bundler, double('two', :name => nil), double('three', :name => nil)]
123
- @remote.instance_variable_set('@recipes', @recipes)
124
- end
125
-
126
- it 'runs bundler recipe if it is enabled' do
127
- @bundler.should_receive(:run)
128
- @remote.run_bootstrap_recipes
129
- end
130
-
131
- it 'deletes the bundler recipe from the array after running it' do
132
- @remote.run_bootstrap_recipes
133
- @recipes.find { |r| r.name == 'bundler' }.should be nil
134
- end
135
- end
136
- end
1
+ # require 'spec_helper'
2
+ # require 'blazing/remote'
3
+
4
+ # describe Blazing::Remote do
5
+
6
+ # before :each do
7
+ # # recipes = []
8
+ # # @config = double('config', :load => double('actual_config', :recipes => recipes, :find_target => double('target', :recipes => recipes)))
9
+ # @config = Blazing::Config.new
10
+ # @config.target :some_name, :deploy_to => 'user@hostname:/path'
11
+ # @remote = Blazing::Remote.new('some_name', :config => @config)
12
+ # @remote.instance_variable_set('@_dir', double('Dir', :chdir => nil))
13
+ # end
14
+
15
+ # describe '#post_receive' do
16
+ # before :each do
17
+ # @remote.instance_variable_set('@runner', double('runner', :run => true))
18
+ # Dir.stub!(:chdir)
19
+ # end
20
+
21
+ # it 'sets up the git dir' do
22
+ # @remote.should_receive(:set_git_dir)
23
+ # @remote.post_receive
24
+ # end
25
+
26
+ # it 'runs the recipes' do
27
+ # @remote.should_receive(:run_recipes)
28
+ # @remote.post_receive
29
+ # end
30
+
31
+ # it 'resets the git repository' do
32
+ # @remote.should_receive(:reset_head!)
33
+ # @remote.post_receive
34
+ # end
35
+ # end
36
+
37
+ # describe '#gemfile_present?' do
38
+ # it 'checks if a Gemfile is in the cwd' do
39
+ # File.should_receive(:exists?).with('Gemfile')
40
+ # @remote.gemfile_present?
41
+ # end
42
+ # end
43
+
44
+ # describe '#set_git_dir' do
45
+ # it 'sets .git as gitdir if git dir is "."' do
46
+ # # Dir.should_receive(:chdir).with('.git')
47
+ # # @remote.set_git_dir
48
+ # end
49
+ # end
50
+
51
+ # describe '#reset_head!' do
52
+ # it 'does a git reset --hard HEAD' do
53
+ # runner = double('runner', :run => nil)
54
+ # @remote.instance_variable_set('@runner', runner)
55
+ # runner.should_receive(:run).with('git reset --hard HEAD')
56
+ # @remote.reset_head!
57
+ # end
58
+ # end
59
+
60
+ # describe '#use_rvm?' do
61
+ # context 'with rvm recipe enabled' do
62
+ # it 'returns the rvm string' do
63
+ # @remote.instance_variable_set('@recipes', double('recipes', :find => double('recipe', :options => { :rvm_string => 'someruby@somegemset'}), :delete_if => nil))
64
+ # @remote.use_rvm?.should == 'someruby@somegemset'
65
+ # end
66
+
67
+ # it 'deletes the rvm recipes from the recipes array' do
68
+ # @remote.instance_variable_set('@recipes', [double('rvm_recipe', :name => 'rvm', :options => {})])
69
+ # @remote.use_rvm?
70
+ # @remote.instance_variable_get('@recipes').should be_blank
71
+ # end
72
+ # end
73
+
74
+ # context 'without rvm_recipe' do
75
+ # it 'returns false' do
76
+ # @remote.instance_variable_set('@recipes', double('rvm_recipe', :find => false, :delete_if => nil))
77
+ # @remote.use_rvm?.should be false
78
+ # end
79
+ # end
80
+ # end
81
+
82
+ # describe '#setup_recipes' do
83
+ # context 'when the target has no recipes' do
84
+ # it 'assigns the global recipes settings from the config' do
85
+ # recipe_probe = double('recipe_probe', :name => 'noname', :run => nil)
86
+ # config = double('config', :recipes => [recipe_probe])
87
+ # @remote.instance_variable_set('@config', config)
88
+ # @remote.setup_recipes
89
+ # @remote.instance_variable_get('@recipes').first.should be recipe_probe
90
+ # end
91
+ # end
92
+
93
+ # context 'when the target has recipes' do
94
+ # it 'does not touch the target recipes' do
95
+ # target_recipe_probe = double('target_recipe_probe', :name => 'target', :run => nil)
96
+ # global_recipe_probe = double('global_recipe_probe', :name => 'global', :run => nil)
97
+ # global_config = double('config', :recipes => [global_recipe_probe])
98
+ # blazing_config_class = double('blazing_config', :parse => global_config)
99
+ # @remote.instance_variable_set('@_config', blazing_config_class)
100
+ # @remote.instance_variable_set('@recipes', [target_recipe_probe])
101
+ # @remote.setup_recipes
102
+ # @remote.instance_variable_get('@recipes').first.name.should == 'target'
103
+ # end
104
+ # end
105
+ # end
106
+
107
+ # describe '#run_recipes' do
108
+ # it 'runs all recipes' do
109
+ # recipes = [double('one', :name => nil), double('two', :name => nil), double('three', :name => nil)]
110
+ # @remote.instance_variable_set('@recipes', recipes)
111
+ # recipes.each do |recipe|
112
+ # recipe.should_receive(:run)
113
+ # end
114
+ # @remote.run_recipes
115
+ # end
116
+ # end
117
+
118
+ # describe '#run_bootstrap_recipes' do
119
+
120
+ # before :each do
121
+ # @bundler = double('bundler', :name => 'bundler', :run => nil)
122
+ # @recipes = [@bundler, double('two', :name => nil), double('three', :name => nil)]
123
+ # @remote.instance_variable_set('@recipes', @recipes)
124
+ # end
125
+
126
+ # it 'runs bundler recipe if it is enabled' do
127
+ # @bundler.should_receive(:run)
128
+ # @remote.run_bootstrap_recipes
129
+ # end
130
+
131
+ # it 'deletes the bundler recipe from the array after running it' do
132
+ # @remote.run_bootstrap_recipes
133
+ # @recipes.find { |r| r.name == 'bundler' }.should be nil
134
+ # end
135
+ # end
136
+ # end
@@ -8,6 +8,7 @@ describe Blazing::Target do
8
8
  @runner = double('runner', :run => nil)
9
9
  @hook = double('hook', :new => double('template', :generate => nil))
10
10
  @options = { :deploy_to => 'someone@somehost:/some/path', :_hook => @hook, :_runner => @runner, :_logger => @logger }
11
+ Blazing::Config.stub!(:parse).and_return(Blazing::Config.new)
11
12
  end
12
13
 
13
14
  describe '#initialize' do
@@ -66,57 +67,56 @@ describe Blazing::Target do
66
67
  end
67
68
  end
68
69
 
69
- describe '#setup' do
70
+ describe '.bootstrap' do
70
71
  before :each do
71
- blazing_config = double('config', :load => Blazing::Config.new)
72
72
  @target = Blazing::Target.new('somename', @options)
73
- @target.instance_variable_set("@_config", blazing_config)
73
+ @config = Blazing::Config.new
74
+ @config.targets << @target
75
+ Blazing::Config.stub!(:parse).and_return(@config)
74
76
  end
75
77
 
76
78
  it 'clones the repository on the target location' do
77
79
  @target.should_receive(:clone_repository)
78
- @target.setup
80
+ Blazing::Target.bootstrap('somename')
79
81
  end
80
82
 
81
83
  it 'adds the target as a git remote' do
82
84
  @target.should_receive(:add_target_as_remote)
83
- @target.setup
85
+ Blazing::Target.bootstrap('somename')
84
86
  end
85
87
 
86
88
  it 'sets up the post-receive hook' do
87
89
  @target.should_receive(:setup_post_receive_hook)
88
- @target.setup
90
+ Blazing::Target.bootstrap('somename')
89
91
  end
92
+ end
90
93
 
91
- it 'checks out the correct branch if a branch is specified' do
92
- @target.branch = 'test'
93
- @target.should_receive(:checkout_correct_branch)
94
- @target.setup
94
+ describe '.deploy' do
95
+ before :each do
96
+ @target = Blazing::Target.new('somename', @options)
97
+ @config = Blazing::Config.new
98
+ @config.targets << @target
99
+ Blazing::Config.stub!(:parse).and_return(@config)
100
+ @runner = double('runner', :run => nil)
101
+ Blazing::Runner.stub!(:new).and_return(@runner)
95
102
  end
96
- end
97
103
 
98
- describe '#deploy' do
99
104
  it 'uses git push to deploy to the target' do
100
- target = Blazing::Target.new('somename', @options)
101
105
  @runner.should_receive(:run).with(/git push somename/)
102
- target.deploy
106
+ Blazing::Target.deploy('somename')
103
107
  end
104
108
 
105
109
  it 'pushes the correct branch when one is configured' do
106
- target = Blazing::Target.new('somename', @options)
107
- target.branch = 'somebranch'
110
+ @target.branch = 'somebranch'
108
111
  @runner.should_receive(:run).with(/git push somename somebranch:somebranch/)
109
- target.deploy
112
+ Blazing::Target.deploy('somename')
110
113
  end
111
114
  end
112
115
 
113
- describe '#config' do
116
+ describe 'config' do
114
117
  it 'delegates to Blazing::Config.load' do
115
- blazing_config = double
116
- target = Blazing::Target.new('somename', @options)
117
- target.instance_variable_set("@_config", blazing_config)
118
- blazing_config.should_receive(:load)
119
- target.config
118
+ Blazing::Config.should_receive(:parse)
119
+ Blazing::Target.config
120
120
  end
121
121
  end
122
122
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: blazing
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.14
5
+ version: 0.0.15
6
6
  platform: ruby
7
7
  authors:
8
8
  - Felipe Kaufmann
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-07-19 00:00:00 Z
13
+ date: 2011-07-20 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: thor
@@ -24,29 +24,29 @@ dependencies:
24
24
  prerelease: false
25
25
  version_requirements: *id001
26
26
  - !ruby/object:Gem::Dependency
27
- name: activesupport
27
+ name: grit
28
28
  requirement: &id002 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 3.0.5
33
+ version: "0"
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: *id002
37
37
  - !ruby/object:Gem::Dependency
38
- name: i18n
38
+ name: activesupport
39
39
  requirement: &id003 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ">="
43
43
  - !ruby/object:Gem::Version
44
- version: "0"
44
+ version: 3.0.5
45
45
  type: :runtime
46
46
  prerelease: false
47
47
  version_requirements: *id003
48
48
  - !ruby/object:Gem::Dependency
49
- name: grit
49
+ name: i18n
50
50
  requirement: &id004 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
@@ -79,19 +79,18 @@ files:
79
79
  - blazing.gemspec
80
80
  - lib/blazing.rb
81
81
  - lib/blazing/base.rb
82
+ - lib/blazing/bootstrap.rb
82
83
  - lib/blazing/cli/base.rb
83
84
  - lib/blazing/cli/create.rb
84
85
  - lib/blazing/cli/hook.rb
85
86
  - lib/blazing/cli/templates/blazing.tt
86
87
  - lib/blazing/cli/templates/post-hook.tt
87
- - lib/blazing/cli/templates/pre-hook.tt
88
88
  - lib/blazing/config.rb
89
+ - lib/blazing/core_ext/object.rb
89
90
  - lib/blazing/logger.rb
90
- - lib/blazing/object.rb
91
91
  - lib/blazing/recipe.rb
92
92
  - lib/blazing/recipes/bundler_recipe.rb
93
93
  - lib/blazing/recipes/rvm_recipe.rb
94
- - lib/blazing/remote.rb
95
94
  - lib/blazing/runner.rb
96
95
  - lib/blazing/target.rb
97
96
  - lib/blazing/version.rb
@@ -100,6 +99,7 @@ files:
100
99
  - spec/blazing/cli/create_spec.rb
101
100
  - spec/blazing/cli/hook_spec.rb
102
101
  - spec/blazing/config_spec.rb
102
+ - spec/blazing/integration/init_spec.rb
103
103
  - spec/blazing/logger_spec.rb
104
104
  - spec/blazing/recipe_spec.rb
105
105
  - spec/blazing/recipes/bundler_recipe_spec.rb
@@ -123,7 +123,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
123
123
  requirements:
124
124
  - - ">="
125
125
  - !ruby/object:Gem::Version
126
- hash: -2643917059137636160
126
+ hash: 3198654558293204946
127
127
  segments:
128
128
  - 0
129
129
  version: "0"
@@ -132,7 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
132
132
  requirements:
133
133
  - - ">="
134
134
  - !ruby/object:Gem::Version
135
- hash: -2643917059137636160
135
+ hash: 3198654558293204946
136
136
  segments:
137
137
  - 0
138
138
  version: "0"
@@ -149,6 +149,7 @@ test_files:
149
149
  - spec/blazing/cli/create_spec.rb
150
150
  - spec/blazing/cli/hook_spec.rb
151
151
  - spec/blazing/config_spec.rb
152
+ - spec/blazing/integration/init_spec.rb
152
153
  - spec/blazing/logger_spec.rb
153
154
  - spec/blazing/recipe_spec.rb
154
155
  - spec/blazing/recipes/bundler_recipe_spec.rb
@@ -1,9 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'rubygems'
4
- require 'thor'
5
- require 'blazing'
6
- require 'blazing/cli'
7
- require 'blazing/remote'
8
-
9
- Blazing::Remote.pre_receive('<%= remote.name %>')
@@ -1,73 +0,0 @@
1
- require 'blazing'
2
- require 'blazing/config'
3
-
4
- module Blazing
5
- class Remote
6
-
7
- def initialize(target_name, options = {})
8
- @config = options[:config] || Blazing::Config.load
9
- @target = @config.find_target(target_name)
10
- @recipes = @target.recipes
11
- setup_recipes
12
- end
13
-
14
- def post_receive
15
- set_git_dir
16
- reset_head!
17
- @recipes.delete_if { |recipe| recipe.name == 'rvm' }
18
- run_recipes
19
- end
20
-
21
- def gemfile_present?
22
- File.exists? 'Gemfile'
23
- end
24
-
25
- def set_git_dir
26
- ENV['GIT_DIR'] = '.git'
27
- end
28
-
29
- def reset_head!
30
- @runner ||= Blazing::Runner.new
31
- @runner.run 'git reset --hard HEAD'
32
- end
33
-
34
- #
35
- # Called by post-receive hook to determine rvm usage
36
- #
37
- def use_rvm?
38
- @rvm_recipe = @recipes.find { |recipe| recipe.name == 'rvm' }
39
- @recipes.delete_if { |recipe| recipe.name == 'rvm' }
40
- if @rvm_recipe
41
- @rvm_recipe.options[:rvm_string]
42
- else
43
- 'none'
44
- end
45
- end
46
-
47
- def setup_recipes
48
-
49
- # TODO: For now, recipes can be assigned only in the global
50
- # namespace of the config. Make it possible for targets to
51
- # define recipes individually
52
-
53
- @recipes = @config.recipes if @recipes.blank?
54
- Blazing::Recipe.load_builtin_recipes
55
- end
56
-
57
- def run_recipes
58
- run_bootstrap_recipes
59
- @recipes.each do |recipe|
60
- recipe.run
61
- end
62
- end
63
-
64
- def run_bootstrap_recipes
65
- bundler = @recipes.find { |r| r.name == 'bundler' }
66
- if bundler
67
- bundler.run
68
- @recipes.delete_if { |r| r.name == 'bundler' }
69
- end
70
- end
71
- end
72
-
73
- end