pulsar 0.0.6 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.rspec +0 -2
- data/.rvmrc +1 -0
- data/README.md +3 -1
- data/bin/pulsar-utils +5 -0
- data/lib/pulsar/commands/all.rb +1 -1
- data/lib/pulsar/commands/init.rb +1 -1
- data/lib/pulsar/commands/list.rb +3 -21
- data/lib/pulsar/commands/main.rb +32 -13
- data/lib/pulsar/commands/utils.rb +10 -0
- data/lib/pulsar/helpers/all.rb +4 -0
- data/lib/pulsar/options/all.rb +4 -0
- data/lib/pulsar/options/conf_repo.rb +28 -0
- data/lib/pulsar/options/shared.rb +14 -0
- data/lib/pulsar/version.rb +1 -1
- data/lib/pulsar.rb +2 -2
- data/pulsar.gemspec +5 -4
- data/spec/pulsar/commands/list_spec.rb +6 -1
- data/spec/pulsar/commands/main_spec.rb +149 -7
- data/spec/pulsar/commands/utils_spec.rb +33 -0
- data/spec/spec_helper.rb +13 -2
- data/spec/support/dummies/dummy_app/config.ru +3 -0
- data/spec/support/{dummy_conf → dummies/dummy_conf}/Gemfile +0 -0
- data/spec/support/{dummy_conf → dummies/dummy_conf}/apps/base.rb +3 -1
- data/spec/support/{dummy_conf → dummies/dummy_conf}/apps/dummy_app/defaults.rb +2 -0
- data/spec/support/{dummy_conf → dummies/dummy_conf}/apps/dummy_app/production.rb +2 -0
- data/spec/support/dummies/dummy_conf/apps/dummy_app/recipes/custom_recipe.rb +1 -0
- data/spec/support/dummies/dummy_conf/apps/dummy_app/recipes/production/custom_recipe.rb +1 -0
- data/spec/support/dummies/dummy_conf/apps/dummy_app/recipes/staging/custom_recipe.rb +1 -0
- data/spec/support/{dummy_conf → dummies/dummy_conf}/apps/dummy_app/staging.rb +2 -0
- data/spec/support/{dummy_conf → dummies/dummy_conf}/recipes/generic/recipe.rb +0 -0
- data/spec/support/modules/helpers.rb +26 -3
- metadata +53 -26
- data/lib/pulsar/commands/cap.rb +0 -56
- data/lib/pulsar/tasks/.gitkeep +0 -0
- data/spec/pulsar/commands/cap_spec.rb +0 -52
- data/spec/support/dummy_conf/apps/dummy_app/recipes/.gitkeep +0 -0
data/.rspec
CHANGED
data/.rvmrc
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# Pulsar
|
2
2
|
|
3
|
-
[![
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/pulsar.png)](http://badge.fury.io/rb/pulsar)
|
4
|
+
[![Build Status](https://secure.travis-ci.org/nebulab/pulsar.png?branch=master)](http://travis-ci.org/nebulab/pulsar)
|
5
|
+
[![Coverage Status](https://coveralls.io/repos/nebulab/pulsar/badge.png?branch=master)](https://coveralls.io/r/nebulab/pulsar)
|
4
6
|
[![Code Climate](https://codeclimate.com/github/nebulab/pulsar.png)](https://codeclimate.com/github/nebulab/pulsar)
|
5
7
|
|
6
8
|
Pulsar is a little tool that helps with deploys. Its main purpose is building capfiles for [Capistrano](https://rubygems.org/gems/capistrano)
|
data/bin/pulsar-utils
ADDED
data/lib/pulsar/commands/all.rb
CHANGED
data/lib/pulsar/commands/init.rb
CHANGED
data/lib/pulsar/commands/list.rb
CHANGED
@@ -1,25 +1,7 @@
|
|
1
1
|
module Pulsar
|
2
|
-
class ListCommand <
|
3
|
-
|
4
|
-
|
5
|
-
:default => false
|
6
|
-
|
7
|
-
option [ "-r", "--keep-repo" ], :flag,
|
8
|
-
"don't remove the downloaded configuration repository from the TMP DIR directory",
|
9
|
-
:default => false
|
10
|
-
|
11
|
-
option [ "-c", "--conf-repo" ], "REPO URL",
|
12
|
-
"a git repository with deploy configurations, mainly apps and recipes",
|
13
|
-
:required => true
|
14
|
-
|
15
|
-
option [ "-b", "--conf-branch" ], "REPO BRANCH",
|
16
|
-
"specify a branch for the configuration repository",
|
17
|
-
:default => "master"
|
18
|
-
|
19
|
-
option [ "-d", "--tmp-dir" ], "TMP DIR",
|
20
|
-
"a directory where to put the configuration repo to build capfile with",
|
21
|
-
:default => "/tmp/pulsar"
|
22
|
-
|
2
|
+
class ListCommand < UtilsCommand
|
3
|
+
include Pulsar::Options::ConfRepo
|
4
|
+
|
23
5
|
def execute
|
24
6
|
Bundler.with_clean_env do
|
25
7
|
fetch_repo
|
data/lib/pulsar/commands/main.rb
CHANGED
@@ -1,22 +1,41 @@
|
|
1
1
|
module Pulsar
|
2
2
|
class MainCommand < Clamp::Command
|
3
3
|
include Pulsar::Helpers::Clamp
|
4
|
+
include Pulsar::Options::Shared
|
5
|
+
include Pulsar::Options::ConfRepo
|
6
|
+
|
7
|
+
option [ "-l", "--log-level" ], "LOG LEVEL",
|
8
|
+
"how much output will Capistrano print out. Can be any of: important, info, debug",
|
9
|
+
:default => "important"
|
4
10
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
+
option [ "-s", "--skip-cap-run" ], :flag,
|
12
|
+
"do everything pulsar does (build a Capfile) but don't run the cap command",
|
13
|
+
:default => false
|
14
|
+
|
15
|
+
parameter "APPLICATION", "the application which you would like to deploy" unless File.exists?("#{Dir.pwd}/config.ru")
|
16
|
+
parameter "ENVIRONMENT", "the environment on which you would like to deploy" do |env|
|
17
|
+
%w(production staging development).include?(env) ? env : raise(ArgumentError)
|
11
18
|
end
|
19
|
+
parameter "[TASKS] ...", "the arguments and/or options that will be passed to capistrano", :default => "deploy"
|
20
|
+
|
21
|
+
def execute
|
22
|
+
app = application rescue File.basename(Dir.pwd)
|
23
|
+
target = "#{app}:#{environment}"
|
12
24
|
|
13
|
-
|
25
|
+
Bundler.with_clean_env do
|
26
|
+
fetch_repo
|
27
|
+
bundle_install
|
28
|
+
create_capfile
|
29
|
+
build_capfile(target)
|
14
30
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
31
|
+
unless skip_cap_run?
|
32
|
+
cap_args = [tasks_list].flatten.join(" ")
|
33
|
+
run_capistrano(cap_args)
|
34
|
+
end
|
35
|
+
|
36
|
+
remove_capfile unless keep_capfile?
|
37
|
+
remove_repo unless keep_repo?
|
38
|
+
end
|
39
|
+
end
|
21
40
|
end
|
22
41
|
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module Pulsar
|
2
|
+
class UtilsCommand < Clamp::Command
|
3
|
+
include Pulsar::Helpers::Clamp
|
4
|
+
include Pulsar::Options::Shared
|
5
|
+
|
6
|
+
subcommand "list", "list all available apps and environments which you can deploy", ListCommand
|
7
|
+
subcommand "init", "generate a new configuration repo with some basic recipes to use with pulsar", InitCommand
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Pulsar
|
2
|
+
module Options
|
3
|
+
module ConfRepo
|
4
|
+
def self.included(base)
|
5
|
+
base.option [ "-c", "--conf-repo" ], "REPO URL",
|
6
|
+
"a git repository with deploy configurations, mainly apps and recipes",
|
7
|
+
:environment_variable => "PULSAR_CONF_REPO",
|
8
|
+
:required => true
|
9
|
+
|
10
|
+
base.option [ "-k", "--keep-capfile" ], :flag,
|
11
|
+
"don't remove the generated capfile in the TMP DIR directory",
|
12
|
+
:default => false
|
13
|
+
|
14
|
+
base.option [ "-r", "--keep-repo" ], :flag,
|
15
|
+
"don't remove the downloaded configuration repository from the TMP DIR directory",
|
16
|
+
:default => false
|
17
|
+
|
18
|
+
base.option [ "-b", "--conf-branch" ], "REPO BRANCH",
|
19
|
+
"specify a branch for the configuration repository",
|
20
|
+
:default => "master"
|
21
|
+
|
22
|
+
base.option [ "-d", "--tmp-dir" ], "TMP DIR",
|
23
|
+
"a directory where to put the configuration repo to build capfile with",
|
24
|
+
:default => "/tmp/pulsar"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Pulsar
|
2
|
+
module Options
|
3
|
+
module Shared
|
4
|
+
def self.included(base)
|
5
|
+
base.option [ "-V", "--version" ], :flag, "print out pulsar version" do
|
6
|
+
puts(VERSION)
|
7
|
+
exit(0)
|
8
|
+
end
|
9
|
+
|
10
|
+
base.option [ "-v", "--verbose" ], :flag, "print out what pulsar is doing", :default => false
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/pulsar/version.rb
CHANGED
data/lib/pulsar.rb
CHANGED
data/pulsar.gemspec
CHANGED
@@ -8,11 +8,11 @@ Gem::Specification.new do |gem|
|
|
8
8
|
gem.version = Pulsar::VERSION
|
9
9
|
gem.authors = ["Alberto Vena", "Matteo Latini"]
|
10
10
|
gem.email = ["info@nebulab.it"]
|
11
|
-
gem.description = %q{
|
11
|
+
gem.description = %q{Manage your Capistrano deployments with ease}
|
12
12
|
gem.summary = %q{
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
Pulsar helps with Capistrano configuration management. It uses a repository
|
14
|
+
to store all your precious configurations and recipes to build Capistrano
|
15
|
+
deploys on it.
|
16
16
|
}
|
17
17
|
gem.homepage = "https://github.com/nebulab/pulsar"
|
18
18
|
|
@@ -28,4 +28,5 @@ Gem::Specification.new do |gem|
|
|
28
28
|
gem.add_development_dependency "rake"
|
29
29
|
gem.add_development_dependency "rspec", "~> 2.12"
|
30
30
|
gem.add_development_dependency "rr", "~> 1.0"
|
31
|
+
gem.add_development_dependency "coveralls", "~> 0.6.3"
|
31
32
|
end
|
@@ -14,7 +14,12 @@ describe Pulsar::ListCommand do
|
|
14
14
|
|
15
15
|
context "--conf-repo option" do
|
16
16
|
it "is required" do
|
17
|
-
expect { pulsar.parse([
|
17
|
+
expect { pulsar.parse([]) }.to raise_error(Clamp::UsageError)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "supports environment variable" do
|
21
|
+
ENV["PULSAR_CONF_REPO"] = dummy_conf_path
|
22
|
+
expect { pulsar.parse([]) }.not_to raise_error(Clamp::UsageError)
|
18
23
|
end
|
19
24
|
|
20
25
|
it "supports directories" do
|
@@ -3,6 +3,95 @@ require 'spec_helper'
|
|
3
3
|
describe Pulsar::MainCommand do
|
4
4
|
let(:pulsar) { Pulsar::MainCommand.new("") }
|
5
5
|
|
6
|
+
before(:each) { reload_main_command }
|
7
|
+
|
8
|
+
it "builds a Capfile file in tmp dir" do
|
9
|
+
expect { pulsar.run(full_cap_args + dummy_app) }.to change{ Dir.glob("#{tmp_path}/capfile-*").length }.by(1)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "copies a the repo over to temp directory" do
|
13
|
+
expect { pulsar.run(full_cap_args + %w(--keep-repo) + dummy_app) }.to change{ Dir.glob("#{tmp_path}/conf-repo*").length }.by(1)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "copies a the repo when there is a dir with same name" do
|
17
|
+
system("mkdir #{tmp_path}/conf-repo")
|
18
|
+
expect { pulsar.run(full_cap_args + %w(--keep-repo) + dummy_app) }.to change{ Dir.glob("#{tmp_path}/conf-repo*").length }.by(1)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "uses dirname when inside a rack app directory" do
|
22
|
+
FileUtils.cd(dummy_rack_app_path) do
|
23
|
+
reload_main_command
|
24
|
+
|
25
|
+
expect { pulsar.run(full_cap_args + %w(production)) }.to change{ Dir.glob("#{tmp_path}/capfile-*").length }.by(1)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "Capfile" do
|
30
|
+
it "uses base.rb in staging stage" do
|
31
|
+
pulsar.run(full_cap_args + dummy_app(:staging))
|
32
|
+
|
33
|
+
latest_capfile.should include("# This is apps/base.rb")
|
34
|
+
end
|
35
|
+
|
36
|
+
it "uses base.rb in production stage" do
|
37
|
+
pulsar.run(full_cap_args + dummy_app)
|
38
|
+
|
39
|
+
latest_capfile.should include("# This is apps/base.rb")
|
40
|
+
end
|
41
|
+
|
42
|
+
it "uses defaults.rb in staging stage" do
|
43
|
+
pulsar.run(full_cap_args + dummy_app(:staging))
|
44
|
+
|
45
|
+
latest_capfile.should include("# This is apps/dummy_app/defaults.rb")
|
46
|
+
end
|
47
|
+
|
48
|
+
it "uses defaults.rb in production stage" do
|
49
|
+
pulsar.run(full_cap_args + dummy_app)
|
50
|
+
|
51
|
+
latest_capfile.should include("# This is apps/dummy_app/defaults.rb")
|
52
|
+
end
|
53
|
+
|
54
|
+
it "uses defaults.rb in staging stage only" do
|
55
|
+
pulsar.run(full_cap_args + dummy_app(:staging))
|
56
|
+
|
57
|
+
latest_capfile.should include("# This is apps/dummy_app/staging.rb")
|
58
|
+
latest_capfile.should_not include("# This is apps/dummy_app/production.rb")
|
59
|
+
end
|
60
|
+
|
61
|
+
it "uses defaults.rb in production stage only" do
|
62
|
+
pulsar.run(full_cap_args + dummy_app)
|
63
|
+
|
64
|
+
latest_capfile.should include("# This is apps/dummy_app/production.rb")
|
65
|
+
latest_capfile.should_not include("# This is apps/dummy_app/staging.rb")
|
66
|
+
end
|
67
|
+
|
68
|
+
it "uses custom recipes in staging stage" do
|
69
|
+
pulsar.run(full_cap_args + dummy_app(:staging))
|
70
|
+
|
71
|
+
latest_capfile.should include("# This is apps/dummy_app/recipes/custom_recipe.rb")
|
72
|
+
end
|
73
|
+
|
74
|
+
it "uses custom recipes in production stage" do
|
75
|
+
pulsar.run(full_cap_args + dummy_app)
|
76
|
+
|
77
|
+
latest_capfile.should include("# This is apps/dummy_app/recipes/custom_recipe.rb")
|
78
|
+
end
|
79
|
+
|
80
|
+
it "uses custom staging recipes in staging stage only" do
|
81
|
+
pulsar.run(full_cap_args + dummy_app(:staging))
|
82
|
+
|
83
|
+
latest_capfile.should include("# This is apps/dummy_app/recipes/staging/custom_recipe.rb")
|
84
|
+
latest_capfile.should_not include("# This is apps/dummy_app/recipes/production/custom_recipe.rb")
|
85
|
+
end
|
86
|
+
|
87
|
+
it "uses custom production recipes in production stage only" do
|
88
|
+
pulsar.run(full_cap_args + dummy_app)
|
89
|
+
|
90
|
+
latest_capfile.should include("# This is apps/dummy_app/recipes/production/custom_recipe.rb")
|
91
|
+
latest_capfile.should_not include("# This is apps/dummy_app/recipes/staging/custom_recipe.rb")
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
6
95
|
context "--version option" do
|
7
96
|
before do
|
8
97
|
begin
|
@@ -22,13 +111,66 @@ describe Pulsar::MainCommand do
|
|
22
111
|
end
|
23
112
|
end
|
24
113
|
|
25
|
-
context "
|
26
|
-
it "
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
114
|
+
context "--conf-repo option" do
|
115
|
+
it "is required" do
|
116
|
+
expect { pulsar.parse([]) }.to raise_error(Clamp::UsageError)
|
117
|
+
end
|
118
|
+
|
119
|
+
it "supports environment variable" do
|
120
|
+
ENV["PULSAR_CONF_REPO"] = dummy_conf_path
|
121
|
+
expect { pulsar.parse(dummy_app) }.not_to raise_error(Clamp::UsageError)
|
122
|
+
end
|
123
|
+
|
124
|
+
it "supports directories" do
|
125
|
+
expect { pulsar.run(full_cap_args + dummy_app) }.not_to raise_error(Errno::ENOENT)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
context "--tmp-dir option" do
|
130
|
+
it "is supported" do
|
131
|
+
expect { pulsar.parse(base_args + %w(--tmp-dir dummy_tmp) + dummy_app) }.to_not raise_error(Clamp::UsageError)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
context "--keep-capfile option" do
|
136
|
+
it "is supported" do
|
137
|
+
expect { pulsar.parse(base_args + %w(--keep-capfile) + dummy_app) }.to_not raise_error(Clamp::UsageError)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
context "--skip-cap-run option" do
|
142
|
+
it "is supported" do
|
143
|
+
expect { pulsar.parse(base_args + %w(--skip-cap-run) + dummy_app) }.to_not raise_error(Clamp::UsageError)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
context "--keep-repo option" do
|
148
|
+
it "is supported" do
|
149
|
+
expect { pulsar.parse(base_args + %w(--keep-repo) + dummy_app) }.to_not raise_error(Clamp::UsageError)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
context "--log-level option" do
|
154
|
+
it "is supported" do
|
155
|
+
expect { pulsar.parse(base_args + %w(--log-level debug) + dummy_app) }.to_not raise_error(Clamp::UsageError)
|
156
|
+
end
|
157
|
+
|
158
|
+
it "supports Capistrano IMPORTANT" do
|
159
|
+
pulsar.run(full_cap_args + %w(--log-level important) + dummy_app)
|
160
|
+
|
161
|
+
latest_capfile.should include("logger.level = logger.level = Capistrano::Logger::IMPORTANT")
|
162
|
+
end
|
163
|
+
|
164
|
+
it "supports Capistrano INFO" do
|
165
|
+
pulsar.run(full_cap_args + %w(--log-level info) + dummy_app)
|
166
|
+
|
167
|
+
latest_capfile.should include("logger.level = logger.level = Capistrano::Logger::INFO")
|
168
|
+
end
|
169
|
+
|
170
|
+
it "supports Capistrano DEBUG" do
|
171
|
+
pulsar.run(full_cap_args + %w(--log-level debug) + dummy_app)
|
172
|
+
|
173
|
+
latest_capfile.should include("logger.level = logger.level = Capistrano::Logger::DEBUG")
|
32
174
|
end
|
33
175
|
end
|
34
176
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Pulsar::UtilsCommand do
|
4
|
+
let(:pulsar) { Pulsar::UtilsCommand.new("") }
|
5
|
+
|
6
|
+
context "--version option" do
|
7
|
+
before do
|
8
|
+
begin
|
9
|
+
pulsar.parse(["--version"])
|
10
|
+
rescue SystemExit => e
|
11
|
+
@system_exit = e
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
it "shows version" do
|
16
|
+
stdout.should include(Pulsar::VERSION)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "exits with a zero status" do
|
20
|
+
@system_exit.should_not be_nil
|
21
|
+
@system_exit.status.should == 0
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context "subcommands" do
|
26
|
+
it "should be cap and list and init" do
|
27
|
+
help = pulsar.help
|
28
|
+
help.should =~ /Subcommands:/
|
29
|
+
help.should =~ /list/
|
30
|
+
help.should =~ /init/
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,8 +1,15 @@
|
|
1
1
|
require "rspec"
|
2
2
|
require "stringio"
|
3
3
|
require "fileutils"
|
4
|
+
require "coveralls"
|
4
5
|
require "pulsar"
|
5
6
|
require "pulsar/commands/main"
|
7
|
+
require "pulsar/commands/utils"
|
8
|
+
|
9
|
+
#
|
10
|
+
# Code coverage
|
11
|
+
#
|
12
|
+
Coveralls.wear!
|
6
13
|
|
7
14
|
#
|
8
15
|
# Require all helper modules
|
@@ -10,12 +17,16 @@ require "pulsar/commands/main"
|
|
10
17
|
Dir[File.join(File.dirname(__FILE__), 'support/modules/**/*.rb')].each { |f| require f }
|
11
18
|
|
12
19
|
RSpec.configure do |config|
|
13
|
-
config.mock_with :
|
20
|
+
config.mock_with :rspec
|
14
21
|
|
15
22
|
config.include Helpers
|
16
23
|
config.include OutputCapture
|
17
24
|
|
18
|
-
config.
|
25
|
+
config.before(:all) do
|
26
|
+
ENV.delete("PULSAR_CONF_REPO")
|
27
|
+
end
|
28
|
+
|
29
|
+
config.after(:each) do
|
19
30
|
FileUtils.rm_rf(Dir.glob("#{File.dirname(__FILE__)}/support/tmp/*"))
|
20
31
|
end
|
21
32
|
end
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
# This is apps/dummy_app/recipes/custom_recipe.rb
|
@@ -0,0 +1 @@
|
|
1
|
+
# This is apps/dummy_app/recipes/production/custom_recipe.rb
|
@@ -0,0 +1 @@
|
|
1
|
+
# This is apps/dummy_app/recipes/staging/custom_recipe.rb
|
File without changes
|
@@ -12,14 +12,37 @@ module Helpers
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def dummy_conf_path
|
15
|
-
File.join(File.dirname(__FILE__), "..", "dummy_conf")
|
15
|
+
File.join(File.dirname(__FILE__), "..", "dummies", "dummy_conf")
|
16
|
+
end
|
17
|
+
|
18
|
+
def dummy_rack_app_path
|
19
|
+
File.join(File.dirname(__FILE__), "..", "dummies", "dummy_app")
|
16
20
|
end
|
17
21
|
|
18
22
|
def tmp_path
|
19
23
|
File.join(File.dirname(__FILE__), "..", "tmp")
|
20
24
|
end
|
21
25
|
|
22
|
-
def dummy_app
|
23
|
-
[ "dummy_app",
|
26
|
+
def dummy_app(stage = :production)
|
27
|
+
[ "dummy_app", stage.to_s ]
|
28
|
+
end
|
29
|
+
|
30
|
+
def latest_capfile
|
31
|
+
capfile = File.open(Dir.glob("#{tmp_path}/capfile-*").first)
|
32
|
+
content = capfile.read
|
33
|
+
capfile.close
|
34
|
+
|
35
|
+
content
|
36
|
+
end
|
37
|
+
|
38
|
+
def reload_main_command
|
39
|
+
Pulsar.instance_eval{ remove_const :MainCommand }
|
40
|
+
load "pulsar/commands/main.rb"
|
41
|
+
|
42
|
+
stub_bundle_install
|
43
|
+
end
|
44
|
+
|
45
|
+
def stub_bundle_install
|
46
|
+
Pulsar::MainCommand.any_instance.stub(:bundle_install)
|
24
47
|
end
|
25
48
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pulsar
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-03-
|
13
|
+
date: 2013-03-26 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: clamp
|
@@ -108,11 +108,28 @@ dependencies:
|
|
108
108
|
- - ~>
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '1.0'
|
111
|
-
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: coveralls
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - ~>
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: 0.6.3
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
123
|
+
requirements:
|
124
|
+
- - ~>
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: 0.6.3
|
127
|
+
description: Manage your Capistrano deployments with ease
|
112
128
|
email:
|
113
129
|
- info@nebulab.it
|
114
130
|
executables:
|
115
131
|
- pulsar
|
132
|
+
- pulsar-utils
|
116
133
|
extensions: []
|
117
134
|
extra_rdoc_files: []
|
118
135
|
files:
|
@@ -125,12 +142,13 @@ files:
|
|
125
142
|
- README.md
|
126
143
|
- Rakefile
|
127
144
|
- bin/pulsar
|
145
|
+
- bin/pulsar-utils
|
128
146
|
- lib/pulsar.rb
|
129
147
|
- lib/pulsar/commands/all.rb
|
130
|
-
- lib/pulsar/commands/cap.rb
|
131
148
|
- lib/pulsar/commands/init.rb
|
132
149
|
- lib/pulsar/commands/list.rb
|
133
150
|
- lib/pulsar/commands/main.rb
|
151
|
+
- lib/pulsar/commands/utils.rb
|
134
152
|
- lib/pulsar/generators/init_repo/Gemfile
|
135
153
|
- lib/pulsar/generators/init_repo/README.md
|
136
154
|
- lib/pulsar/generators/init_repo/apps/base.rb
|
@@ -143,24 +161,30 @@ files:
|
|
143
161
|
- lib/pulsar/generators/init_repo/recipes/generic/cleanup.rb
|
144
162
|
- lib/pulsar/generators/init_repo/recipes/generic/rake.rb
|
145
163
|
- lib/pulsar/generators/init_repo/recipes/rails/.gitkeep
|
164
|
+
- lib/pulsar/helpers/all.rb
|
146
165
|
- lib/pulsar/helpers/capistrano.rb
|
147
166
|
- lib/pulsar/helpers/clamp.rb
|
148
|
-
- lib/pulsar/
|
167
|
+
- lib/pulsar/options/all.rb
|
168
|
+
- lib/pulsar/options/conf_repo.rb
|
169
|
+
- lib/pulsar/options/shared.rb
|
149
170
|
- lib/pulsar/version.rb
|
150
171
|
- pulsar.gemspec
|
151
|
-
- spec/pulsar/commands/cap_spec.rb
|
152
172
|
- spec/pulsar/commands/init_spec.rb
|
153
173
|
- spec/pulsar/commands/list_spec.rb
|
154
174
|
- spec/pulsar/commands/main_spec.rb
|
175
|
+
- spec/pulsar/commands/utils_spec.rb
|
155
176
|
- spec/pulsar/helpers/clamp_spec.rb
|
156
177
|
- spec/spec_helper.rb
|
157
|
-
- spec/support/
|
158
|
-
- spec/support/dummy_conf/
|
159
|
-
- spec/support/dummy_conf/apps/
|
160
|
-
- spec/support/dummy_conf/apps/dummy_app/
|
161
|
-
- spec/support/dummy_conf/apps/dummy_app/
|
162
|
-
- spec/support/dummy_conf/apps/dummy_app/
|
163
|
-
- spec/support/dummy_conf/recipes/
|
178
|
+
- spec/support/dummies/dummy_app/config.ru
|
179
|
+
- spec/support/dummies/dummy_conf/Gemfile
|
180
|
+
- spec/support/dummies/dummy_conf/apps/base.rb
|
181
|
+
- spec/support/dummies/dummy_conf/apps/dummy_app/defaults.rb
|
182
|
+
- spec/support/dummies/dummy_conf/apps/dummy_app/production.rb
|
183
|
+
- spec/support/dummies/dummy_conf/apps/dummy_app/recipes/custom_recipe.rb
|
184
|
+
- spec/support/dummies/dummy_conf/apps/dummy_app/recipes/production/custom_recipe.rb
|
185
|
+
- spec/support/dummies/dummy_conf/apps/dummy_app/recipes/staging/custom_recipe.rb
|
186
|
+
- spec/support/dummies/dummy_conf/apps/dummy_app/staging.rb
|
187
|
+
- spec/support/dummies/dummy_conf/recipes/generic/recipe.rb
|
164
188
|
- spec/support/modules/helpers.rb
|
165
189
|
- spec/support/modules/output_capture.rb
|
166
190
|
- spec/support/tmp/.gitkeep
|
@@ -178,7 +202,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
178
202
|
version: '0'
|
179
203
|
segments:
|
180
204
|
- 0
|
181
|
-
hash:
|
205
|
+
hash: 2803214498054614513
|
182
206
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
183
207
|
none: false
|
184
208
|
requirements:
|
@@ -187,29 +211,32 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
187
211
|
version: '0'
|
188
212
|
segments:
|
189
213
|
- 0
|
190
|
-
hash:
|
214
|
+
hash: 2803214498054614513
|
191
215
|
requirements: []
|
192
216
|
rubyforge_project:
|
193
217
|
rubygems_version: 1.8.24
|
194
218
|
signing_key:
|
195
219
|
specification_version: 3
|
196
|
-
summary:
|
197
|
-
|
198
|
-
|
220
|
+
summary: Pulsar helps with Capistrano configuration management. It uses a repository
|
221
|
+
to store all your precious configurations and recipes to build Capistrano deploys
|
222
|
+
on it.
|
199
223
|
test_files:
|
200
|
-
- spec/pulsar/commands/cap_spec.rb
|
201
224
|
- spec/pulsar/commands/init_spec.rb
|
202
225
|
- spec/pulsar/commands/list_spec.rb
|
203
226
|
- spec/pulsar/commands/main_spec.rb
|
227
|
+
- spec/pulsar/commands/utils_spec.rb
|
204
228
|
- spec/pulsar/helpers/clamp_spec.rb
|
205
229
|
- spec/spec_helper.rb
|
206
|
-
- spec/support/
|
207
|
-
- spec/support/dummy_conf/
|
208
|
-
- spec/support/dummy_conf/apps/
|
209
|
-
- spec/support/dummy_conf/apps/dummy_app/
|
210
|
-
- spec/support/dummy_conf/apps/dummy_app/
|
211
|
-
- spec/support/dummy_conf/apps/dummy_app/
|
212
|
-
- spec/support/dummy_conf/recipes/
|
230
|
+
- spec/support/dummies/dummy_app/config.ru
|
231
|
+
- spec/support/dummies/dummy_conf/Gemfile
|
232
|
+
- spec/support/dummies/dummy_conf/apps/base.rb
|
233
|
+
- spec/support/dummies/dummy_conf/apps/dummy_app/defaults.rb
|
234
|
+
- spec/support/dummies/dummy_conf/apps/dummy_app/production.rb
|
235
|
+
- spec/support/dummies/dummy_conf/apps/dummy_app/recipes/custom_recipe.rb
|
236
|
+
- spec/support/dummies/dummy_conf/apps/dummy_app/recipes/production/custom_recipe.rb
|
237
|
+
- spec/support/dummies/dummy_conf/apps/dummy_app/recipes/staging/custom_recipe.rb
|
238
|
+
- spec/support/dummies/dummy_conf/apps/dummy_app/staging.rb
|
239
|
+
- spec/support/dummies/dummy_conf/recipes/generic/recipe.rb
|
213
240
|
- spec/support/modules/helpers.rb
|
214
241
|
- spec/support/modules/output_capture.rb
|
215
242
|
- spec/support/tmp/.gitkeep
|
data/lib/pulsar/commands/cap.rb
DELETED
@@ -1,56 +0,0 @@
|
|
1
|
-
module Pulsar
|
2
|
-
class CapCommand < MainCommand
|
3
|
-
option [ "-k", "--keep-capfile" ], :flag,
|
4
|
-
"don't remove the generated capfile in the TMP DIR directory",
|
5
|
-
:default => false
|
6
|
-
|
7
|
-
option [ "-r", "--keep-repo" ], :flag,
|
8
|
-
"don't remove the downloaded configuration repository from the TMP DIR directory",
|
9
|
-
:default => false
|
10
|
-
|
11
|
-
option [ "-l", "--log-level" ], "LOG LEVEL",
|
12
|
-
"how much output will Capistrano print out. Can be any of: important, info, debug",
|
13
|
-
:default => "important"
|
14
|
-
|
15
|
-
option [ "-c", "--conf-repo" ], "REPO URL",
|
16
|
-
"a git repository with deploy configurations, mainly apps and recipes",
|
17
|
-
:required => true
|
18
|
-
|
19
|
-
option [ "-b", "--conf-branch" ], "REPO BRANCH",
|
20
|
-
"specify a branch for the configuration repository",
|
21
|
-
:default => "master"
|
22
|
-
|
23
|
-
option [ "-d", "--tmp-dir" ], "TMP DIR",
|
24
|
-
"a directory where to put the configuration repo to build capfile with",
|
25
|
-
:default => "/tmp/pulsar"
|
26
|
-
|
27
|
-
option [ "-s", "--skip-cap-run" ], :flag,
|
28
|
-
"do everything pulsar does (build a Capfile) but don't run the cap command",
|
29
|
-
:default => false
|
30
|
-
|
31
|
-
parameter "APPLICATION", "the application which you would like to deploy"
|
32
|
-
parameter "ENVIRONMENT", "the environment on which you would like to deploy" do |env|
|
33
|
-
%w(production staging development).include?(env) ? env : raise(ArgumentError)
|
34
|
-
end
|
35
|
-
parameter "[TASKS] ...", "the tasks/args that will be passed to the final `cap` command", :default => "deploy"
|
36
|
-
|
37
|
-
def execute
|
38
|
-
target = "#{application}:#{environment}"
|
39
|
-
|
40
|
-
Bundler.with_clean_env do
|
41
|
-
fetch_repo
|
42
|
-
bundle_install
|
43
|
-
create_capfile
|
44
|
-
build_capfile(target)
|
45
|
-
|
46
|
-
unless skip_cap_run?
|
47
|
-
cap_args = [tasks_list].flatten.join(" ")
|
48
|
-
run_capistrano(cap_args)
|
49
|
-
end
|
50
|
-
|
51
|
-
remove_capfile unless keep_capfile?
|
52
|
-
remove_repo unless keep_repo?
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
data/lib/pulsar/tasks/.gitkeep
DELETED
File without changes
|
@@ -1,52 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Pulsar::CapCommand do
|
4
|
-
let(:pulsar) { Pulsar::CapCommand.new("cap") }
|
5
|
-
|
6
|
-
it "builds a Capfile file in tmp dir" do
|
7
|
-
expect { pulsar.run(full_cap_args + dummy_app) }.to change{ Dir.glob("#{tmp_path}/capfile-*").length }.by(1)
|
8
|
-
end
|
9
|
-
|
10
|
-
it "copies a the repo over to temp directory" do
|
11
|
-
expect { pulsar.run(full_cap_args + %w(--keep-repo) + dummy_app) }.to change{ Dir.glob("#{tmp_path}/conf-repo*").length }.by(1)
|
12
|
-
end
|
13
|
-
|
14
|
-
it "copies a the repo when there is a dir with same name" do
|
15
|
-
system("mkdir #{tmp_path}/conf-repo")
|
16
|
-
expect { pulsar.run(full_cap_args + %w(--keep-repo) + dummy_app) }.to change{ Dir.glob("#{tmp_path}/conf-repo*").length }.by(1)
|
17
|
-
end
|
18
|
-
|
19
|
-
context "--conf-repo option" do
|
20
|
-
it "is required" do
|
21
|
-
expect { pulsar.parse([""]) }.to raise_error(Clamp::UsageError)
|
22
|
-
end
|
23
|
-
|
24
|
-
it "supports directories" do
|
25
|
-
expect { pulsar.run(full_cap_args + dummy_app) }.not_to raise_error(Errno::ENOENT)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
context "--tmp-dir option" do
|
30
|
-
it "is supported" do
|
31
|
-
expect { pulsar.parse(base_args + %w(--tmp-dir dummy_tmp) + dummy_app) }.to_not raise_error(Clamp::UsageError)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
context "--keep-capfile option" do
|
36
|
-
it "is supported" do
|
37
|
-
expect { pulsar.parse(base_args + %w(--keep-capfile) + dummy_app) }.to_not raise_error(Clamp::UsageError)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
context "--skip-cap-run option" do
|
42
|
-
it "is supported" do
|
43
|
-
expect { pulsar.parse(base_args + %w(--skip-cap-run) + dummy_app) }.to_not raise_error(Clamp::UsageError)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
context "--keep-repo option" do
|
48
|
-
it "is supported" do
|
49
|
-
expect { pulsar.parse(base_args + %w(--keep-repo) + dummy_app) }.to_not raise_error(Clamp::UsageError)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
File without changes
|