poise-ruby 2.0.0

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 (41) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.kitchen.travis.yml +9 -0
  4. data/.kitchen.yml +9 -0
  5. data/.travis.yml +20 -0
  6. data/.yardopts +7 -0
  7. data/Berksfile +28 -0
  8. data/Gemfile +33 -0
  9. data/LICENSE +201 -0
  10. data/README.md +290 -0
  11. data/Rakefile +17 -0
  12. data/chef/attributes/default.rb +23 -0
  13. data/chef/recipes/default.rb +19 -0
  14. data/lib/poise_ruby.rb +24 -0
  15. data/lib/poise_ruby/cheftie.rb +18 -0
  16. data/lib/poise_ruby/error.rb +21 -0
  17. data/lib/poise_ruby/resources.rb +29 -0
  18. data/lib/poise_ruby/resources/bundle_install.rb +221 -0
  19. data/lib/poise_ruby/resources/ruby_execute.rb +91 -0
  20. data/lib/poise_ruby/resources/ruby_gem.rb +118 -0
  21. data/lib/poise_ruby/resources/ruby_runtime.rb +87 -0
  22. data/lib/poise_ruby/ruby_command_mixin.rb +59 -0
  23. data/lib/poise_ruby/ruby_providers.rb +32 -0
  24. data/lib/poise_ruby/ruby_providers/base.rb +116 -0
  25. data/lib/poise_ruby/ruby_providers/chef.rb +53 -0
  26. data/lib/poise_ruby/ruby_providers/scl.rb +77 -0
  27. data/lib/poise_ruby/ruby_providers/system.rb +115 -0
  28. data/lib/poise_ruby/version.rb +20 -0
  29. data/poise-ruby.gemspec +41 -0
  30. data/test/cookbooks/poise-ruby_test/metadata.rb +18 -0
  31. data/test/cookbooks/poise-ruby_test/recipes/bundle_install.rb +102 -0
  32. data/test/cookbooks/poise-ruby_test/recipes/default.rb +85 -0
  33. data/test/gemfiles/chef-12.gemfile +19 -0
  34. data/test/gemfiles/master.gemfile +23 -0
  35. data/test/integration/default/serverspec/bundle_install_spec.rb +73 -0
  36. data/test/integration/default/serverspec/default_spec.rb +46 -0
  37. data/test/spec/resources/bundle_install_spec.rb +306 -0
  38. data/test/spec/resources/ruby_execute_spec.rb +78 -0
  39. data/test/spec/ruby_command_mixin_spec.rb +34 -0
  40. data/test/spec/spec_helper.rb +18 -0
  41. metadata +155 -0
@@ -0,0 +1,118 @@
1
+ #
2
+ # Copyright 2015, Noah Kantrowitz
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'chef/provider/package/rubygems'
18
+ require 'chef/resource/gem_package'
19
+ require 'poise'
20
+
21
+ require 'poise_ruby/ruby_command_mixin'
22
+
23
+
24
+ module PoiseRuby
25
+ module Resources
26
+ # (see RubyGem::Resource)
27
+ # @since 2.0.0
28
+ module RubyGem
29
+ # A `ruby_gem` resource to install Ruby gems.
30
+ #
31
+ # @provides ruby_gem
32
+ # @action install
33
+ # @action upgrade
34
+ # @action remove
35
+ # @action purge
36
+ # @action reconfig
37
+ # @example
38
+ # ruby_gem 'rack'
39
+ class Resource < Chef::Resource::GemPackage
40
+ include Poise
41
+ provides(:ruby_gem)
42
+ include PoiseRuby::RubyCommandMixin
43
+
44
+ # @api private
45
+ def initialize(name, run_context=nil)
46
+ super
47
+ @resource_name = :ruby_gem if @resource_name
48
+ # Remove when all useful versions are using provider resolver.
49
+ @provider = PoiseRuby::Resources::RubyGem::Provider if @provider
50
+ end
51
+ end
52
+
53
+ # The default provider for `ruby_gem`.
54
+ #
55
+ # @see Resource
56
+ # @provides ruby_gem
57
+ class Provider < Chef::Provider::Package::Rubygems
58
+ include Poise
59
+ provides(:ruby_gem)
60
+
61
+ def load_current_resource
62
+ patch_environment { super }
63
+ end
64
+
65
+ def define_resource_requirements
66
+ patch_environment { super }
67
+ end
68
+
69
+ def action_install
70
+ patch_environment { super }
71
+ end
72
+
73
+ def action_upgrade
74
+ patch_environment { super }
75
+ end
76
+
77
+ def action_remove
78
+ patch_environment { super }
79
+ end
80
+
81
+ def action_purge
82
+ patch_environment { super }
83
+ end
84
+
85
+ def action_reconfig
86
+ patch_environment { super }
87
+ end
88
+
89
+ private
90
+
91
+ def patch_environment(&block)
92
+ environment_to_add = if new_resource.parent_ruby
93
+ new_resource.parent_ruby.ruby_environment
94
+ else
95
+ {}
96
+ end
97
+
98
+ begin
99
+ old_vars = environment_to_add.inject({}) do |memo, (key, value)|
100
+ memo[key] = ENV[key]
101
+ ENV[key] = value
102
+ memo
103
+ end
104
+ block.call
105
+ ensure
106
+ old_vars.each do |key, value|
107
+ if value.nil?
108
+ ENV.delete(key)
109
+ else
110
+ ENV[key] = value
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,87 @@
1
+ #
2
+ # Copyright 2015, Noah Kantrowitz
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'chef/resource'
18
+ require 'poise'
19
+
20
+
21
+ module PoiseRuby
22
+ module Resources
23
+ # (see RubyRuntime::Resource)
24
+ # @since 2.0.0
25
+ module RubyRuntime
26
+ # A `ruby_runtime` resource to manage Ruby installations.
27
+ #
28
+ # @provides ruby_runtime
29
+ # @action install
30
+ # @action uninstall
31
+ # @example
32
+ # ruby_runtime '2.1.2'
33
+ class Resource < Chef::Resource
34
+ include Poise(inversion: true, container: true)
35
+ provides(:ruby_runtime)
36
+ actions(:install, :uninstall)
37
+
38
+ # @!attribute version
39
+ # Version of Ruby to install.
40
+ # @return [String]
41
+ attribute(:version, kind_of: String, name_attribute: true)
42
+ # @!attribute bundler_version
43
+ # Version of Bundler to install. It set to `true`, the latest
44
+ # available version will be used. If set to `false`, Bundler will
45
+ # not be installed.
46
+ # @note Disabling the Bundler install may result in other resources
47
+ # being non-functional.
48
+ # @return [String, Boolean]
49
+ attribute(:bundler_version, kind_of: [String, TrueClass, FalseClass], default: true)
50
+
51
+ # The path to the `ruby` binary for this Ruby installation. This is an
52
+ # output property.
53
+ #
54
+ # @return [String]
55
+ # @example
56
+ # execute "#{resources('ruby_runtime[2.2.2]').ruby_binary} myapp.rb"
57
+ def ruby_binary
58
+ @ruby_binary ||= provider_for_action(:ruby_binary).ruby_binary
59
+ end
60
+
61
+ # The environment variables for this Ruby installation. This is an
62
+ # output property.
63
+ #
64
+ # @return [Hash<String, String>]
65
+ # @example
66
+ # execute '/opt/myapp.py' do
67
+ # environment resources('ruby_runtime[2.2.2]').ruby_environment
68
+ # end
69
+ def ruby_environment
70
+ @ruby_environment ||= provider_for_action(:ruby_environment).ruby_environment
71
+ end
72
+
73
+ # The path to the `gem` binary for this Ruby installation. This is an
74
+ # output property.
75
+ #
76
+ # @return [String]
77
+ # @example
78
+ # execute "#{resources('ruby_runtime[2.2.2]').gem_binary} install myapp"
79
+ def gem_binary
80
+ @gem_binary ||= provider_for_action(:gem_binary).gem_binary
81
+ end
82
+ end
83
+
84
+ # Providers can be found under lib/poise_ruby/ruby_providers/
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,59 @@
1
+ #
2
+ # Copyright 2015, Noah Kantrowitz
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'poise/utils'
18
+ require 'poise_languages'
19
+
20
+
21
+ module PoiseRuby
22
+ # Mixin for resources and providers which run Ruby commands.
23
+ #
24
+ # @since 1.0.0
25
+ module RubyCommandMixin
26
+ include Poise::Utils::ResourceProviderMixin
27
+
28
+ module Resource
29
+ include PoiseLanguages::Command::Mixin::Resource(:ruby)
30
+
31
+ # @!attribute gem_binary
32
+ # Path to the gem binary.
33
+ # @return [String]
34
+ attribute(:gem_binary, kind_of: String, default: lazy { default_gem_binary })
35
+
36
+ private
37
+
38
+ # Find the default gem binary. If there is a parent use that, otherwise
39
+ # use the same logic as {PoiseRuby::RubyProviders::Base#gem_binary}.
40
+ #
41
+ # @return [String]
42
+ def default_gem_binary
43
+ if parent_ruby
44
+ parent_ruby.gem_binary
45
+ else
46
+ dir, base = ::File.split(ruby)
47
+ # If this ruby is called something weird, bail out.
48
+ raise NotImplementedError unless base.start_with?('ruby')
49
+ # Allow for names like "ruby2.0" -> "gem2.0".
50
+ ::File.join(dir, base.sub(/^ruby/, 'gem'))
51
+ end
52
+ end
53
+ end
54
+
55
+ module Provider
56
+ include PoiseLanguages::Command::Mixin::Provider(:ruby)
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,32 @@
1
+ #
2
+ # Copyright 2015, Noah Kantrowitz
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'poise_ruby/ruby_providers/chef'
18
+ require 'poise_ruby/ruby_providers/scl'
19
+ require 'poise_ruby/ruby_providers/system'
20
+
21
+
22
+ module PoiseRuby
23
+ # Inversion providers for the ruby_runtime resource.
24
+ #
25
+ # @since 2.0.0
26
+ module RubyProviders
27
+ Chef::Platform::ProviderPriorityMap.instance.priority(:ruby_runtime, [
28
+ PoiseRuby::RubyProviders::Scl,
29
+ PoiseRuby::RubyProviders::System,
30
+ ])
31
+ end
32
+ end
@@ -0,0 +1,116 @@
1
+ #
2
+ # Copyright 2015, Noah Kantrowitz
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'chef/provider'
18
+ require 'poise'
19
+
20
+ require 'poise_ruby/resources/ruby_runtime'
21
+
22
+
23
+ module PoiseRuby
24
+ module RubyProviders
25
+ class Base < Chef::Provider
26
+ include Poise(inversion: :ruby_runtime)
27
+
28
+ # Set default inversion options.
29
+ #
30
+ # @api private
31
+ def self.default_inversion_options(node, new_resource)
32
+ super.merge({
33
+ bundler_version: new_resource.bundler_version,
34
+ version: new_resource.version,
35
+ })
36
+ end
37
+
38
+ # The `install` action for the `ruby_runtime` resource.
39
+ #
40
+ # @return [void]
41
+ def action_install
42
+ notifying_block do
43
+ install_ruby
44
+ install_bundler
45
+ end
46
+ end
47
+
48
+ # The `uninstall` action for the `ruby_runtime` resource.
49
+ #
50
+ # @return [void]
51
+ def action_uninstall
52
+ notifying_block do
53
+ uninstall_ruby
54
+ end
55
+ end
56
+
57
+ # The path to the `ruby` binary.
58
+ #
59
+ # @abstract
60
+ # @return [String]
61
+ def ruby_binary
62
+ raise NotImplementedError
63
+ end
64
+
65
+ # Output property for environment variables.
66
+ #
67
+ # @return [Hash<String, String>]
68
+ def ruby_environment
69
+ # No environment variables needed. Rejoice.
70
+ {}
71
+ end
72
+
73
+ # The path to the `gem` binary. Look relative to the
74
+ # `ruby` binary for a default implementation.
75
+ #
76
+ # @return [String]
77
+ def gem_binary
78
+ dir, base = ::File.split(ruby_binary)
79
+ # If this ruby is called something weird, bail out.
80
+ raise NotImplementedError unless base.start_with?('ruby')
81
+ # Allow for names like "ruby2.0" -> "gem2.0".
82
+ ::File.join(dir, base.sub(/^ruby/, 'gem'))
83
+ end
84
+
85
+ private
86
+
87
+ # Install the Ruby runtime. Must be implemented by subclass.
88
+ #
89
+ # @abstract
90
+ # @return [void]
91
+ def install_ruby
92
+ end
93
+
94
+ # Uninstall the Ruby runtime. Must be implemented by subclass.
95
+ #
96
+ # @abstract
97
+ # @return [void]
98
+ def uninstall_ruby
99
+ end
100
+
101
+ # Install Bundler in to the Ruby runtime.
102
+ #
103
+ # @return [void]
104
+ def install_bundler
105
+ # Captured because #options conflicts with Chef::Resource::Package#options.
106
+ bundler_version = options[:bundler_version]
107
+ return unless bundler_version
108
+ ruby_gem 'bundler' do
109
+ action :upgrade if bundler_version == true
110
+ parent_ruby new_resource
111
+ version bundler_version if bundler_version.is_a?(String)
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,53 @@
1
+ #
2
+ # Copyright 2015, Noah Kantrowitz
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'poise_ruby/error'
18
+ require 'poise_ruby/ruby_providers/base'
19
+
20
+
21
+ module PoiseRuby
22
+ module RubyProviders
23
+ # Inversion provider for the `ruby` resource to use whatever Ruby is
24
+ # currently running, generally Chef's omnibus-d Ruby.
25
+ #
26
+ # @since 2.0.0
27
+ # @provides chef
28
+ class ChefRuby < Base
29
+ provides(:chef)
30
+
31
+ # The `install` action for the `ruby_runtime` resource.
32
+ #
33
+ # @return [void]
34
+ def action_install
35
+ # No-op, already installed!
36
+ end
37
+
38
+ # The `uninstall` action for the `ruby_runtime` resource.
39
+ #
40
+ # @return [void]
41
+ def action_uninstall
42
+ raise PoiseRuby::Error.new("You cannot uninstall Chef's Ruby.")
43
+ end
44
+
45
+ # The path to the running Ruby binary as determined via RbConfig.
46
+ #
47
+ # @return [String]
48
+ def ruby_binary
49
+ Gem.ruby
50
+ end
51
+ end
52
+ end
53
+ end