summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBryan McLellan <btm@loftninjas.org>2012-01-23 09:09:12 -0800
committerBryan McLellan <btm@loftninjas.org>2012-01-23 09:15:21 -0800
commit8856bd5cd0026ff38ad9498bd4fe640181ced7e4 (patch)
treedfb5ab9c6bd2618e15cf8d0ff6012424289652ec
parent16b2a65c99cec12bd2cf7b23feb129566caccd76 (diff)
downloadchef-8856bd5cd0026ff38ad9498bd4fe640181ced7e4.tar.gz
CHEF-2879: Add chef_gem resource for installing gems to current gem environment
-rw-r--r--chef/lib/chef/resource/chef_gem.rb43
-rw-r--r--chef/lib/chef/resources.rb1
-rw-r--r--chef/spec/unit/resource/chef_gem_spec.rb49
3 files changed, 93 insertions, 0 deletions
diff --git a/chef/lib/chef/resource/chef_gem.rb b/chef/lib/chef/resource/chef_gem.rb
new file mode 100644
index 0000000000..ce2c9027a4
--- /dev/null
+++ b/chef/lib/chef/resource/chef_gem.rb
@@ -0,0 +1,43 @@
+#
+# Author:: Bryan McLellan <btm@loftninjas.org>
+# Copyright:: Copyright (c) 2012 Opscode, Inc.
+# License:: Apache License, Version 2.0
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+require 'chef/resource/package'
+require 'chef/resource/gem_package'
+
+class Chef
+ class Resource
+ class ChefGem < Chef::Resource::Package::GemPackage
+
+ def initialize(name, run_context=nil)
+ super
+ @resource_name = :chef_gem
+ @provider = Chef::Provider::Package::Rubygems
+ end
+
+ # The chef_gem resources is for installing gems to the current gem environment only for use by Chef cookbooks.
+ def gem_binary(arg=nil)
+ if arg
+ raise ArgumentError, "The chef_gem resource is restricted to the current gem environment, use gem_package to install to other environments."
+ end
+
+ nil
+ end
+
+ end
+ end
+end
diff --git a/chef/lib/chef/resources.rb b/chef/lib/chef/resources.rb
index 98f4d981ab..0dfef61911 100644
--- a/chef/lib/chef/resources.rb
+++ b/chef/lib/chef/resources.rb
@@ -20,6 +20,7 @@ require 'chef/resource/apt_package'
require 'chef/resource/bash'
require 'chef/resource/breakpoint'
require 'chef/resource/cookbook_file'
+require 'chef/resource/chef_gem'
require 'chef/resource/cron'
require 'chef/resource/csh'
require 'chef/resource/deploy'
diff --git a/chef/spec/unit/resource/chef_gem_spec.rb b/chef/spec/unit/resource/chef_gem_spec.rb
new file mode 100644
index 0000000000..9238791527
--- /dev/null
+++ b/chef/spec/unit/resource/chef_gem_spec.rb
@@ -0,0 +1,49 @@
+#
+# Author:: Adam Jacob (<adam@opscode.com>)
+# Author:: Bryan McLellan <btm@loftninjas.org>
+# Copyright:: Copyright (c) 2008, 2012 Opscode, Inc.
+# License:: Apache License, Version 2.0
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "spec_helper"))
+
+describe Chef::Resource::ChefGem, "initialize" do
+
+ before(:each) do
+ @resource = Chef::Resource::ChefGem.new("foo")
+ end
+
+ it "should return a Chef::Resource::ChefGem" do
+ @resource.should be_a_kind_of(Chef::Resource::ChefGem)
+ end
+
+ it "should set the resource_name to :chef_gem" do
+ @resource.resource_name.should eql(:chef_gem)
+ end
+
+ it "should set the provider to Chef::Provider::Package::Rubygems" do
+ @resource.provider.should eql(Chef::Provider::Package::Rubygems)
+ end
+end
+
+describe Chef::Resource::ChefGem, "gem_binary" do
+ before(:each) do
+ @resource = Chef::Resource::ChefGem.new("foo")
+ end
+
+ it "should raise an exception when gem_binary is set" do
+ lambda { @resource.gem_binary("/lol/cats/gem") }.should raise_error(ArgumentError)
+ end
+end