bowler 0.0.1
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/README.md +3 -0
- data/Rakefile +18 -0
- data/bin/bowl +5 -0
- data/lib/bowler/cli.rb +35 -0
- data/lib/bowler/dependency_tree.rb +30 -0
- data/lib/bowler/dsl.rb +52 -0
- data/lib/bowler/version.rb +3 -0
- data/lib/bowler.rb +11 -0
- data/spec/dependency_tree_spec.rb +50 -0
- data/spec/dsl_spec.rb +71 -0
- data/spec/fixtures/dependency_tree_pinfile +5 -0
- data/spec/fixtures/dsl_invalid_pinfile +3 -0
- data/spec/fixtures/dsl_valid_pinfile +4 -0
- data/spec/helpers/definition_helper.rb +19 -0
- metadata +105 -0
data/README.md
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require "bundler/gem_tasks"
|
4
|
+
require "rdoc/task"
|
5
|
+
require 'rspec/core/rake_task'
|
6
|
+
|
7
|
+
RDoc::Task.new do |rd|
|
8
|
+
rd.rdoc_files.include("lib/**/*.rb")
|
9
|
+
rd.rdoc_dir = "rdoc"
|
10
|
+
end
|
11
|
+
|
12
|
+
desc "Run specs"
|
13
|
+
RSpec::Core::RakeTask.new do |t|
|
14
|
+
t.pattern = "./spec/**/*_spec.rb" # don't need this, it's default.
|
15
|
+
# Put spec opts in a file named .rspec in root
|
16
|
+
end
|
17
|
+
|
18
|
+
task :default => :spec
|
data/bin/bowl
ADDED
data/lib/bowler/cli.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'logger'
|
2
|
+
|
3
|
+
module Bowler
|
4
|
+
class CLI
|
5
|
+
|
6
|
+
def self.start(processes)
|
7
|
+
tree = Bowler::DependencyTree.load
|
8
|
+
process_list = processes.map(&:to_sym)
|
9
|
+
|
10
|
+
launch_string = tree.process_list_for(process_list)
|
11
|
+
|
12
|
+
logger.info "Starting #{tree.dependencies_for(process_list).join(', ')}.."
|
13
|
+
|
14
|
+
start_foreman_with launch_string
|
15
|
+
rescue PinfileNotFound
|
16
|
+
logger.error "Bowler could not find a Pinfile in the current directory."
|
17
|
+
rescue PinfileError => e
|
18
|
+
logger.error "Bowler could not load the Pinfile due to an error: #{e}"
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.logger
|
22
|
+
@logger ||= Logger.new(STDOUT)
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.build_command(launch_string)
|
26
|
+
"foreman start -c #{launch_string}"
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
def self.start_foreman_with(launch_string)
|
31
|
+
exec ( self.build_command launch_string )
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Bowler
|
2
|
+
|
3
|
+
class DependencyTree
|
4
|
+
|
5
|
+
# Load the Pinfile
|
6
|
+
def self.load(absolute_path = nil)
|
7
|
+
absolute_path ||= File.join( Dir.pwd, 'Pinfile' )
|
8
|
+
definition = DSL.evaluate(absolute_path)
|
9
|
+
self.new(definition)
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(definition)
|
13
|
+
@definition = definition
|
14
|
+
end
|
15
|
+
|
16
|
+
def dependencies_for(processes)
|
17
|
+
processes.inject([]) do |array, p|
|
18
|
+
array += [ (@definition.tree[p] || []), p ].flatten
|
19
|
+
end.uniq
|
20
|
+
end
|
21
|
+
|
22
|
+
def process_list_for(processes)
|
23
|
+
on = dependencies_for(processes)
|
24
|
+
off = @definition.processes.reject {|i| on.include? i }
|
25
|
+
|
26
|
+
[ on.map {|x| "#{x}=1" }, off.map {|x| "#{x}=0" } ].flatten.sort.join(',')
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
data/lib/bowler/dsl.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
module Bowler
|
2
|
+
class DSL
|
3
|
+
attr_reader :processes, :global_dependencies
|
4
|
+
|
5
|
+
def self.evaluate(pinfile)
|
6
|
+
dsl = new
|
7
|
+
dsl.eval_pinfile(pinfile)
|
8
|
+
dsl.to_definition
|
9
|
+
end
|
10
|
+
|
11
|
+
def eval_pinfile(pinfile)
|
12
|
+
raise PinfileNotFound unless File.exists?(pinfile)
|
13
|
+
file = File.read(pinfile)
|
14
|
+
instance_eval( file )
|
15
|
+
rescue SyntaxError => e
|
16
|
+
raise PinfileError, e
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize
|
20
|
+
@processes = []
|
21
|
+
@global_dependencies = []
|
22
|
+
@specified_dependencies = []
|
23
|
+
end
|
24
|
+
|
25
|
+
def dependency(*dependencies)
|
26
|
+
@global_dependencies += [dependencies].flatten
|
27
|
+
end
|
28
|
+
|
29
|
+
def process(params)
|
30
|
+
if params.is_a? Hash
|
31
|
+
parent = params.keys.first
|
32
|
+
dependencies = [params.values.first]
|
33
|
+
|
34
|
+
@processes << { :process => parent, :dependencies => [dependencies].flatten }
|
35
|
+
@specified_dependencies += dependencies.flatten
|
36
|
+
else
|
37
|
+
@processes << { :process => params, :dependencies => [ ] }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def to_definition
|
42
|
+
definition = {
|
43
|
+
:tree => @processes.each_with_object({}) {|p, hash|
|
44
|
+
hash[p[:process]] = (p[:dependencies] + @global_dependencies).uniq
|
45
|
+
},
|
46
|
+
:processes => (@processes.map {|x| x[:process]} + @global_dependencies + @specified_dependencies).uniq
|
47
|
+
}
|
48
|
+
OpenStruct.new(definition)
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
data/lib/bowler.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'bowler'
|
2
|
+
require_relative 'helpers/definition_helper'
|
3
|
+
|
4
|
+
module Bowler
|
5
|
+
|
6
|
+
describe DependencyTree do
|
7
|
+
|
8
|
+
include DefinitionHelper
|
9
|
+
|
10
|
+
context "given a Pinfile" do
|
11
|
+
it "should load a dependency tree" do
|
12
|
+
tree = DependencyTree.load File.join( File.dirname(__FILE__), 'fixtures', 'dependency_tree_pinfile' )
|
13
|
+
|
14
|
+
tree.should be_instance_of DependencyTree
|
15
|
+
tree.dependencies_for([:foo]).should =~ [:bar, :foo, :required]
|
16
|
+
tree.dependencies_for([:nyan]).should =~ [:bar, :foo, :nyan, :required]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context "given an array of one process" do
|
21
|
+
before do
|
22
|
+
@tree = DependencyTree.new stub_definition
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should find the correct dependencies" do
|
26
|
+
@tree.dependencies_for([:app1]).should =~ [:app2, :app3, :app1]
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should give a correct process list" do
|
30
|
+
@tree.process_list_for([:app2]).should == "a=0,app1=0,app2=1,app3=1,b=0,c=0,other=0"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context "given an array of multiple processes" do
|
35
|
+
before do
|
36
|
+
@tree = DependencyTree.new stub_definition
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should find the correct dependencies" do
|
40
|
+
@tree.dependencies_for([:app1, :other]).should =~ [:app2, :app3, :app1, :a, :b, :c, :other]
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should give a correct process list" do
|
44
|
+
@tree.process_list_for([:app2, :other]).should == "a=1,app1=0,app2=1,app3=1,b=1,c=1,other=1"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
data/spec/dsl_spec.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'bowler'
|
2
|
+
|
3
|
+
module Bowler
|
4
|
+
|
5
|
+
describe DSL do
|
6
|
+
|
7
|
+
include DefinitionHelper
|
8
|
+
|
9
|
+
context "given a valid pinfile" do
|
10
|
+
it "should return a valid definition" do
|
11
|
+
path_to_pinfile = File.join( File.dirname(__FILE__), 'fixtures', 'dsl_valid_pinfile' )
|
12
|
+
definition = DSL.evaluate path_to_pinfile
|
13
|
+
|
14
|
+
definition.should be_instance_of OpenStruct
|
15
|
+
definition.tree.should == {
|
16
|
+
:app => [ :database, :tiles, :templates ],
|
17
|
+
:tiles => [ :database, :templates ]
|
18
|
+
}
|
19
|
+
definition.processes.should =~ [ :app, :database, :templates, :tiles ]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "given an invalid pinfile" do
|
24
|
+
it "should raise a gem-defined exception" do
|
25
|
+
path_to_pinfile = File.join( File.dirname(__FILE__), 'fixtures', 'dsl_invalid_pinfile' )
|
26
|
+
expect do
|
27
|
+
DSL.evaluate path_to_pinfile
|
28
|
+
end.to raise_error(PinfileError)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context "given a process" do
|
33
|
+
before do
|
34
|
+
@dsl = DSL.new
|
35
|
+
@dsl.process :test
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should update the processes list with the specified process" do
|
39
|
+
@dsl.processes.should == [{ :process => :test, :dependencies => [] }]
|
40
|
+
@dsl.to_definition.processes.should == [ :test ]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context "given a process with dependencies" do
|
45
|
+
before do
|
46
|
+
@dsl = DSL.new
|
47
|
+
@dsl.process :test => [ :dependency1, :dependency2 ]
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should update the processes list with all specified processes" do
|
51
|
+
@dsl.processes.should == [{ :process => :test, :dependencies => [:dependency1, :dependency2] }]
|
52
|
+
@dsl.to_definition.processes.should =~ [ :dependency1, :dependency2, :test ]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context "given global dependencies" do
|
57
|
+
before do
|
58
|
+
@dsl = DSL.new
|
59
|
+
@dsl.dependency :global1, :global2
|
60
|
+
@dsl.dependency :global3
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should update the processes list with all specified processes" do
|
64
|
+
@dsl.global_dependencies.should =~ [:global1, :global2, :global3]
|
65
|
+
@dsl.to_definition.processes.should =~ [ :global1, :global2, :global3 ]
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Bowler
|
2
|
+
module DefinitionHelper
|
3
|
+
|
4
|
+
require 'ostruct'
|
5
|
+
|
6
|
+
def stub_definition
|
7
|
+
OpenStruct.new ({
|
8
|
+
:processes => [ :app1, :app2, :app3, :other, :a, :b, :c ],
|
9
|
+
:tree => {
|
10
|
+
:app1 => [ :app2, :app3 ],
|
11
|
+
:app2 => [ :app3 ],
|
12
|
+
:app3 => [ ],
|
13
|
+
:other => [ :a, :b, :c ]
|
14
|
+
}
|
15
|
+
})
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
metadata
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bowler
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Jordan Hatch
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-03-16 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: foreman
|
16
|
+
requirement: &70276368515620 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70276368515620
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rake
|
27
|
+
requirement: &70276368514980 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 0.9.2.2
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70276368514980
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: rspec
|
38
|
+
requirement: &70276368514300 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 2.8.0
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70276368514300
|
47
|
+
description:
|
48
|
+
email:
|
49
|
+
- jordan@jordanh.net
|
50
|
+
executables:
|
51
|
+
- bowl
|
52
|
+
extensions: []
|
53
|
+
extra_rdoc_files: []
|
54
|
+
files:
|
55
|
+
- lib/bowler/cli.rb
|
56
|
+
- lib/bowler/dependency_tree.rb
|
57
|
+
- lib/bowler/dsl.rb
|
58
|
+
- lib/bowler/version.rb
|
59
|
+
- lib/bowler.rb
|
60
|
+
- README.md
|
61
|
+
- Rakefile
|
62
|
+
- spec/dependency_tree_spec.rb
|
63
|
+
- spec/dsl_spec.rb
|
64
|
+
- spec/fixtures/dependency_tree_pinfile
|
65
|
+
- spec/fixtures/dsl_invalid_pinfile
|
66
|
+
- spec/fixtures/dsl_valid_pinfile
|
67
|
+
- spec/helpers/definition_helper.rb
|
68
|
+
- bin/bowl
|
69
|
+
homepage:
|
70
|
+
licenses: []
|
71
|
+
post_install_message:
|
72
|
+
rdoc_options: []
|
73
|
+
require_paths:
|
74
|
+
- lib
|
75
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
76
|
+
none: false
|
77
|
+
requirements:
|
78
|
+
- - ! '>='
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '0'
|
81
|
+
segments:
|
82
|
+
- 0
|
83
|
+
hash: 1393360155367898551
|
84
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
86
|
+
requirements:
|
87
|
+
- - ! '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
segments:
|
91
|
+
- 0
|
92
|
+
hash: 1393360155367898551
|
93
|
+
requirements: []
|
94
|
+
rubyforge_project:
|
95
|
+
rubygems_version: 1.8.12
|
96
|
+
signing_key:
|
97
|
+
specification_version: 3
|
98
|
+
summary: A wrapper for large Foreman-managed apps with dependent processes
|
99
|
+
test_files:
|
100
|
+
- spec/dependency_tree_spec.rb
|
101
|
+
- spec/dsl_spec.rb
|
102
|
+
- spec/fixtures/dependency_tree_pinfile
|
103
|
+
- spec/fixtures/dsl_invalid_pinfile
|
104
|
+
- spec/fixtures/dsl_valid_pinfile
|
105
|
+
- spec/helpers/definition_helper.rb
|