soloist 0.9.7 → 1.0.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- data/.rspec +2 -0
- data/.rvmrc +1 -1
- data/.travis.yml +1 -0
- data/Gemfile +0 -4
- data/Gemfile.lock +56 -19
- data/Guardfile +12 -0
- data/README.markdown +107 -113
- data/bin/soloist +3 -25
- data/lib/soloist/cli.rb +83 -0
- data/lib/soloist/config.rb +50 -0
- data/lib/soloist/royal_crown.rb +56 -0
- data/lib/soloist/spotlight.rb +41 -0
- data/lib/soloist/version.rb +1 -1
- data/lib/soloist.rb +2 -11
- data/script/ci.sh +3 -0
- data/soloist.gemspec +15 -5
- data/spec/lib/soloist/cli_spec.rb +133 -0
- data/spec/lib/soloist/config_spec.rb +107 -0
- data/spec/lib/soloist/royal_crown_spec.rb +54 -0
- data/spec/lib/soloist/spotlight_spec.rb +67 -0
- data/spec/spec_helper.rb +5 -8
- metadata +167 -18
- data/Rakefile +0 -10
- data/lib/soloist/chef_config_generator.rb +0 -80
- data/lib/soloist/cookbook_gem_linker.rb +0 -54
- data/lib/soloist/util.rb +0 -42
- data/spec/chef_config_generator_spec.rb +0 -252
- data/spec/cookbook_gem_linker_spec.rb +0 -64
- data/spec/pivotal_workstation_cookbook.rb +0 -6
- data/spec/util_spec.rb +0 -19
data/soloist.gemspec
CHANGED
@@ -6,11 +6,11 @@ Gem::Specification.new do |s|
|
|
6
6
|
s.name = "soloist"
|
7
7
|
s.version = Soloist::VERSION
|
8
8
|
s.platform = Gem::Platform::RUBY
|
9
|
-
s.authors = ["Matthew Kocher"]
|
10
|
-
s.email = ["kocher@gmail.com"]
|
9
|
+
s.authors = ["Matthew Kocher", "Doc Ritezel"]
|
10
|
+
s.email = ["kocher@gmail.com", "ritezel@gmail.com"]
|
11
11
|
s.homepage = "http://github.com/mkocher/soloist"
|
12
|
-
s.summary =
|
13
|
-
s.description =
|
12
|
+
s.summary = "Soloist is a simple way of running chef-solo"
|
13
|
+
s.description = "Makes running chef-solo easy."
|
14
14
|
|
15
15
|
s.rubyforge_project = "soloist"
|
16
16
|
|
@@ -20,4 +20,14 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.require_paths = ["lib"]
|
21
21
|
|
22
22
|
s.add_dependency "chef"
|
23
|
-
|
23
|
+
s.add_dependency "librarian"
|
24
|
+
s.add_dependency "thor"
|
25
|
+
s.add_dependency "hashie"
|
26
|
+
|
27
|
+
s.add_development_dependency "rspec"
|
28
|
+
s.add_development_dependency "guard-rspec"
|
29
|
+
s.add_development_dependency "guard-bundler"
|
30
|
+
s.add_development_dependency "rb-fsevent"
|
31
|
+
s.add_development_dependency "terminal-notifier-guard"
|
32
|
+
s.add_development_dependency "gem-release"
|
33
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Soloist::CLI do
|
4
|
+
let(:cli) { Soloist::CLI.new }
|
5
|
+
let(:base_path) { Dir.mktmpdir }
|
6
|
+
let(:soloistrc_path) { File.expand_path("soloistrc", base_path) }
|
7
|
+
|
8
|
+
before { FileUtils.mkdir_p(base_path) }
|
9
|
+
|
10
|
+
describe "#chef" do
|
11
|
+
context "when the soloistrc file does not exist" do
|
12
|
+
it "raises an error" do
|
13
|
+
expect do
|
14
|
+
begin
|
15
|
+
Dir.chdir(base_path) { cli.chef }
|
16
|
+
rescue Soloist::NotFound => e
|
17
|
+
e.message.should == "Could not find soloistrc or .soloistrc"
|
18
|
+
raise
|
19
|
+
end
|
20
|
+
end.to raise_error(Soloist::NotFound)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "when the soloistrc file exists" do
|
25
|
+
before do
|
26
|
+
File.open(soloistrc_path, "w") do |file|
|
27
|
+
file.write(YAML.dump("recipes" => ["stinky::feet"]))
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
it "runs the proper recipes" do
|
32
|
+
cli.stub(:exec)
|
33
|
+
Dir.chdir(base_path) { cli.chef }
|
34
|
+
cli.config.royal_crown.recipes.should =~ ["stinky::feet"]
|
35
|
+
end
|
36
|
+
|
37
|
+
context "when the Cheffile does not exist" do
|
38
|
+
it "runs chef" do
|
39
|
+
cli.should_receive(:exec)
|
40
|
+
Dir.chdir(base_path) { cli.chef }
|
41
|
+
end
|
42
|
+
|
43
|
+
it "does not run librarian" do
|
44
|
+
cli.stub(:exec)
|
45
|
+
Librarian::Chef::Cli.should_not_receive(:with_environment)
|
46
|
+
Dir.chdir(base_path) { cli.chef }
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context "when the Cheffile exists" do
|
51
|
+
let(:cli_instance) { double(:cli_instance) }
|
52
|
+
|
53
|
+
before do
|
54
|
+
FileUtils.touch(File.expand_path("Cheffile", base_path))
|
55
|
+
cli.stub(:exec)
|
56
|
+
end
|
57
|
+
|
58
|
+
it "runs librarian" do
|
59
|
+
Librarian::Chef::Cli.should_receive(:with_environment).and_yield
|
60
|
+
Librarian::Chef::Cli.should_receive(:new).and_return(cli_instance)
|
61
|
+
cli_instance.should_receive(:install)
|
62
|
+
Dir.chdir(base_path) { cli.chef }
|
63
|
+
end
|
64
|
+
|
65
|
+
it "runs chef" do
|
66
|
+
cli.should_receive(:exec)
|
67
|
+
Dir.chdir(base_path) { cli.chef }
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe "#DO_IT_LIVE" do
|
74
|
+
context "when the soloistrc does not exist" do
|
75
|
+
it "raises an error" do
|
76
|
+
expect do
|
77
|
+
Dir.chdir(base_path) { cli.DO_IT_LIVE("pineapple::wut") }
|
78
|
+
end.to raise_error(Soloist::NotFound)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context "when the soloistrc file exists" do
|
83
|
+
before do
|
84
|
+
File.open(soloistrc_path, "w") do |file|
|
85
|
+
file.write(YAML.dump("recipes" => ["pineapple::wutcake"]))
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
it "sets a recipe to run" do
|
90
|
+
Dir.chdir(base_path) do
|
91
|
+
cli.should_receive(:chef)
|
92
|
+
cli.DO_IT_LIVE("angst::teenage", "ennui::default")
|
93
|
+
cli.config.royal_crown.recipes.should =~ ["angst::teenage", "ennui::default"]
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe "#ensure_chef_cache_path" do
|
100
|
+
context "when the cache path does not exist" do
|
101
|
+
before { File.stub(:directory? => false) }
|
102
|
+
|
103
|
+
it "creates the cache path" do
|
104
|
+
cli.should_receive(:system).with("sudo mkdir -p /var/chef/cache")
|
105
|
+
cli.ensure_chef_cache_path
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
context "when the cache path exists" do
|
110
|
+
before { File.stub(:directory? => true) }
|
111
|
+
|
112
|
+
it "does not create the cache path" do
|
113
|
+
cli.should_not_receive(:system)
|
114
|
+
cli.ensure_chef_cache_path
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
describe "#chef_solo" do
|
120
|
+
before do
|
121
|
+
ENV["AUTREYISM"] = "pathological-yodeling"
|
122
|
+
FileUtils.touch(File.expand_path("soloistrc", base_path))
|
123
|
+
end
|
124
|
+
|
125
|
+
it "receives the outside environment" do
|
126
|
+
cli.stub(:chef_solo).and_return('echo $AUTREYISM')
|
127
|
+
cli.should_receive(:exec) do |chef_solo|
|
128
|
+
`#{chef_solo}`.chomp.should == "pathological-yodeling"
|
129
|
+
end
|
130
|
+
Dir.chdir(base_path) { cli.chef }
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Soloist::Config do
|
4
|
+
let(:soloist_rc) { Soloist::RoyalCrown.new(:path => "/tmp/soloist/soloistrc") }
|
5
|
+
let(:config) { Soloist::Config.new(soloist_rc) }
|
6
|
+
|
7
|
+
describe "#as_solo_rb" do
|
8
|
+
context "without extra cookbook paths" do
|
9
|
+
it "can generate solo.rb" do
|
10
|
+
config.as_solo_rb.should == 'cookbook_path ["/tmp/soloist/cookbooks"]'
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
context "with a cookbook path" do
|
15
|
+
before { soloist_rc.cookbook_paths = ["/opt/holla/at/yo/soloist"] }
|
16
|
+
|
17
|
+
it "can have multiple cookbook paths" do
|
18
|
+
config.as_solo_rb.should == 'cookbook_path ["/tmp/soloist/cookbooks", "/opt/holla/at/yo/soloist"]'
|
19
|
+
end
|
20
|
+
|
21
|
+
it "removes duplicate cookbook paths" do
|
22
|
+
expect do
|
23
|
+
soloist_rc.cookbook_paths << "/opt/holla/at/yo/soloist"
|
24
|
+
end.not_to change { config.as_solo_rb }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "with relative paths" do
|
29
|
+
let(:pwd) { File.expand_path(".") }
|
30
|
+
|
31
|
+
before { soloist_rc.cookbook_paths << "./meth/cookbooks" }
|
32
|
+
|
33
|
+
it "can have multiple cookbook paths" do
|
34
|
+
config.as_solo_rb.should == 'cookbook_path ["/tmp/soloist/cookbooks", "/tmp/soloist/meth/cookbooks"]'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context "with unixisms in the cookbook path" do
|
39
|
+
let(:home) { File.expand_path("~") }
|
40
|
+
|
41
|
+
before { soloist_rc.cookbook_paths << "~/yo/homes" }
|
42
|
+
|
43
|
+
it "expands paths" do
|
44
|
+
config.as_solo_rb.should include "#{home}/yo/homes"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "#as_json" do
|
50
|
+
context "with recipes" do
|
51
|
+
before { soloist_rc.recipes = ["waffles"] }
|
52
|
+
|
53
|
+
it "can generate json" do
|
54
|
+
config.as_json["recipes"].should include "waffles"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "#compiled_rc" do
|
60
|
+
let(:switch) { {"OX_TONGUES" => {"FINE" => {"recipes" => ["hobo_fist"]}}} }
|
61
|
+
|
62
|
+
before do
|
63
|
+
soloist_rc.env_variable_switches = switch
|
64
|
+
end
|
65
|
+
|
66
|
+
context "when a switch is active" do
|
67
|
+
before { ENV.stub(:[]).and_return("FINE") }
|
68
|
+
|
69
|
+
it "merges the environment variable switch" do
|
70
|
+
config.compiled_rc.recipes.should include "hobo_fist"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context "when a switch is inactive" do
|
75
|
+
before { ENV.stub(:[]).and_return("WHAT_NO_EW") }
|
76
|
+
|
77
|
+
it "outputs an empty list" do
|
78
|
+
config.compiled_rc.recipes.should be_empty
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context "when switches are nested" do
|
83
|
+
let(:inner) { {"GOAT" => {"TASTY" => {"node_attributes" => {"bbq" => "satan"}}}} }
|
84
|
+
let(:outer) { {"recipes" => ["stinkditch"], "env_variable_switches" => inner} }
|
85
|
+
|
86
|
+
before { ENV.stub(:[]).and_return("TASTY") }
|
87
|
+
|
88
|
+
context "when the inner switch is active" do
|
89
|
+
let(:switch) { {"HORSE" => {"TASTY" => outer }} }
|
90
|
+
|
91
|
+
it "evalutes all switches" do
|
92
|
+
config.compiled_rc.node_attributes.bbq.should == "satan"
|
93
|
+
config.compiled_rc.recipes.should == ["stinkditch"]
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
context "when the outer switch is inactive" do
|
98
|
+
let(:switch) { {"HORSE" => {"GROSS" => outer }} }
|
99
|
+
|
100
|
+
it "does not evaluate deeper" do
|
101
|
+
config.compiled_rc.recipes.should be_empty
|
102
|
+
config.compiled_rc.node_attributes.should be_empty
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Soloist::RoyalCrown do
|
4
|
+
let(:contents) { { "recipes" => ["broken_vim"] } }
|
5
|
+
let(:tempfile) do
|
6
|
+
Tempfile.new("soloist-royalcrown").tap do |file|
|
7
|
+
file.write(YAML.dump(contents))
|
8
|
+
file.close
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:royal_crown) { Soloist::RoyalCrown.from_file(tempfile.path) }
|
13
|
+
|
14
|
+
describe ".from_file" do
|
15
|
+
context "when the rc file is empty" do
|
16
|
+
let(:tempfile) do
|
17
|
+
Tempfile.new("soloist-royalcrown").tap do |file|
|
18
|
+
file.close
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
it "loads an empty file" do
|
23
|
+
expect { royal_crown }.not_to raise_error
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
it "loads from a yaml file" do
|
28
|
+
royal_crown.recipes.should =~ ["broken_vim"]
|
29
|
+
end
|
30
|
+
|
31
|
+
it "defaults nil fields to an empty primitive" do
|
32
|
+
royal_crown.node_attributes.should == {}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "#save" do
|
37
|
+
it "writes the values to a file" do
|
38
|
+
royal_crown.recipes = ["hot_rats", "tissue_paper"]
|
39
|
+
royal_crown.save
|
40
|
+
royal_crown = Soloist::RoyalCrown.from_file(tempfile.path)
|
41
|
+
royal_crown.recipes.should =~ ["hot_rats", "tissue_paper"]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "#to_yaml" do
|
46
|
+
it "skips the path attribute" do
|
47
|
+
royal_crown.to_yaml.keys.should_not include "path"
|
48
|
+
end
|
49
|
+
|
50
|
+
it "nils out fields that have not been set" do
|
51
|
+
royal_crown.to_yaml["node_attributes"].should be_nil
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Soloist::Spotlight do
|
4
|
+
let(:tempdir) { Dir.mktmpdir }
|
5
|
+
let(:shallow_path) { File.expand_path("beans/roger", tempdir) }
|
6
|
+
let(:spotlight) { Soloist::Spotlight.new(shallow_path) }
|
7
|
+
|
8
|
+
before { FileUtils.mkdir_p(shallow_path) }
|
9
|
+
|
10
|
+
describe "#find" do
|
11
|
+
context "with non-existent files" do
|
12
|
+
it "raises an error with three files" do
|
13
|
+
expect do
|
14
|
+
begin
|
15
|
+
spotlight.find!("larry", "moe", "curly")
|
16
|
+
rescue Soloist::NotFound => e
|
17
|
+
e.message.should == "Could not find larry, moe or curly"
|
18
|
+
raise
|
19
|
+
end
|
20
|
+
end.to raise_error(Soloist::NotFound)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "raises an error with two files" do
|
24
|
+
expect do
|
25
|
+
begin
|
26
|
+
spotlight.find!("lulz", "wut")
|
27
|
+
rescue Soloist::NotFound => e
|
28
|
+
e.message.should == "Could not find lulz or wut"
|
29
|
+
raise
|
30
|
+
end
|
31
|
+
end.to raise_error(Soloist::NotFound)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "raises an error with one file" do
|
35
|
+
expect do
|
36
|
+
begin
|
37
|
+
spotlight.find!("whatever.dude")
|
38
|
+
rescue Soloist::NotFound => e
|
39
|
+
e.message.should == "Could not find whatever.dude"
|
40
|
+
raise
|
41
|
+
end
|
42
|
+
end.to raise_error(Soloist::NotFound)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context "when the file exists" do
|
47
|
+
let(:file_path) { File.expand_path("soloistrc", shallow_path) }
|
48
|
+
|
49
|
+
before { FileUtils.touch(file_path) }
|
50
|
+
|
51
|
+
it "finds a soloistrc in the current directory" do
|
52
|
+
spotlight.find("soloistrc").to_s.should == tempdir + "/beans/roger/soloistrc"
|
53
|
+
end
|
54
|
+
|
55
|
+
context "inside a deeper directory" do
|
56
|
+
let(:deep_path) { File.expand_path("meat/hi", shallow_path) }
|
57
|
+
let(:spotlight) { Soloist::Spotlight.new(deep_path) }
|
58
|
+
|
59
|
+
before { FileUtils.mkdir_p(deep_path) }
|
60
|
+
|
61
|
+
it "finds a soloistrc upwards" do
|
62
|
+
spotlight.find("soloistrc").to_s.should == file_path
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,9 +1,6 @@
|
|
1
|
-
|
2
|
-
require File.dirname(__FILE__) + '/../lib/soloist'
|
1
|
+
$: << File.expand_path("../../lib", __FILE__)
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
Gem.stub(:searcher).and_return(mock({:find => mock_gemspec}))
|
9
|
-
end
|
3
|
+
require "soloist"
|
4
|
+
require "tempfile"
|
5
|
+
require "json"
|
6
|
+
require "tmpdir"
|
metadata
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: soloist
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 1.0.0.pre
|
5
|
+
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Matthew Kocher
|
9
|
+
- Doc Ritezel
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date: 2012-
|
13
|
+
date: 2012-11-12 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
16
|
name: chef
|
@@ -27,34 +28,182 @@ dependencies:
|
|
27
28
|
- - ! '>='
|
28
29
|
- !ruby/object:Gem::Version
|
29
30
|
version: '0'
|
30
|
-
|
31
|
+
- !ruby/object:Gem::Dependency
|
32
|
+
name: librarian
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
type: :runtime
|
40
|
+
prerelease: false
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: thor
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: hashie
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
type: :runtime
|
72
|
+
prerelease: false
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
- !ruby/object:Gem::Dependency
|
80
|
+
name: rspec
|
81
|
+
requirement: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
type: :development
|
88
|
+
prerelease: false
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: guard-rspec
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
98
|
+
none: false
|
99
|
+
requirements:
|
100
|
+
- - ! '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
type: :development
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
107
|
+
requirements:
|
108
|
+
- - ! '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: guard-bundler
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - ! '>='
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
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'
|
127
|
+
- !ruby/object:Gem::Dependency
|
128
|
+
name: rb-fsevent
|
129
|
+
requirement: !ruby/object:Gem::Requirement
|
130
|
+
none: false
|
131
|
+
requirements:
|
132
|
+
- - ! '>='
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: '0'
|
135
|
+
type: :development
|
136
|
+
prerelease: false
|
137
|
+
version_requirements: !ruby/object:Gem::Requirement
|
138
|
+
none: false
|
139
|
+
requirements:
|
140
|
+
- - ! '>='
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: '0'
|
143
|
+
- !ruby/object:Gem::Dependency
|
144
|
+
name: terminal-notifier-guard
|
145
|
+
requirement: !ruby/object:Gem::Requirement
|
146
|
+
none: false
|
147
|
+
requirements:
|
148
|
+
- - ! '>='
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
version: '0'
|
151
|
+
type: :development
|
152
|
+
prerelease: false
|
153
|
+
version_requirements: !ruby/object:Gem::Requirement
|
154
|
+
none: false
|
155
|
+
requirements:
|
156
|
+
- - ! '>='
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: '0'
|
159
|
+
- !ruby/object:Gem::Dependency
|
160
|
+
name: gem-release
|
161
|
+
requirement: !ruby/object:Gem::Requirement
|
162
|
+
none: false
|
163
|
+
requirements:
|
164
|
+
- - ! '>='
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
type: :development
|
168
|
+
prerelease: false
|
169
|
+
version_requirements: !ruby/object:Gem::Requirement
|
170
|
+
none: false
|
171
|
+
requirements:
|
172
|
+
- - ! '>='
|
173
|
+
- !ruby/object:Gem::Version
|
174
|
+
version: '0'
|
175
|
+
description: Makes running chef-solo easy.
|
31
176
|
email:
|
32
177
|
- kocher@gmail.com
|
178
|
+
- ritezel@gmail.com
|
33
179
|
executables:
|
34
180
|
- soloist
|
35
181
|
extensions: []
|
36
182
|
extra_rdoc_files: []
|
37
183
|
files:
|
38
184
|
- .gitignore
|
185
|
+
- .rspec
|
39
186
|
- .rvmrc
|
40
187
|
- .travis.yml
|
41
188
|
- Gemfile
|
42
189
|
- Gemfile.lock
|
190
|
+
- Guardfile
|
43
191
|
- MIT-LICENSE
|
44
192
|
- README.markdown
|
45
|
-
- Rakefile
|
46
193
|
- bin/soloist
|
47
194
|
- lib/soloist.rb
|
48
|
-
- lib/soloist/
|
49
|
-
- lib/soloist/
|
50
|
-
- lib/soloist/
|
195
|
+
- lib/soloist/cli.rb
|
196
|
+
- lib/soloist/config.rb
|
197
|
+
- lib/soloist/royal_crown.rb
|
198
|
+
- lib/soloist/spotlight.rb
|
51
199
|
- lib/soloist/version.rb
|
200
|
+
- script/ci.sh
|
52
201
|
- soloist.gemspec
|
53
|
-
- spec/
|
54
|
-
- spec/
|
55
|
-
- spec/
|
202
|
+
- spec/lib/soloist/cli_spec.rb
|
203
|
+
- spec/lib/soloist/config_spec.rb
|
204
|
+
- spec/lib/soloist/royal_crown_spec.rb
|
205
|
+
- spec/lib/soloist/spotlight_spec.rb
|
56
206
|
- spec/spec_helper.rb
|
57
|
-
- spec/util_spec.rb
|
58
207
|
homepage: http://github.com/mkocher/soloist
|
59
208
|
licenses: []
|
60
209
|
post_install_message:
|
@@ -70,9 +219,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
70
219
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
71
220
|
none: false
|
72
221
|
requirements:
|
73
|
-
- - ! '
|
222
|
+
- - ! '>'
|
74
223
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
224
|
+
version: 1.3.1
|
76
225
|
requirements: []
|
77
226
|
rubyforge_project: soloist
|
78
227
|
rubygems_version: 1.8.24
|
@@ -80,8 +229,8 @@ signing_key:
|
|
80
229
|
specification_version: 3
|
81
230
|
summary: Soloist is a simple way of running chef-solo
|
82
231
|
test_files:
|
83
|
-
- spec/
|
84
|
-
- spec/
|
85
|
-
- spec/
|
232
|
+
- spec/lib/soloist/cli_spec.rb
|
233
|
+
- spec/lib/soloist/config_spec.rb
|
234
|
+
- spec/lib/soloist/royal_crown_spec.rb
|
235
|
+
- spec/lib/soloist/spotlight_spec.rb
|
86
236
|
- spec/spec_helper.rb
|
87
|
-
- spec/util_spec.rb
|