flombe 0.1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/.gitmodules +3 -0
- data/.rspec +2 -0
- data/Flombefile +9 -0
- data/Gemfile +10 -0
- data/Gemfile.lock +57 -0
- data/LICENSE +20 -0
- data/Rakefile +33 -0
- data/bin/flombe +17 -0
- data/config/rake.rb +38 -0
- data/cookbooks/homebrew/README.rdoc +8 -0
- data/cookbooks/homebrew/metadata.rb +8 -0
- data/cookbooks/homebrew/providers/homebrew.rb +39 -0
- data/cookbooks/homebrew/recipes/default.rb +42 -0
- data/cookbooks/homebrew/resources/homebrew.rb +14 -0
- data/cookbooks/mysql/README.rdoc +8 -0
- data/cookbooks/mysql/metadata.rb +6 -0
- data/cookbooks/mysql/recipes/default.rb +43 -0
- data/cookbooks/mysql/recipes/timezone.rb +10 -0
- data/cookbooks/redis/README.rdoc +8 -0
- data/cookbooks/redis/metadata.rb +6 -0
- data/cookbooks/redis/recipes/2.0.4.rb +24 -0
- data/cookbooks/redis/recipes/default.rb +7 -0
- data/cookbooks/rvm/CHANGELOG.md +19 -0
- data/cookbooks/rvm/README.md +564 -0
- data/cookbooks/rvm/Rakefile +35 -0
- data/cookbooks/rvm/attributes/default.rb +54 -0
- data/cookbooks/rvm/attributes/gem_package.rb +23 -0
- data/cookbooks/rvm/attributes/vagrant.rb +22 -0
- data/cookbooks/rvm/libraries/gem_package_monkeypatch.rb +34 -0
- data/cookbooks/rvm/libraries/helpers.rb +334 -0
- data/cookbooks/rvm/libraries/rvm_rubygems_package.rb +108 -0
- data/cookbooks/rvm/metadata.json +271 -0
- data/cookbooks/rvm/metadata.rb +95 -0
- data/cookbooks/rvm/providers/default_ruby.rb +46 -0
- data/cookbooks/rvm/providers/environment.rb +50 -0
- data/cookbooks/rvm/providers/gemset.rb +135 -0
- data/cookbooks/rvm/providers/global_gem.rb +99 -0
- data/cookbooks/rvm/providers/ruby.rb +100 -0
- data/cookbooks/rvm/providers/shell.rb +68 -0
- data/cookbooks/rvm/providers/wrapper.rb +58 -0
- data/cookbooks/rvm/recipes/default.rb +73 -0
- data/cookbooks/rvm/recipes/gem_package.rb +23 -0
- data/cookbooks/rvm/recipes/system.rb +69 -0
- data/cookbooks/rvm/recipes/user.rb +47 -0
- data/cookbooks/rvm/recipes/vagrant.rb +30 -0
- data/cookbooks/rvm/resources/default_ruby.rb +29 -0
- data/cookbooks/rvm/resources/environment.rb +29 -0
- data/cookbooks/rvm/resources/gem.rb +36 -0
- data/cookbooks/rvm/resources/gemset.rb +30 -0
- data/cookbooks/rvm/resources/global_gem.rb +33 -0
- data/cookbooks/rvm/resources/ruby.rb +29 -0
- data/cookbooks/rvm/resources/shell.rb +40 -0
- data/cookbooks/rvm/resources/wrapper.rb +32 -0
- data/cookbooks/rvm/templates/default/rvmrc.erb +14 -0
- data/cookbooks/rvm/templates/default/vagrant-chef-solo-wrapper.erb +23 -0
- data/cookbooks/utils/README.rdoc +8 -0
- data/cookbooks/utils/metadata.rb +6 -0
- data/cookbooks/utils/recipes/default.rb +10 -0
- data/cookbooks/utils/recipes/dotfiles.rb +21 -0
- data/cookbooks/utils/templates/default/dot.profile.erb +36 -0
- data/flombe.gemspec +28 -0
- data/lib/flombe/dsl.rb +66 -0
- data/lib/flombe.rb +107 -0
- data/spec/dsl_spec.rb +111 -0
- data/spec/flombe_spec.rb +30 -0
- data/spec/quality_spec.rb +11 -0
- data/spec/spec_helper.rb +21 -0
- data/spec/support/helpers.rb +18 -0
- data/spec/support/matchers.rb +9 -0
- data/spec/support/path.rb +21 -0
- data/templates/chef_solo.erb +11 -0
- metadata +154 -0
@@ -0,0 +1,30 @@
|
|
1
|
+
#
|
2
|
+
# Cookbook Name:: rvm
|
3
|
+
# Resource:: gemset
|
4
|
+
#
|
5
|
+
# Author:: Fletcher Nichol <fnichol@nichol.ca>
|
6
|
+
#
|
7
|
+
# Copyright 2011, Fletcher Nichol
|
8
|
+
#
|
9
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
10
|
+
# you may not use this file except in compliance with the License.
|
11
|
+
# You may obtain a copy of the License at
|
12
|
+
#
|
13
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
14
|
+
#
|
15
|
+
# Unless required by applicable law or agreed to in writing, software
|
16
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
17
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
18
|
+
# See the License for the specific language governing permissions and
|
19
|
+
# limitations under the License.
|
20
|
+
#
|
21
|
+
|
22
|
+
actions :create, :delete, :empty, :update
|
23
|
+
|
24
|
+
attribute :gemset, :kind_of => String, :name_attribute => true
|
25
|
+
attribute :ruby_string, :kind_of => String, :regex => /^[^@]+$/
|
26
|
+
|
27
|
+
def initialize(*args)
|
28
|
+
super
|
29
|
+
@action = :create
|
30
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
#
|
2
|
+
# Cookbook Name:: rvm
|
3
|
+
# Resource:: global_gem
|
4
|
+
#
|
5
|
+
# Author:: Fletcher Nichol <fnichol@nichol.ca>
|
6
|
+
#
|
7
|
+
# Copyright 2011, Fletcher Nichol
|
8
|
+
#
|
9
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
10
|
+
# you may not use this file except in compliance with the License.
|
11
|
+
# You may obtain a copy of the License at
|
12
|
+
#
|
13
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
14
|
+
#
|
15
|
+
# Unless required by applicable law or agreed to in writing, software
|
16
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
17
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
18
|
+
# See the License for the specific language governing permissions and
|
19
|
+
# limitations under the License.
|
20
|
+
#
|
21
|
+
|
22
|
+
actions :install, :upgrade, :remove, :purge
|
23
|
+
|
24
|
+
attribute :package_name, :kind_of => String, :name_attribute => true
|
25
|
+
attribute :version, :kind_of => String
|
26
|
+
attribute :source, :kind_of => String
|
27
|
+
attribute :options, :kind_of => Hash
|
28
|
+
attribute :gem_binary, :kind_of => String
|
29
|
+
|
30
|
+
def initialize(*args)
|
31
|
+
super
|
32
|
+
@action = :install
|
33
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
#
|
2
|
+
# Cookbook Name:: rvm
|
3
|
+
# Resource:: ruby
|
4
|
+
#
|
5
|
+
# Author:: Fletcher Nichol <fnichol@nichol.ca>
|
6
|
+
#
|
7
|
+
# Copyright 2011, Fletcher Nichol
|
8
|
+
#
|
9
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
10
|
+
# you may not use this file except in compliance with the License.
|
11
|
+
# You may obtain a copy of the License at
|
12
|
+
#
|
13
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
14
|
+
#
|
15
|
+
# Unless required by applicable law or agreed to in writing, software
|
16
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
17
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
18
|
+
# See the License for the specific language governing permissions and
|
19
|
+
# limitations under the License.
|
20
|
+
#
|
21
|
+
|
22
|
+
actions :install, :uninstall, :remove
|
23
|
+
|
24
|
+
attribute :ruby_string, :kind_of => String, :name_attribute => true
|
25
|
+
|
26
|
+
def initialize(*args)
|
27
|
+
super
|
28
|
+
@action = :install
|
29
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
#
|
2
|
+
# Cookbook Name:: rvm
|
3
|
+
# Resource:: shell
|
4
|
+
#
|
5
|
+
# Author:: Fletcher Nichol <fnichol@nichol.ca>
|
6
|
+
#
|
7
|
+
# Copyright 2011, Fletcher Nichol
|
8
|
+
#
|
9
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
10
|
+
# you may not use this file except in compliance with the License.
|
11
|
+
# You may obtain a copy of the License at
|
12
|
+
#
|
13
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
14
|
+
#
|
15
|
+
# Unless required by applicable law or agreed to in writing, software
|
16
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
17
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
18
|
+
# See the License for the specific language governing permissions and
|
19
|
+
# limitations under the License.
|
20
|
+
#
|
21
|
+
|
22
|
+
actions :run
|
23
|
+
|
24
|
+
attribute :name, :kind_of => String, :name_attribute => true
|
25
|
+
attribute :ruby_string, :kind_of => String, :default => "default"
|
26
|
+
attribute :code, :kind_of => String
|
27
|
+
attribute :creates, :kind_of => String
|
28
|
+
attribute :cwd, :kind_of => String
|
29
|
+
attribute :environment, :kind_of => Hash
|
30
|
+
attribute :group, :kind_of => String
|
31
|
+
attribute :path, :kind_of => Array
|
32
|
+
attribute :returns, :kind_of => Array, :default => [ 0 ]
|
33
|
+
attribute :timeout, :kind_of => Integer
|
34
|
+
attribute :user, :kind_of => String
|
35
|
+
attribute :umask, :kind_of => String
|
36
|
+
|
37
|
+
def initialize(*args)
|
38
|
+
super
|
39
|
+
@action = :run
|
40
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
#
|
2
|
+
# Cookbook Name:: rvm
|
3
|
+
# Resource:: wrapper
|
4
|
+
#
|
5
|
+
# Author:: Fletcher Nichol <fnichol@nichol.ca>
|
6
|
+
#
|
7
|
+
# Copyright 2011, Fletcher Nichol
|
8
|
+
#
|
9
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
10
|
+
# you may not use this file except in compliance with the License.
|
11
|
+
# You may obtain a copy of the License at
|
12
|
+
#
|
13
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
14
|
+
#
|
15
|
+
# Unless required by applicable law or agreed to in writing, software
|
16
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
17
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
18
|
+
# See the License for the specific language governing permissions and
|
19
|
+
# limitations under the License.
|
20
|
+
#
|
21
|
+
|
22
|
+
actions :create
|
23
|
+
|
24
|
+
attribute :prefix, :kind_of => String, :name_attribute => true
|
25
|
+
attribute :ruby_string, :kind_of => String
|
26
|
+
attribute :binary, :kind_of => String
|
27
|
+
attribute :binaries, :kind_of => Array
|
28
|
+
|
29
|
+
def initialize(*args)
|
30
|
+
super
|
31
|
+
@action = :create
|
32
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# rvm configuration
|
2
|
+
#
|
3
|
+
# Generated by Chef for <%= node[:fqdn] %>
|
4
|
+
# Local modifications will be overwritten.
|
5
|
+
#
|
6
|
+
umask g+w
|
7
|
+
export rvm_path="<%= node['rvm']['root_path'] %>"
|
8
|
+
|
9
|
+
<% unless node['rvm']['rvm_gem_options'].empty? -%>
|
10
|
+
export rvm_gem_options="<%= node['rvm']['rvm_gem_options'] %>"
|
11
|
+
<% end -%>
|
12
|
+
<% node['rvm']['rvmrc'].each_pair do |k,v| -%>
|
13
|
+
export <%= k %>=<%= v %>
|
14
|
+
<% end -%>
|
@@ -0,0 +1,23 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
# RVM-aware chef-solo wrapper
|
4
|
+
#
|
5
|
+
# Generated by Chef for <%= node[:fqdn] %>
|
6
|
+
# Local modifications will be overridden
|
7
|
+
|
8
|
+
if [[ -d "<%= node['rvm']['root_path'] %>" ]] ; then
|
9
|
+
export PATH="/bin:<%= node['rvm']['root_path'] %>:$PATH"
|
10
|
+
rvm_path='<%= node['rvm']['root_path'] %>'
|
11
|
+
export rvm_path
|
12
|
+
unset RUBY_VERSION
|
13
|
+
unset GEM_HOME
|
14
|
+
unset GEM_PATH
|
15
|
+
unset MY_RUBY_HOME
|
16
|
+
unset IRBRC
|
17
|
+
rvm_ruby_string='system'
|
18
|
+
export rvm_ruby_string
|
19
|
+
unset rvm_gemset_name
|
20
|
+
unset MAGLEV_HOME
|
21
|
+
fi
|
22
|
+
|
23
|
+
exec <%= node['rvm']['vagrant']['system_chef_solo'] %> "$@"
|
@@ -0,0 +1,21 @@
|
|
1
|
+
#
|
2
|
+
# Cookbook Name:: utils::profile
|
3
|
+
# Recipe:: default
|
4
|
+
#
|
5
|
+
|
6
|
+
template "#{ENV['HOME']}/.flombe.profile" do
|
7
|
+
mode 0700
|
8
|
+
owner ENV['USER']
|
9
|
+
group Etc.getgrgid(Process.gid).name
|
10
|
+
source "dot.profile.erb"
|
11
|
+
variables({ :home => ENV['HOME'] })
|
12
|
+
end
|
13
|
+
|
14
|
+
execute "setup flombe profile sourcing in ~/.bash_profile" do
|
15
|
+
command "echo 'source ~/.flombe.profile' >> ~/.bash_profile"
|
16
|
+
not_if "grep -q 'flombe.profile' ~/.bash_profile"
|
17
|
+
end
|
18
|
+
|
19
|
+
execute "sourcing flombe profile for immediate usage" do
|
20
|
+
command "source ~/.flombe.profile"
|
21
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
export CLICOLOR=1
|
2
|
+
export LSCOLORS=ExFxCxDxBxegedabagacad
|
3
|
+
|
4
|
+
source /usr/local/etc/bash_completion.d/git-completion.bash
|
5
|
+
|
6
|
+
function parse_git_branch {
|
7
|
+
git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/[\1] /'
|
8
|
+
}
|
9
|
+
|
10
|
+
function proml {
|
11
|
+
local BLUE="\[\033[0;34m\]"
|
12
|
+
local RED="\[\033[0;31m\]"
|
13
|
+
local LIGHT_RED="\[\033[1;31m\]"
|
14
|
+
local GREEN="\[\033[0;32m\]"
|
15
|
+
local LIGHT_GREEN="\[\033[1;32m\]"
|
16
|
+
local WHITE="\[\033[1;37m\]"
|
17
|
+
local LIGHT_GRAY="\[\033[0;37m\]"
|
18
|
+
local CYAN="\[\033[0;36m\]"
|
19
|
+
local NO_COLOUR="\[\033[0m\]"
|
20
|
+
case $TERM in
|
21
|
+
xterm*)
|
22
|
+
TITLEBAR='\[\033]0;\u@\h:\w\007\]'
|
23
|
+
;;
|
24
|
+
*)
|
25
|
+
TITLEBAR=""
|
26
|
+
;;
|
27
|
+
esac
|
28
|
+
|
29
|
+
PS1="${TITLEBAR}\
|
30
|
+
$BLUE\$(parse_git_branch)\
|
31
|
+
$NO_COLOUR\h:$CYAN\w\
|
32
|
+
$NO_COLOUR\u\$ "
|
33
|
+
PS2='> '
|
34
|
+
PS4='+ '
|
35
|
+
}
|
36
|
+
proml
|
data/flombe.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
$:.unshift File.expand_path('../lib', __FILE__)
|
2
|
+
require 'rubygems'
|
3
|
+
require 'bundler'
|
4
|
+
require 'flombe'
|
5
|
+
|
6
|
+
Gem::Specification.new do | s |
|
7
|
+
s.name = "flombe"
|
8
|
+
s.version = Flombe::VERSION
|
9
|
+
s.platform = Gem::Platform::RUBY
|
10
|
+
s.extra_rdoc_files = ["LICENSE"]
|
11
|
+
s.summary = "Mac OS X development configurator for multi project shops."
|
12
|
+
s.description = "A mix between the ease of use of Bundler and the super powers of Chef. Configuration management made easy on a per-project basis."
|
13
|
+
s.author = "Stephen Craton"
|
14
|
+
s.email = "stephen@babypips.com"
|
15
|
+
s.homepage = "http://github.com/devpips/flombe"
|
16
|
+
|
17
|
+
bundle = Bundler::Definition.build('Gemfile', 'Gemfile.lock', { })
|
18
|
+
bundle.dependencies.each do | dep |
|
19
|
+
next unless dep.groups.include?(:runtime)
|
20
|
+
s.add_dependency(dep.name)
|
21
|
+
end
|
22
|
+
|
23
|
+
s.bindir = "bin"
|
24
|
+
s.executables = %w( flombe )
|
25
|
+
s.require_path = 'lib'
|
26
|
+
s.files = `git ls-files`.split("\n") + Dir.glob("{cookbooks/rvm}/**/*")
|
27
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
28
|
+
end
|
data/lib/flombe/dsl.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'erubis'
|
2
|
+
|
3
|
+
module Flombe
|
4
|
+
class Dsl
|
5
|
+
CHEF_METHODS = %w(cookbook_path sandbox_path file_cache_path file_backup_path json_attribs log_level log_location verbose_logging node_name node_path solo ssl_verify_mode umask recipe_url cache_type cache_options)
|
6
|
+
BASE_COOKBOOKS = [File.expand_path('../../../cookbooks', __FILE__)]
|
7
|
+
FLOMBE_BASE = "#{ENV['HOME']}/.flombe"
|
8
|
+
|
9
|
+
def self.evaluate(flombefile)
|
10
|
+
builder = new
|
11
|
+
builder.instance_eval(File.open(flombefile, "rb") { |f| f.read }, flombefile.to_s, 1)
|
12
|
+
builder
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
@config = {}
|
17
|
+
@recipes = {}
|
18
|
+
end
|
19
|
+
|
20
|
+
def config
|
21
|
+
cookbooks = @config.delete(:cookbook_path)
|
22
|
+
cookbooks = [cookbooks] if cookbooks.kind_of? String
|
23
|
+
{
|
24
|
+
:file_cache_path => "#{FLOMBE_BASE}/cache",
|
25
|
+
:file_backup_path => "#{FLOMBE_BASE}/backup",
|
26
|
+
:sandbox_path => "#{FLOMBE_BASE}/sandbox",
|
27
|
+
:log_level => :info,
|
28
|
+
:log_location => STDOUT,
|
29
|
+
:cookbook_path => BASE_COOKBOOKS + (cookbooks || []),
|
30
|
+
:cache_options => {:path => "#{FLOMBE_BASE}/cache/checksums", :skip_expires => true}
|
31
|
+
}.merge!(@config)
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_dna
|
35
|
+
{
|
36
|
+
:recipes => @recipes.keys
|
37
|
+
}.merge!(@recipes).to_json
|
38
|
+
end
|
39
|
+
|
40
|
+
def to_solo_config
|
41
|
+
template = File.open(File.expand_path('../../../templates/chef_solo.erb', __FILE__), "r") { |f| f.read }
|
42
|
+
Erubis::Eruby.new(template).result(:config => config)
|
43
|
+
end
|
44
|
+
|
45
|
+
CHEF_METHODS.each do |method|
|
46
|
+
define_method method do |*args|
|
47
|
+
@config[method.to_sym] = args.pop
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def recipe(name, *args)
|
52
|
+
options = Hash === args.last ? args.pop : {}
|
53
|
+
@recipes[name.to_sym] = options
|
54
|
+
end
|
55
|
+
|
56
|
+
def rubies(rubies, *args)
|
57
|
+
@recipes[:rvm] = {} unless @recipes.has_key?(:rvm)
|
58
|
+
|
59
|
+
rubies = [rubies] if rubies.is_a? String
|
60
|
+
@recipes[:rvm][:rubies] = rubies
|
61
|
+
|
62
|
+
options = Hash === args.last ? args.pop : {}
|
63
|
+
@recipes[:rvm][:default_ruby] = options[:default] unless options[:default].nil?
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/lib/flombe.rb
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
$:.unshift File.expand_path('..', __FILE__)
|
2
|
+
|
3
|
+
require "etc"
|
4
|
+
require "tmpdir"
|
5
|
+
require "json"
|
6
|
+
|
7
|
+
module Flombe
|
8
|
+
VERSION = "0.1.0.2"
|
9
|
+
|
10
|
+
autoload :Dsl, 'flombe/dsl'
|
11
|
+
|
12
|
+
class FlombeError < Exception ; end
|
13
|
+
class MissingXCodeError < FlombeError ; end
|
14
|
+
class BadMacOSXVersionError < FlombeError ; end
|
15
|
+
class NoFlombefileError < FlombeError ; end
|
16
|
+
class RunningAsRootError < FlombeError ; end
|
17
|
+
|
18
|
+
class Runner
|
19
|
+
RECOMMENDED_LLVM = 2206
|
20
|
+
|
21
|
+
def self.run
|
22
|
+
new.run
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.warn(msg)
|
26
|
+
$stderr.puts "\033[0;31m\033[1m==> \033[0m\033[1m" + msg + "\033[0m"
|
27
|
+
end
|
28
|
+
|
29
|
+
def run
|
30
|
+
raise BadMacOSXVersionError, "You must have Snow Leopard for Flombe. Sorry bro." unless macosx?
|
31
|
+
raise MissingXCodeError, "You must have xcode installed to run Flombe." unless xcode?
|
32
|
+
raise NoFlombefileError, "There is no Flombefile here: #{Dir.pwd}" unless flombefile?
|
33
|
+
raise RunningAsRootError, "Please do not run this command as root." if root?
|
34
|
+
|
35
|
+
if `/usr/bin/xcode-select -print-path` + `/usr/bin/llvm-gcc-4.2 -v 2>&1` =~ /LLVM build (\d{4,})/
|
36
|
+
if $1.to_i < RECOMMENDED_LLVM
|
37
|
+
warn "You should really upgrade your xcode install for best performance."
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
run_chef
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def xcode?
|
47
|
+
!`/usr/bin/xcode-select -print-path`.chomp.empty?
|
48
|
+
end
|
49
|
+
|
50
|
+
def macosx?
|
51
|
+
macosx_version >= 10.6
|
52
|
+
end
|
53
|
+
|
54
|
+
def flombefile?
|
55
|
+
File.exist?(flombefile)
|
56
|
+
end
|
57
|
+
|
58
|
+
def macosx_version
|
59
|
+
/(10\.\d+)(\.\d+)?/.match(`/usr/bin/sw_vers -productVersion`.chomp).captures.first.to_f
|
60
|
+
end
|
61
|
+
|
62
|
+
def root?
|
63
|
+
Etc.getpwuid.uid == 0
|
64
|
+
end
|
65
|
+
|
66
|
+
def run_chef
|
67
|
+
system("chef-solo -j #{dna} -c #{config}")
|
68
|
+
exit($?.to_i)
|
69
|
+
end
|
70
|
+
|
71
|
+
def sane_xcode_version?
|
72
|
+
xcode_path = `/usr/bin/xcode-select -print-path`.chomp
|
73
|
+
if xcode_path.empty?
|
74
|
+
false
|
75
|
+
elsif `#{xcode_path}/usr/bin/llvm-gcc-4.2 -v 2>&1` =~ /LLVM build (\d{4,})/
|
76
|
+
if $1.to_i < RECOMMENDED_LLVM
|
77
|
+
warn "You should really upgrade your xcode install"
|
78
|
+
end
|
79
|
+
true
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def flombefile
|
84
|
+
@flombefile ||= File.expand_path(File.join(Dir.pwd, "Flombefile"))
|
85
|
+
end
|
86
|
+
|
87
|
+
def flombe_definition
|
88
|
+
@flombe ||= Flombe::Dsl.evaluate(flombefile)
|
89
|
+
end
|
90
|
+
|
91
|
+
def config
|
92
|
+
config_file = File.expand_path(File.join(Dir.tmpdir, "solo.rb"))
|
93
|
+
File.open(config_file, "w") do |fp|
|
94
|
+
fp.write( flombe_definition.to_solo_config )
|
95
|
+
end
|
96
|
+
config_file
|
97
|
+
end
|
98
|
+
|
99
|
+
def dna
|
100
|
+
dna_file = File.expand_path(File.join(Dir.tmpdir, "dna.json"))
|
101
|
+
File.open(dna_file, "w") do |fp|
|
102
|
+
fp.write( flombe_definition.to_dna )
|
103
|
+
end
|
104
|
+
dna_file
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
data/spec/dsl_spec.rb
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Flombe::Dsl do
|
4
|
+
let(:file) do
|
5
|
+
flombefile <<-G
|
6
|
+
recipe "homebrew"
|
7
|
+
G
|
8
|
+
end
|
9
|
+
let(:flombe) { Flombe::Dsl.evaluate(@file || file) }
|
10
|
+
let(:dna) { JSON.parse(flombe.to_dna) }
|
11
|
+
let(:config) { flombe.config }
|
12
|
+
|
13
|
+
describe "recipes" do
|
14
|
+
it "should add to the list of recipes" do
|
15
|
+
dna['recipes'].should == ['homebrew']
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "solo.rb configuration" do
|
20
|
+
context "it should let me call chef-solo methods" do
|
21
|
+
Flombe::Dsl::CHEF_METHODS.each do |method|
|
22
|
+
it "can set #{method}" do
|
23
|
+
flombe.send(method, "test")
|
24
|
+
flombe.config[method.to_sym].should == "test"
|
25
|
+
end unless method == "cookbook_path" # we'll test cookbook_path specifically later on
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should provide a set of defaults for the solo config" do
|
30
|
+
config[:file_cache_path].should be
|
31
|
+
config[:cookbook_path].should be
|
32
|
+
config[:log_level].should be
|
33
|
+
config[:log_location].should be
|
34
|
+
config[:cache_options].should be
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should allow overriding of config defaults" do
|
38
|
+
@file = flombefile <<-G
|
39
|
+
log_level :info
|
40
|
+
G
|
41
|
+
config[:log_level].should == :info
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "cookbook paths" do
|
46
|
+
let(:default_cookbook) { File.expand_path('../../cookbooks', __FILE__) }
|
47
|
+
|
48
|
+
it "should include the flombe cookbooks by default" do
|
49
|
+
config[:cookbook_path].should == [default_cookbook]
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should include the flobme cookbooks even if custom ones are set" do
|
53
|
+
flombe.send(:cookbook_path, "~/my/cookbooks")
|
54
|
+
flombe.config[:cookbook_path].should == [default_cookbook, "~/my/cookbooks"]
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should allow me to specify multiple cookbook paths" do
|
58
|
+
@file = flombefile <<-G
|
59
|
+
cookbook_path ["~/my/cookbooks", "./local/cookbooks"]
|
60
|
+
G
|
61
|
+
config[:cookbook_path].should == [default_cookbook, "~/my/cookbooks", "./local/cookbooks"]
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "recipe config" do
|
66
|
+
it "should store extra params as config options" do
|
67
|
+
@file = flombefile <<-G
|
68
|
+
recipe "mysql", :root_password => 'qit13R', :tmp_path => '/tmp'
|
69
|
+
G
|
70
|
+
dna['mysql'].should == { "root_password" => "qit13R", "tmp_path" => "/tmp" }
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "rvm rubies" do
|
75
|
+
let(:file) do
|
76
|
+
flombefile <<-G
|
77
|
+
rubies 'ruby-1.9.2-p180'
|
78
|
+
G
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should add a ruby intepreter to a list" do
|
82
|
+
dna['rvm']['rubies'].should == ['ruby-1.9.2-p180']
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should add the rvm recipe" do
|
86
|
+
dna['recipes'].should include('rvm')
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should not add the RVM recipe twice" do
|
90
|
+
@file = flombefile <<-G
|
91
|
+
recipe "rvm"
|
92
|
+
rubies 'ruby-1.9.2-p180'
|
93
|
+
G
|
94
|
+
dna['recipes'].should == ['rvm']
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should add multiple rubies to a list" do
|
98
|
+
@file = flombefile <<-G
|
99
|
+
rubies ['ruby-1.9.2-p180', 'ruby-1.8.7']
|
100
|
+
G
|
101
|
+
dna['rvm']['rubies'].should == ['ruby-1.9.2-p180', 'ruby-1.8.7']
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should let me define a default ruby" do
|
105
|
+
@file = flombefile <<-G
|
106
|
+
rubies ['ruby-1.9.2-p180', 'ruby-1.8.7'], :default => 'ruby-1.9.2-p180'
|
107
|
+
G
|
108
|
+
dna['rvm']['default_ruby'].should == 'ruby-1.9.2-p180'
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
data/spec/flombe_spec.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Flombe do
|
4
|
+
let(:runner) { Flombe::Runner.new }
|
5
|
+
|
6
|
+
it "should detect if xcode is missing" do
|
7
|
+
runner.stub!(:xcode?).and_return(false)
|
8
|
+
lambda { runner.run }.should raise_error(Flombe::MissingXCodeError)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should detect Mac OS X verson" do
|
12
|
+
runner.stub!(:macosx_version).and_return(10.5)
|
13
|
+
lambda { runner.run }.should raise_error(Flombe::BadMacOSXVersionError)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should detect that a Flombefile does not exist" do
|
17
|
+
runner.stub!(:flombefile?).and_return(false)
|
18
|
+
lambda { runner.run }.should raise_error(Flombe::NoFlombefileError)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should detect if it's trying to be run as root" do
|
22
|
+
runner.stub!(:root?).and_return(true)
|
23
|
+
lambda { runner.run }.should raise_error(Flombe::RunningAsRootError)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should run chef-solo" do
|
27
|
+
runner.should_receive(:run_chef)
|
28
|
+
runner.run
|
29
|
+
end
|
30
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
$:.unshift File.expand_path('..', __FILE__)
|
2
|
+
$:.unshift File.expand_path('../../lib', __FILE__)
|
3
|
+
|
4
|
+
require 'fileutils'
|
5
|
+
require 'rubygems'
|
6
|
+
require 'bundler'
|
7
|
+
require 'rspec'
|
8
|
+
|
9
|
+
require 'flombe'
|
10
|
+
|
11
|
+
Dir["#{File.expand_path('../support', __FILE__)}/*.rb"].each do |file|
|
12
|
+
require file
|
13
|
+
end
|
14
|
+
|
15
|
+
# RSpec::Rubygems.setup
|
16
|
+
|
17
|
+
RSpec.configure do |config|
|
18
|
+
config.include RSpec::Matchers
|
19
|
+
config.include RSpec::Helpers
|
20
|
+
config.include RSpec::Paths
|
21
|
+
end
|