borg-rb 0.0.3 → 0.0.4
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.
- checksums.yaml +8 -8
- data/CHANGELOG.md +4 -3
- data/README.md +4 -2
- data/bin/borg +1 -1
- data/lib/borg/cli/applications.rb +7 -12
- data/lib/borg/configuration/applications.rb +8 -0
- data/lib/borg/configuration/stages.rb +17 -7
- data/lib/borg/version.rb +1 -1
- data/spec/acceptance/application_spec.rb +116 -0
- data/spec/acceptance/stage_spec.rb +31 -0
- data/spec/support/isolated_environment.rb +38 -21
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
OWZmNWNmZDM1M2Y1YzdlNGIwNzQ4ZmJlNGI0NTVlMTMyODAyMTNiYw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
OTU4ZDg4MTQ3NjlkYjkyZTFhMWJmNTdhOTI2MWYyNWRmZDRmMzZlNA==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MTJjNmY1MjVhMTEzY2RlNWE5ZmI0ZTVlYWQ1OGE1OWFkMWM0ZjU5ZDZkOTRj
|
10
|
+
ZmFhNzY5ODE4MjBhNTQ3MTkwOWMzNjk0OGY1YjM4MDE5NWIzYjJmNTY1ZWEz
|
11
|
+
ZDRmMjkyM2IwZDcyZGYzYzA5MWYzNDEyZmU3MGE0NzhiNDcxNjQ=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NjA5ZDBhMGU2ZmI0ODkwNTI0ZjI0OGU4YzlmNmQyMDc3ZjFhMTUxODBlMGUy
|
14
|
+
MmFmOTc5ZjE1ZjljZjA0MTIwOWIwOGE2ZTJiMTY4ZTVlYzg4YWM0ZDYwYTc5
|
15
|
+
Mzk2OWQ1ZmU2YWIzYWEzZWNmMjZlN2I0YzY0NTgyZjA4NDhjNzI=
|
data/CHANGELOG.md
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
-
##
|
1
|
+
## HEAD
|
2
2
|
|
3
|
-
## 0.0.
|
3
|
+
## 0.0.4 / 3-22-2013
|
4
4
|
|
5
5
|
* Fix load problem in Capfile in generated skeleton (0.0.2)
|
6
|
-
* Change load borg-rb to a require
|
6
|
+
* Change load borg-rb to a require (0.0.3)
|
7
|
+
* Allow access to `application` and `stage` in an application configuration by creating a capistrano variable for them
|
7
8
|
|
8
9
|
|
9
10
|
## 0.0.1 / 3-21-2013
|
data/README.md
CHANGED
@@ -67,11 +67,11 @@ Borg provides a application and stage config setup.
|
|
67
67
|
One can define applications with the format.
|
68
68
|
``` ruby
|
69
69
|
application :app_name do
|
70
|
-
do things needed to setup the application environment.
|
70
|
+
# do things needed to setup the application environment.
|
71
71
|
end
|
72
72
|
|
73
73
|
stage :app_name, :stage_name do
|
74
|
-
do things for specific stage for the applications.
|
74
|
+
# do things for specific stage for the applications.
|
75
75
|
end
|
76
76
|
```
|
77
77
|
|
@@ -90,3 +90,5 @@ to be load and the deploy task be run against all of them.
|
|
90
90
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
91
91
|
4. Push to the branch (`git push origin my-new-feature`)
|
92
92
|
5. Create new Pull Request
|
93
|
+
|
94
|
+
Ruby Style Guidelines: We like this one https://github.com/styleguide/ruby
|
data/bin/borg
CHANGED
@@ -13,6 +13,6 @@ require 'borg/server/base'
|
|
13
13
|
require 'borg/servers/base'
|
14
14
|
|
15
15
|
# Ensure ruby 1.9.X
|
16
|
-
raise "Ruby 1.9.X required" unless RUBY_VERSION =~ /^1\.9\.\d$/
|
16
|
+
raise "Ruby 1.9.X required" unless RUBY_VERSION =~ /^1\.9\.\d$/ || RUBY_VERSION =~ /^2\.0\.\d$/
|
17
17
|
|
18
18
|
Capistrano::CLI.execute
|
@@ -6,12 +6,10 @@ module Borg
|
|
6
6
|
base.send :alias_method, :execute_requested_actions, :execute_requested_actions_with_applications
|
7
7
|
end
|
8
8
|
|
9
|
+
# TODO: documentation for `options`, where does it come from?
|
9
10
|
def execute_requested_actions_with_applications(config)
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
separate_actions_and_applications config
|
14
|
-
|
11
|
+
load_applications(config)
|
12
|
+
separate_actions_and_applications(config)
|
15
13
|
if options[:applications].empty? or Thread.current[:borg_application]
|
16
14
|
Thread.current[:borg_application].load_into config if Thread.current[:borg_application]
|
17
15
|
execute_requested_actions_without_applications(config)
|
@@ -26,17 +24,14 @@ module Borg
|
|
26
24
|
|
27
25
|
private
|
28
26
|
|
29
|
-
def load_applications
|
30
|
-
# load applications
|
27
|
+
def load_applications(config)
|
31
28
|
unless @apps_loaded
|
32
|
-
Dir["./cap/applications/**/*.rb"].each
|
33
|
-
config.load file
|
34
|
-
end
|
29
|
+
Dir["./cap/applications/**/*.rb"].each { |file| config.load(file) }
|
35
30
|
@apps_loaded = true
|
36
31
|
end
|
37
32
|
end
|
38
33
|
|
39
|
-
def separate_actions_and_applications
|
34
|
+
def separate_actions_and_applications(config)
|
40
35
|
options[:applications] = []
|
41
36
|
found_non_application = false
|
42
37
|
options[:actions] = Array(options[:actions]).keep_if do |action|
|
@@ -63,4 +58,4 @@ module Borg
|
|
63
58
|
end
|
64
59
|
end
|
65
60
|
|
66
|
-
Capistrano::CLI.send
|
61
|
+
Capistrano::CLI.send(:include, Borg::CLI::Applications)
|
@@ -39,6 +39,14 @@ module Borg
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def load_into config
|
42
|
+
if config.respond_to?(:application)
|
43
|
+
# Undefine the stage method now that the app:stage config is created
|
44
|
+
config_metaclass = class << config; self; end
|
45
|
+
config_metaclass.send(:undef_method, 'application')
|
46
|
+
|
47
|
+
# Create a capistrano variable for stage
|
48
|
+
config.instance_exec(@name, &(lambda { |name| set :application, name }))
|
49
|
+
end
|
42
50
|
@execution_blocks.each {|blk| config.load &blk}
|
43
51
|
end
|
44
52
|
end
|
@@ -1,8 +1,7 @@
|
|
1
1
|
module Borg
|
2
2
|
module Configuration
|
3
3
|
module Stages
|
4
|
-
|
5
|
-
def stage (app, name, &block)
|
4
|
+
def stage(app, name, &block)
|
6
5
|
app = app.to_sym
|
7
6
|
name = name.to_sym
|
8
7
|
application app unless @applications[app]
|
@@ -20,23 +19,34 @@ module Borg
|
|
20
19
|
class Stage
|
21
20
|
attr_accessor :execution_blocks
|
22
21
|
attr_accessor :parent
|
22
|
+
|
23
|
+
# TODO: We might want to name this differently
|
23
24
|
def name
|
24
25
|
"#{parent.name}:#{@name}"
|
25
26
|
end
|
26
27
|
|
27
|
-
def initialize
|
28
|
+
def initialize(name, parent)
|
28
29
|
@execution_blocks = []
|
29
30
|
@name = name
|
30
31
|
@parent = parent
|
31
32
|
end
|
32
33
|
|
33
|
-
def load_into
|
34
|
-
|
35
|
-
|
34
|
+
def load_into(config)
|
35
|
+
if config.respond_to?(:stage)
|
36
|
+
# Undefine the stage method now that the app:stage config is created
|
37
|
+
config_metaclass = class << config; self; end
|
38
|
+
config_metaclass.send(:undef_method, 'stage')
|
39
|
+
|
40
|
+
# Create a capistrano variable for stage
|
41
|
+
config.instance_exec(@name, &(lambda { |name| set :stage, name }))
|
42
|
+
end
|
43
|
+
|
44
|
+
parent.load_into(config)
|
45
|
+
@execution_blocks.each { |blk| config.load(&blk) }
|
36
46
|
end
|
37
47
|
end
|
38
48
|
end
|
39
49
|
end
|
40
50
|
end
|
41
51
|
|
42
|
-
Capistrano::Configuration.send
|
52
|
+
Capistrano::Configuration.send(:include, Borg::Configuration::Stages)
|
data/lib/borg/version.rb
CHANGED
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'borg app:stage task' do
|
4
|
+
include_context 'acceptance'
|
5
|
+
|
6
|
+
# TODO: probably want to have some factory that generates what we want in an app config to DRY this out
|
7
|
+
let(:basic_app_config) {
|
8
|
+
<<-RUBY
|
9
|
+
application :app do
|
10
|
+
task :some_task do
|
11
|
+
end
|
12
|
+
end
|
13
|
+
RUBY
|
14
|
+
}
|
15
|
+
|
16
|
+
let(:app_config_with_stages) {
|
17
|
+
<<-RUBY
|
18
|
+
application :app do
|
19
|
+
task :common_task do
|
20
|
+
end
|
21
|
+
end
|
22
|
+
stage :app, :prd do
|
23
|
+
task :prd_task do
|
24
|
+
end
|
25
|
+
end
|
26
|
+
stage :app, :stg do
|
27
|
+
task :stg_task do
|
28
|
+
end
|
29
|
+
end
|
30
|
+
RUBY
|
31
|
+
}
|
32
|
+
|
33
|
+
let(:app_config_with_display_app_task) {
|
34
|
+
<<-RUBY
|
35
|
+
application :app do
|
36
|
+
task :display_app do
|
37
|
+
puts "The application is set to: \#{application}"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
RUBY
|
41
|
+
}
|
42
|
+
|
43
|
+
let(:app_config_with_stage_with_display_app_task) {
|
44
|
+
<<-RUBY
|
45
|
+
stage :app, :prd do
|
46
|
+
task :display_app do
|
47
|
+
puts "The application is set to: \#{application}"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
RUBY
|
51
|
+
}
|
52
|
+
|
53
|
+
before do
|
54
|
+
assert_execute('borgify')
|
55
|
+
end
|
56
|
+
|
57
|
+
context "app with no stages" do
|
58
|
+
before do
|
59
|
+
environment.create_file('cap/applications/app.rb', basic_app_config)
|
60
|
+
end
|
61
|
+
|
62
|
+
it "allows us to run tasks for that app" do
|
63
|
+
# a task defined for the app
|
64
|
+
assert_execute('borg', 'app', 'some_task')
|
65
|
+
|
66
|
+
# an undefined task
|
67
|
+
expect(execute('borg', 'app', 'undefined_task')).to_not succeed
|
68
|
+
|
69
|
+
# an undefined app
|
70
|
+
expect(execute('borg', 'undefined_app', 'some_task')).to_not succeed
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context "app with stages: prd, stg" do
|
75
|
+
before do
|
76
|
+
environment.create_file('cap/applications/app.rb', app_config_with_stages)
|
77
|
+
end
|
78
|
+
|
79
|
+
it "allows us to set common/stage-specific tasks" do
|
80
|
+
# commonly defined tasks
|
81
|
+
assert_execute('borg', 'app:prd', 'common_task')
|
82
|
+
assert_execute('borg', 'app:stg', 'common_task')
|
83
|
+
|
84
|
+
# stage specific tasks in their respective stages
|
85
|
+
assert_execute('borg', 'app:prd', 'prd_task')
|
86
|
+
assert_execute('borg', 'app:stg', 'stg_task')
|
87
|
+
|
88
|
+
# stage specific tasks in other stages
|
89
|
+
expect(execute('borg', 'app:stg', 'prd_task')).to_not succeed
|
90
|
+
expect(execute('borg', 'app:prd', 'stg_task')).to_not succeed
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
context 'app with a task `display_app` which prints `application`' do
|
95
|
+
before do
|
96
|
+
environment.create_file('cap/applications/app.rb', app_config_with_display_app_task)
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'the task prints `app`' do
|
100
|
+
result = execute('borg', 'app', 'display_app')
|
101
|
+
expect(result.stdout).to match(/The application is set to: app/)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
context 'app with stages: prd, and a task `display_app` which prints `application`' do
|
106
|
+
before do
|
107
|
+
environment.create_file('cap/applications/app.rb', app_config_with_stage_with_display_app_task)
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'the task prints `app`' do
|
111
|
+
result = execute('borg', 'app:prd', 'display_app')
|
112
|
+
expect(result.stdout).to match(/The application is set to: app/)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'borg app:stage task' do
|
4
|
+
include_context 'acceptance'
|
5
|
+
|
6
|
+
let(:stage_test_config) {
|
7
|
+
<<-RUBY
|
8
|
+
stage :app, :prd do
|
9
|
+
task :display_stage do
|
10
|
+
puts "The stage is set to: \#{stage}"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
RUBY
|
14
|
+
}
|
15
|
+
|
16
|
+
before do
|
17
|
+
assert_execute('borgify')
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'app with stages: prd, and a task `display_stage` which prints `stage`' do
|
21
|
+
before do
|
22
|
+
environment.create_file('cap/applications/app.rb', stage_test_config)
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'the task prints `prd`' do
|
26
|
+
result = execute('borg', 'app:prd', 'display_stage')
|
27
|
+
expect(result.stdout).to match(/The stage is set to: prd/)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -3,8 +3,7 @@ require "pathname"
|
|
3
3
|
require "childprocess"
|
4
4
|
|
5
5
|
module Support
|
6
|
-
# This class creates a temporary directory to act as the working directory
|
7
|
-
#
|
6
|
+
# This class creates a temporary directory to act as the working directory for our tests
|
8
7
|
# Modified from: https://github.com/mitchellh/vagrant/blob/master/spec/support/isolated_environment.rb
|
9
8
|
class IsolatedEnvironment
|
10
9
|
ROOT_DIR = Pathname.new(File.expand_path("../../", __FILE__))
|
@@ -12,24 +11,12 @@ module Support
|
|
12
11
|
attr_reader :workdir, :workdir_path
|
13
12
|
|
14
13
|
def initialize
|
15
|
-
# Create a temporary directory for our work
|
16
14
|
@workdir = TempDir.new("borg")
|
17
|
-
@workdir_path = Pathname.new(
|
18
|
-
# puts "Initialize isolated environment: #{@workdir_path.to_s}"
|
19
|
-
end
|
20
|
-
|
21
|
-
# Copies a skeleton into this isolated environment. This is useful
|
22
|
-
# for testing environments that require a complex setup.
|
23
|
-
#
|
24
|
-
# @param [String] name Name of the skeleton in the root directory.
|
25
|
-
def skeleton!(name)
|
26
|
-
# Copy all the files into the home directory
|
27
|
-
source = Dir.glob(ROOT_DIR.join(name).join("*").to_s)
|
28
|
-
FileUtils.cp_r(source, @workdir.to_s)
|
15
|
+
@workdir_path = Pathname.new(@workdir.path)
|
29
16
|
end
|
30
17
|
|
31
18
|
# Executes a command in the context of this isolated environment.
|
32
|
-
# Any command executed will therefore see our
|
19
|
+
# Any command executed will therefore see our working directory
|
33
20
|
# as the home directory.
|
34
21
|
def execute(command, *argN)
|
35
22
|
# Determine the options
|
@@ -42,17 +29,47 @@ module Support
|
|
42
29
|
# Add the options to be passed on
|
43
30
|
argN << options
|
44
31
|
|
45
|
-
# Execute
|
46
|
-
# puts("Executing: #{[command].concat(argN).inspect}")
|
32
|
+
# Execute
|
47
33
|
Support::Subprocess.execute(command, *argN) do |type, data|
|
48
34
|
yield type, data if block_given?
|
49
35
|
end
|
50
36
|
end
|
51
37
|
|
52
|
-
#
|
38
|
+
# Remove everything created in the environment
|
53
39
|
def close
|
54
|
-
|
55
|
-
|
40
|
+
FileUtils.rm_rf(@workdir_path)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Creates a new file in the isolated environment
|
44
|
+
#
|
45
|
+
# @param [String] filename Name of destination file's path relative to the isolated environment's root
|
46
|
+
# @param [String] content The stuff
|
47
|
+
def create_file(filename, content)
|
48
|
+
Dir.chdir(@workdir_path) do
|
49
|
+
FileUtils.mkdir_p(File.dirname(filename)) unless File.directory?(File.dirname(filename))
|
50
|
+
File.open(filename, "w") { |file| file.write(content) }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Copies a directory into this isolated environment.
|
55
|
+
#
|
56
|
+
# @param [String] src_dir Name of the source directory's path relative to the root directory.
|
57
|
+
# @param [String] dest_dir Name of path relative to the isolated environment's root
|
58
|
+
def copy_dir(src_dir, dest_dir = "/")
|
59
|
+
# Copy all the files into the home directory
|
60
|
+
source = Dir.glob(ROOT_DIR.join(name).join("*").to_s)
|
61
|
+
FileUtils.cp_r(source, @workdir_path.to_s)
|
62
|
+
end
|
63
|
+
|
64
|
+
# Copies a file into this isolated environment.
|
65
|
+
#
|
66
|
+
# @param [String] src_file Name of the source file's path relative to the root directory.
|
67
|
+
# @param [String] dest_file Name of destination file's path relative to the isolated environment's root
|
68
|
+
def copy_file(src_file, dest_file)
|
69
|
+
Dir.chdir(@workdir_path) do
|
70
|
+
FileUtils.mkdir_p(File.dirname(dest_file)) unless File.directory?(File.dirname(dest_file))
|
71
|
+
FileUtils.cp(ROOT_DIR.join(src_file), dest_file)
|
72
|
+
end
|
56
73
|
end
|
57
74
|
end
|
58
75
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: borg-rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Identified
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-03-
|
11
|
+
date: 2013-03-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: capistrano
|
@@ -135,8 +135,10 @@ files:
|
|
135
135
|
- skeleton/cap/recipes/.gitkeep
|
136
136
|
- skeleton/lib/.gitkeep
|
137
137
|
- skeleton/mygem.gemspec.skeleton
|
138
|
+
- spec/acceptance/application_spec.rb
|
138
139
|
- spec/acceptance/borgify_plugin_spec.rb
|
139
140
|
- spec/acceptance/borgify_spec.rb
|
141
|
+
- spec/acceptance/stage_spec.rb
|
140
142
|
- spec/lib/borg/cli/applications_spec.rb
|
141
143
|
- spec/lib/borg/configuration/applications_spec.rb
|
142
144
|
- spec/lib/borg/configuration/assimilator_spec.rb
|
@@ -173,8 +175,10 @@ signing_key:
|
|
173
175
|
specification_version: 4
|
174
176
|
summary: Ruby-based software provisioning and deployment framework
|
175
177
|
test_files:
|
178
|
+
- spec/acceptance/application_spec.rb
|
176
179
|
- spec/acceptance/borgify_plugin_spec.rb
|
177
180
|
- spec/acceptance/borgify_spec.rb
|
181
|
+
- spec/acceptance/stage_spec.rb
|
178
182
|
- spec/lib/borg/cli/applications_spec.rb
|
179
183
|
- spec/lib/borg/configuration/applications_spec.rb
|
180
184
|
- spec/lib/borg/configuration/assimilator_spec.rb
|