flombe 0.1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. data/.gitignore +4 -0
  2. data/.gitmodules +3 -0
  3. data/.rspec +2 -0
  4. data/Flombefile +9 -0
  5. data/Gemfile +10 -0
  6. data/Gemfile.lock +57 -0
  7. data/LICENSE +20 -0
  8. data/Rakefile +33 -0
  9. data/bin/flombe +17 -0
  10. data/config/rake.rb +38 -0
  11. data/cookbooks/homebrew/README.rdoc +8 -0
  12. data/cookbooks/homebrew/metadata.rb +8 -0
  13. data/cookbooks/homebrew/providers/homebrew.rb +39 -0
  14. data/cookbooks/homebrew/recipes/default.rb +42 -0
  15. data/cookbooks/homebrew/resources/homebrew.rb +14 -0
  16. data/cookbooks/mysql/README.rdoc +8 -0
  17. data/cookbooks/mysql/metadata.rb +6 -0
  18. data/cookbooks/mysql/recipes/default.rb +43 -0
  19. data/cookbooks/mysql/recipes/timezone.rb +10 -0
  20. data/cookbooks/redis/README.rdoc +8 -0
  21. data/cookbooks/redis/metadata.rb +6 -0
  22. data/cookbooks/redis/recipes/2.0.4.rb +24 -0
  23. data/cookbooks/redis/recipes/default.rb +7 -0
  24. data/cookbooks/rvm/CHANGELOG.md +19 -0
  25. data/cookbooks/rvm/README.md +564 -0
  26. data/cookbooks/rvm/Rakefile +35 -0
  27. data/cookbooks/rvm/attributes/default.rb +54 -0
  28. data/cookbooks/rvm/attributes/gem_package.rb +23 -0
  29. data/cookbooks/rvm/attributes/vagrant.rb +22 -0
  30. data/cookbooks/rvm/libraries/gem_package_monkeypatch.rb +34 -0
  31. data/cookbooks/rvm/libraries/helpers.rb +334 -0
  32. data/cookbooks/rvm/libraries/rvm_rubygems_package.rb +108 -0
  33. data/cookbooks/rvm/metadata.json +271 -0
  34. data/cookbooks/rvm/metadata.rb +95 -0
  35. data/cookbooks/rvm/providers/default_ruby.rb +46 -0
  36. data/cookbooks/rvm/providers/environment.rb +50 -0
  37. data/cookbooks/rvm/providers/gemset.rb +135 -0
  38. data/cookbooks/rvm/providers/global_gem.rb +99 -0
  39. data/cookbooks/rvm/providers/ruby.rb +100 -0
  40. data/cookbooks/rvm/providers/shell.rb +68 -0
  41. data/cookbooks/rvm/providers/wrapper.rb +58 -0
  42. data/cookbooks/rvm/recipes/default.rb +73 -0
  43. data/cookbooks/rvm/recipes/gem_package.rb +23 -0
  44. data/cookbooks/rvm/recipes/system.rb +69 -0
  45. data/cookbooks/rvm/recipes/user.rb +47 -0
  46. data/cookbooks/rvm/recipes/vagrant.rb +30 -0
  47. data/cookbooks/rvm/resources/default_ruby.rb +29 -0
  48. data/cookbooks/rvm/resources/environment.rb +29 -0
  49. data/cookbooks/rvm/resources/gem.rb +36 -0
  50. data/cookbooks/rvm/resources/gemset.rb +30 -0
  51. data/cookbooks/rvm/resources/global_gem.rb +33 -0
  52. data/cookbooks/rvm/resources/ruby.rb +29 -0
  53. data/cookbooks/rvm/resources/shell.rb +40 -0
  54. data/cookbooks/rvm/resources/wrapper.rb +32 -0
  55. data/cookbooks/rvm/templates/default/rvmrc.erb +14 -0
  56. data/cookbooks/rvm/templates/default/vagrant-chef-solo-wrapper.erb +23 -0
  57. data/cookbooks/utils/README.rdoc +8 -0
  58. data/cookbooks/utils/metadata.rb +6 -0
  59. data/cookbooks/utils/recipes/default.rb +10 -0
  60. data/cookbooks/utils/recipes/dotfiles.rb +21 -0
  61. data/cookbooks/utils/templates/default/dot.profile.erb +36 -0
  62. data/flombe.gemspec +28 -0
  63. data/lib/flombe/dsl.rb +66 -0
  64. data/lib/flombe.rb +107 -0
  65. data/spec/dsl_spec.rb +111 -0
  66. data/spec/flombe_spec.rb +30 -0
  67. data/spec/quality_spec.rb +11 -0
  68. data/spec/spec_helper.rb +21 -0
  69. data/spec/support/helpers.rb +18 -0
  70. data/spec/support/matchers.rb +9 -0
  71. data/spec/support/path.rb +21 -0
  72. data/templates/chef_solo.erb +11 -0
  73. metadata +154 -0
@@ -0,0 +1,34 @@
1
+ #
2
+ # Cookbook Name:: rvm
3
+ # Library: gem_package resource monkey patch
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
+ ##
23
+ # Patch Chef::Reousrce::GemPackage resource to use the RVMRubygems provider.
24
+ # This has potentially dangerous side effects and should be considered
25
+ # experimental. You have been warned.
26
+ def patch_gem_package
27
+ ::Chef::Resource::GemPackage.class_eval do
28
+ def initialize(name, run_context=nil)
29
+ super
30
+ @resource_name = :gem_package
31
+ @provider = Chef::Provider::Package::RVMRubygems
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,334 @@
1
+ #
2
+ # Cookbook Name:: rvm
3
+ # Library:: helpers
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
+ begin
23
+ require 'rvm'
24
+ rescue LoadError
25
+ Chef::Log.warn("Missing gem 'rvm'")
26
+ end
27
+
28
+ ##
29
+ # Determines if given ruby string is moderatley sane and potentially legal
30
+ #
31
+ # @param [String, #to_s] the fully qualified RVM ruby string
32
+ # @return [Boolean] is this ruby string sane?
33
+ def ruby_string_sane?(rubie)
34
+ return true if "goruby" == rubie # gorubie has no versions yet
35
+ return true if rubie =~ /^[^-]+-[^-]+/ # must be xxx-vvv at least
36
+ end
37
+
38
+ ##
39
+ # Lists all installed RVM rubies on the system.
40
+ #
41
+ # **Note** that these values are cached for lookup speed. To flush these
42
+ # values and force an update, call #update_installed_rubies.
43
+ #
44
+ # @return [Array] the cached list of currently installed rvm rubies
45
+ def installed_rubies
46
+ @installed_rubies ||= update_installed_rubies
47
+ end
48
+
49
+ ##
50
+ # Updates the list of all installed RVM rubies on the system
51
+ #
52
+ # @return [Array] the list of currently installed rvm rubies
53
+ def update_installed_rubies
54
+ @installed_rubies = RVM.list_strings
55
+ @installed_rubies
56
+ end
57
+
58
+ ##
59
+ # Determines whether or not the given ruby is already installed
60
+ #
61
+ # @param [String, #to_s] the fully qualified RVM ruby string
62
+ # @return [Boolean] is this ruby installed?
63
+ def ruby_installed?(rubie)
64
+ return false unless ruby_string_sane?(rubie)
65
+
66
+ ! installed_rubies.select { |r| r.start_with?(rubie) }.empty?
67
+ end
68
+
69
+ ##
70
+ # Inverse of #ruby_installed?
71
+ #
72
+ # @param [String, #to_s] the fully qualified RVM ruby string
73
+ # @return [Boolean] is this ruby not installed?
74
+ def ruby_not_installed?(rubie)
75
+ !ruby_installed?(rubie)
76
+ end
77
+
78
+ ##
79
+ # Determines whether or not the given ruby is a known ruby string
80
+ #
81
+ # @param [String, #to_s] the fully qualified RVM ruby string
82
+ # @return [Boolean] is this ruby in the known ruby string list?
83
+ def ruby_known?(rubie)
84
+ return false unless ruby_string_sane?(rubie)
85
+
86
+ matches = known_rubies.select { |r| r.start_with?(rubie) }
87
+ if matches.empty?
88
+ # last-ditch attempt at matching. we'll drop the last -.*$ bit off the
89
+ # string assuming that the rubie contains a non-default patchlevel that
90
+ # will actually exist
91
+ fuzzier_rubie = rubie.sub(/-[^-]+$/, '')
92
+ return ! known_rubies.select { |r| r.start_with?(fuzzier_rubie) }.empty?
93
+ else
94
+ return true
95
+ end
96
+ end
97
+
98
+ ##
99
+ # List all known RVM ruby strings.
100
+ #
101
+ # **Note** that these values are cached for lookup speed. To flush these
102
+ # values and force an update, call #update_known_rubies.
103
+ #
104
+ # @return [Array] the cached list of known ruby strings
105
+ def known_rubies
106
+ @known_rubies ||= update_known_rubies
107
+ end
108
+
109
+ ##
110
+ # Updates the list of all known RVM strings.
111
+ #
112
+ # @return [Array] the list of known ruby strings
113
+ def update_known_rubies
114
+ @known_rubies = RVM.list_known_strings
115
+ @known_rubies
116
+ end
117
+
118
+ ##
119
+ # Inverse of #ruby_known?
120
+ #
121
+ # @param [String, #to_s] the fully qualified RVM ruby string
122
+ # @return [Boolean] is this ruby an unknown ruby string?
123
+ def ruby_unknown?(rubie)
124
+ !ruby_known?(rubie)
125
+ end
126
+
127
+ ##
128
+ # Fetches the current default ruby string, potentially with gemset
129
+ #
130
+ # @return [String] the fully qualified RVM ruby string, nil if none is set
131
+ def current_ruby_default
132
+ RVM.list_default
133
+ end
134
+
135
+ ##
136
+ # Determines whether or not the given ruby is the default one
137
+ #
138
+ # @param [String, #to_s] the fully qualified RVM ruby string
139
+ # @return [Boolean] is this ruby the default one?
140
+ def ruby_default?(rubie)
141
+ current_default = current_ruby_default
142
+
143
+ if current_default.nil?
144
+ if rubie == "system"
145
+ return true
146
+ else
147
+ return false
148
+ end
149
+ end
150
+
151
+ return false unless ruby_string_sane?(rubie)
152
+ current_default.start_with?(rubie)
153
+ end
154
+
155
+ ##
156
+ # Determines whether or not the given ruby could be considered the system
157
+ # ruby.
158
+ #
159
+ # @param [String, #to_s] an RVM ruby string
160
+ # @return [Boolean] is this ruby string the a system ruby?
161
+ def system_ruby?(rubie)
162
+ return true if rubie.nil? # nil should be system
163
+ return true if rubie.empty? # an empty string should be system
164
+ return true if rubie == "system" # keyword system should be system
165
+ return false # anything else does not represent system
166
+ end
167
+
168
+ ##
169
+ # Determines whether or not and ruby/gemset environment exists
170
+ #
171
+ # @param [String, #to_s] the fully qualified RVM ruby string
172
+ # @return [Boolean] does this environment exist?
173
+ def env_exists?(ruby_string)
174
+ return true if system_ruby?(ruby_string)
175
+
176
+ rubie = select_ruby(ruby_string)
177
+ gemset = select_gemset(ruby_string)
178
+
179
+ if gemset
180
+ gemset_exists?(:ruby => rubie, :gemset => gemset)
181
+ else
182
+ ruby_installed?(rubie)
183
+ end
184
+ end
185
+
186
+ ##
187
+ # Lists all gemsets for a given RVM ruby.
188
+ #
189
+ # **Note** that these values are cached for lookup speed. To flush these
190
+ # values and force an update, call #update_installed_gemsets.
191
+ #
192
+ # @param [String, #to_s] the fully qualified RVM ruby string
193
+ # @return [Array] a cached list of gemset names
194
+ def installed_gemsets(rubie)
195
+ @installed_gemsets = Hash.new if @installed_gemsets.nil?
196
+ @installed_gemsets[rubie] ||= update_installed_gemsets(rubie)
197
+ end
198
+
199
+ ##
200
+ # Updates the list of all gemsets for a given RVM ruby on the system
201
+ #
202
+ # @param [String, #to_s] the fully qualified RVM ruby string
203
+ # @return [Array] the current list of gemsets
204
+ def update_installed_gemsets(rubie)
205
+ env = RVM::Environment.new
206
+ env.use rubie
207
+
208
+ @installed_gemsets ||= {}
209
+ @installed_gemsets[rubie] = env.gemset_list
210
+ @installed_gemsets[rubie]
211
+ end
212
+
213
+ ##
214
+ # Determines whether or not a gemset exists for a given ruby
215
+ #
216
+ # @param [Hash] the options to query a gemset with
217
+ # @option opts [String] :ruby the ruby the query within
218
+ # @option opts [String] :gemset the gemset to look for
219
+ def gemset_exists?(opts={})
220
+ return false if opts[:ruby].nil? || opts[:gemset].nil?
221
+ return false unless ruby_string_sane?(opts[:ruby])
222
+ return false unless ruby_installed?(opts[:ruby])
223
+
224
+ installed_gemsets(opts[:ruby]).include?(opts[:gemset])
225
+ end
226
+
227
+ ##
228
+ # Determines whether or not there is a gemset defined in a given ruby string
229
+ #
230
+ # @param [String, #to_s] the fully qualified RVM ruby string
231
+ # @return [Boolean] does the ruby string appear to have a gemset included?
232
+ def string_include_gemset?(ruby_string)
233
+ ruby_string.include?('@')
234
+ end
235
+
236
+ ##
237
+ # Filters out any gemset declarations in an RVM ruby string
238
+ #
239
+ # @param [String, #to_s] the fully qualified RVM ruby string
240
+ # @return [String] the ruby string, minus gemset
241
+ def select_ruby(ruby_string)
242
+ ruby_string.split('@').first
243
+ end
244
+
245
+ ##
246
+ # Filters out any ruby declaration in an RVM ruby string
247
+ #
248
+ # @param [String, #to_s] the fully qualified RVM ruby string
249
+ # @return [String] the gemset string, minus ruby or nil if no gemset given
250
+ def select_gemset(ruby_string)
251
+ if string_include_gemset?(ruby_string)
252
+ ruby_string.split('@').last
253
+ else
254
+ nil
255
+ end
256
+ end
257
+
258
+ ##
259
+ # Sanitizes a ruby string so that it's more normalized.
260
+ #
261
+ # @param [String, #to_s] an RVM ruby string
262
+ # @return [String] a fully qualified RVM ruby string
263
+ def normalize_ruby_string(ruby_string)
264
+ # get the actual ruby string that corresponds to "default"
265
+ if ruby_string.start_with?("default")
266
+ ruby_string.sub(/default/, current_ruby_default)
267
+ else
268
+ ruby_string
269
+ end
270
+ end
271
+
272
+ ##
273
+ # Finds the correct shell profile to source to init an RVM-aware
274
+ # shell environment
275
+ #
276
+ # @return [String] full path the shell profile
277
+ def find_profile_to_source
278
+ if ::File.directory?("/etc/profile.d")
279
+ "/etc/profile.d/rvm.sh"
280
+ else
281
+ "/etc/profile"
282
+ end
283
+ end
284
+
285
+ ##
286
+ # Returns a shell command that is RVM-aware
287
+ #
288
+ # @param [String, #to_s] the shell command to be wrapped
289
+ # @return [String] the command wrapped in RVM-initialized bash command
290
+ def rvm_wrap_cmd(cmd)
291
+ %{bash -c "source #{find_profile_to_source} && source ~/.bash_profile && #{cmd.gsub(/"/, '\"')}"}
292
+ end
293
+
294
+ ##
295
+ # Installs any package dependencies needed by a given ruby
296
+ #
297
+ # @param [String, #to_s] the fully qualified RVM ruby string
298
+ def install_ruby_dependencies(rubie)
299
+ pkgs = []
300
+ if rubie =~ /^1\.[89]\../ || rubie =~ /^ree/ || rubie =~ /^ruby-/
301
+ case node[:platform]
302
+ when "debian","ubuntu"
303
+ pkgs = %w{ build-essential bison openssl libreadline6 libreadline6-dev
304
+ zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-0
305
+ libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev ssl-cert }
306
+ pkgs += %w{ git-core subversion autoconf } if rubie =~ /^ruby-head$/
307
+ when "suse"
308
+ pkgs = %w{ gcc-c++ patch zlib zlib-devel libffi-devel
309
+ sqlite3-devel libxml2-devel libxslt-devel }
310
+ if node.platform_version.to_f >= 11.0
311
+ pkgs += %w{ libreadline5 readline-devel libopenssl-devel }
312
+ else
313
+ pkgs += %w{ readline readline-devel openssl-devel }
314
+ end
315
+ pkgs += %w{ git subversion autoconf } if rubie =~ /^ruby-head$/
316
+ when "centos","redhat","fedora"
317
+ pkgs = %w{ gcc-c++ patch readline readline-devel zlib zlib-devel
318
+ libyaml-devel libffi-devel openssl-devel }
319
+ pkgs += %w{ git subversion autoconf } if rubie =~ /^ruby-head$/
320
+ end
321
+ elsif rubie =~ /^jruby/
322
+ # TODO: need to figure out how to pull in java recipe only when needed. For
323
+ # now, users of jruby will have to add the "java" recipe to their run_list.
324
+ #include_recipe "java"
325
+ pkgs << "g++"
326
+ end
327
+
328
+ pkgs.each do |pkg|
329
+ p = package pkg do
330
+ action :nothing
331
+ end
332
+ p.run_action(:install)
333
+ end
334
+ end
@@ -0,0 +1,108 @@
1
+ #
2
+ # Cookbook Name:: rvm
3
+ # Provider:: Chef::Provider::Package::RVMRubygems
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
+ class Chef
23
+ class Provider
24
+ class Package
25
+ class RVMRubygems < Chef::Provider::Package::Rubygems
26
+
27
+ class RVMGemEnvironment < AlternateGemEnvironment
28
+ attr_reader :ruby_string
29
+
30
+ def initialize(gem_binary_location, ruby_string)
31
+ super(gem_binary_location)
32
+ @ruby_string = ruby_string
33
+ end
34
+
35
+ def gem_paths
36
+ # shellout! is a fork/exec which won't work on windows
37
+ shell_style_paths = shell_out!(rvm_wrap_cmd(
38
+ "rvm #{ruby_string} exec #{@gem_binary_location} env gempath")).stdout
39
+ # on windows, the path separator is semicolon
40
+ paths = shell_style_paths.split(
41
+ ::File::PATH_SEPARATOR).map { |path| path.strip }
42
+ end
43
+
44
+ def gem_platforms
45
+ gem_environment = shell_out!(rvm_wrap_cmd(
46
+ "rvm #{ruby_string} exec #{@gem_binary_location} env")).stdout
47
+ if jruby = gem_environment[JRUBY_PLATFORM]
48
+ ['ruby', Gem::Platform.new(jruby)]
49
+ else
50
+ Gem.platforms
51
+ end
52
+ end
53
+ end
54
+
55
+ def initialize(new_resource, run_context=nil)
56
+ super
57
+ @gem_env = RVMGemEnvironment.new(gem_binary_path, ruby_string)
58
+ end
59
+
60
+ def ruby_string
61
+ @ruby_string ||= if new_resource.respond_to?("ruby_string")
62
+ new_resource.ruby_string
63
+ else
64
+ node['rvm']['gem_package']['rvm_string']
65
+ end
66
+ end
67
+
68
+ def install_package(name, version)
69
+ ruby_string_normalized = normalize_ruby_string(ruby_string)
70
+
71
+ # ensure ruby is installed and gemset exists
72
+ e = rvm_environment ruby_string_normalized do
73
+ action :nothing
74
+ end
75
+ e.run_action(:create)
76
+
77
+ install_via_gem_command(name, version)
78
+ true
79
+ end
80
+
81
+ def install_via_gem_command(name, version)
82
+ src = @new_resource.source &&
83
+ " --source=#{@new_resource.source} --source=http://rubygems.org"
84
+
85
+ cmd = %{rvm #{ruby_string} #{gem_binary_path}}
86
+ cmd << %{ install #{name} -q --no-rdoc --no-ri -v "#{version}"}
87
+ cmd << %{#{src}#{opts}}
88
+ shell_out!(rvm_wrap_cmd(cmd), :env => nil)
89
+ end
90
+
91
+ def remove_package(name, version)
92
+ uninstall_via_gem_command(name, version)
93
+ end
94
+
95
+ def uninstall_via_gem_command(name, version)
96
+ cmd = %{rvm #{ruby_string} #{gem_binary_path}}
97
+ cmd << %{ uninstall #{name} -q -x -I}
98
+ if version
99
+ cmd << %{ -v "#{version}"#{opts}}
100
+ else
101
+ cmd << %{ -a#{opts}}
102
+ end
103
+ shell_out!(cmd, :env=>nil)
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end