flombe 0.1.0.2

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.
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