Please review pull request #704: (#14149) Reserve the Puppet::Modules namespace opened by (jeffmccune)
Description:
Without this patch there is no reserved place for 3rd party modules to
define utility classes or ruby module objects. This results in a free
for all situation where it is common for Puppet to accidentally monkey
patch 3rd party code or vice-versa.
This patch fixes the problem by reserving the Puppet::Modules namespace
for use by 3rd party Puppet modules. From this point forward, no change
to Puppet core should introduce objects into the Puppet::Modules
namespace.
- Opened: Tue Apr 24 00:47:16 UTC 2012
- Based on: puppetlabs:2.7.x (d0d34a7fac3188305752b1056119b5ad1f8d496a)
- Requested merge: jeffmccune:ticket/2.7.x/14149_modules_should_have_a_safe_namespace (d6b27bc0680656df18e37a008281d72001bc4c93)
Diff follows:
diff --git a/lib/puppet.rb b/lib/puppet.rb
index 319d939..a708e4e 100644
--- a/lib/puppet.rb
+++ b/lib/puppet.rb
@@ -124,6 +124,7 @@ def self.newtype(name, options = {}, &block)
require 'puppet/network'
require 'puppet/ssl'
require 'puppet/module'
+require 'puppet/modules'
require 'puppet/util/storage'
require 'puppet/status'
require 'puppet/file_bucket/file'
diff --git a/lib/puppet/modules.rb b/lib/puppet/modules.rb
new file mode 100644
index 0000000..a852f1c
--- /dev/null
+++ b/lib/puppet/modules.rb
@@ -0,0 +1,9 @@
+# JJM - This namespace is reserved for use by 3rd party Puppet Modules. Puppet
+# core should never create objects within the Puppet::Modules namespace as this
+# namespace is reserved as a relatively safe place for modules to define their
+# own utility classes or mixin modules.
+#
+module Puppet
+ module Modules
+ end
+end
diff --git a/spec/unit/modules_spec.rb b/spec/unit/modules_spec.rb
new file mode 100755
index 0000000..b83c3ee
--- /dev/null
+++ b/spec/unit/modules_spec.rb
@@ -0,0 +1,24 @@
+#!/usr/bin/env ruby -S rspec
+require 'spec_helper'
+
+describe Puppet::Modules do
+ it 'should exist' do
+ Puppet.const_defined?("Modules").should be_true
+ end
+ it 'should be a Module' do
+ subject.class.should be_a Module
+ end
+ it 'should block Puppet::Modules as a Class' do
+ lambda { module Puppet; class Modules; end; end; }.should raise_error TypeError, /Modules is not a class/
+ end
+ it 'should allow monkey patching' do
+ module Puppet
+ module Modules
+ def self.monkey_patch1
+ "bar"
+ end
+ end
+ end
+ Puppet::Modules.monkey_patch1.should eq "bar"
+ end
+end
-- You received this message because you are subscribed to the Google Groups "Puppet Developers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to [email protected].
For more options, visit this group at http://groups.google.com/group/puppet-dev?hl=en.
