From fe5616cfcab3cecd299acad1d422877cdebeb49e Mon Sep 17 00:00:00 2001 From: Adam Spiers Date: Wed, 5 Feb 2014 16:48:19 +0000 Subject: [PATCH] stop libraries being required multiple times The previous use of require caused File.join on several occasions to calculate different paths to the same library, depending on which __FILE__ the library was being calculated as relative to; e.g. /some/path/prefix/spec/one/bar.rb would do the equivalent of: require '/some/path/prefix/spec/one/../../libraries/foo/mylib.rb' and /some/path/prefix/spec/two/baz.rb would do the equivalent of: require '/some/path/prefix/spec/two/../../libraries/foo/mylib.rb' This would result in mylib.rb being loaded multiple times, causing warnings from constants being redefined, and worse, multiple objects representing the same class hierarchy (@@foo) variables. The latter actually broke the @@subclasses registration mechanism in Pacemaker::CIBObject. By switching to File.expand_path, we ensure we always refer to each library using a single absolute path, which means Ruby's require mechanism works as it should, only loading the code the first time round. --- libraries/pacemaker.rb | 6 +++--- libraries/pacemaker/constraint.rb | 2 +- libraries/pacemaker/constraint/colocation.rb | 2 +- libraries/pacemaker/resource.rb | 2 +- libraries/pacemaker/resource/clone.rb | 2 +- libraries/pacemaker/resource/primitive.rb | 2 +- providers/clone.rb | 4 ++-- providers/colocation.rb | 4 ++-- providers/common.rb | 2 +- providers/location.rb | 4 ++-- providers/ms.rb | 4 ++-- providers/order.rb | 4 ++-- providers/primitive.rb | 4 ++-- providers/property.rb | 4 ++-- spec/fixtures/clone_resource.rb | 6 +++--- spec/fixtures/colocation_constraint.rb | 4 ++-- spec/fixtures/keystone_primitive.rb | 4 ++-- spec/helpers/common_object_examples.rb | 3 ++- spec/libraries/pacemaker/cib_object_spec.rb | 4 ++-- spec/libraries/pacemaker/constraint/colocation_spec.rb | 8 ++++---- spec/libraries/pacemaker/resource/primitive_spec.rb | 6 +++--- spec/libraries/pacemaker/resource_spec.rb | 3 ++- spec/providers/colocation_spec.rb | 6 +++--- spec/providers/primitive_spec.rb | 6 +++--- 24 files changed, 49 insertions(+), 47 deletions(-) diff --git a/libraries/pacemaker.rb b/libraries/pacemaker.rb index aea49aa..eb69903 100644 --- a/libraries/pacemaker.rb +++ b/libraries/pacemaker.rb @@ -1,3 +1,3 @@ -require File.join(File.dirname(__FILE__), %w(pacemaker resource primitive)) -require File.join(File.dirname(__FILE__), %w(pacemaker resource clone)) -require File.join(File.dirname(__FILE__), %w(pacemaker constraint colocation)) +require File.expand_path('pacemaker/resource/primitive', File.dirname(__FILE__)) +require File.expand_path('pacemaker/resource/clone', File.dirname(__FILE__)) +require File.expand_path('pacemaker/constraint/colocation', File.dirname(__FILE__)) diff --git a/libraries/pacemaker/constraint.rb b/libraries/pacemaker/constraint.rb index 7ba752b..7d3de89 100644 --- a/libraries/pacemaker/constraint.rb +++ b/libraries/pacemaker/constraint.rb @@ -1,4 +1,4 @@ -require File.join(File.dirname(__FILE__), 'cib_object') +require File.expand_path('cib_object', File.dirname(__FILE__)) module Pacemaker class Constraint < Pacemaker::CIBObject diff --git a/libraries/pacemaker/constraint/colocation.rb b/libraries/pacemaker/constraint/colocation.rb index 25b6852..e522cc3 100644 --- a/libraries/pacemaker/constraint/colocation.rb +++ b/libraries/pacemaker/constraint/colocation.rb @@ -1,4 +1,4 @@ -require File::join(File.dirname(__FILE__), %w(.. constraint)) +require File.expand_path('../constraint', File.dirname(__FILE__)) class Pacemaker::Constraint::Colocation < Pacemaker::Constraint TYPE = 'colocation' diff --git a/libraries/pacemaker/resource.rb b/libraries/pacemaker/resource.rb index c9af753..b8d9ce1 100644 --- a/libraries/pacemaker/resource.rb +++ b/libraries/pacemaker/resource.rb @@ -1,5 +1,5 @@ require 'chef/mixin/shell_out' -require File::join(File.dirname(__FILE__), 'cib_object') +require File.expand_path('cib_object', File.dirname(__FILE__)) module Pacemaker class Resource < Pacemaker::CIBObject diff --git a/libraries/pacemaker/resource/clone.rb b/libraries/pacemaker/resource/clone.rb index 1ef523e..af926f8 100644 --- a/libraries/pacemaker/resource/clone.rb +++ b/libraries/pacemaker/resource/clone.rb @@ -1,4 +1,4 @@ -require File::join(File.dirname(__FILE__), %w(.. resource)) +require File.expand_path('../resource', File.dirname(__FILE__)) class Pacemaker::Resource::Clone < Pacemaker::Resource register_type 'clone' diff --git a/libraries/pacemaker/resource/primitive.rb b/libraries/pacemaker/resource/primitive.rb index 36dcc63..2da7c23 100644 --- a/libraries/pacemaker/resource/primitive.rb +++ b/libraries/pacemaker/resource/primitive.rb @@ -1,5 +1,5 @@ require 'shellwords' -require File::join(File.dirname(__FILE__), %w(.. resource)) +require File.expand_path('../resource', File.dirname(__FILE__)) class Pacemaker::Resource::Primitive < Pacemaker::Resource TYPE = 'primitive' diff --git a/providers/clone.rb b/providers/clone.rb index ec59f09..a679eea 100644 --- a/providers/clone.rb +++ b/providers/clone.rb @@ -17,8 +17,8 @@ # limitations under the License. # -require ::File.join(::File.dirname(__FILE__), - *%w(.. libraries pacemaker cib_object)) +require ::File.expand_path('../libraries/pacemaker/cib_object', + ::File.dirname(__FILE__)) action :create do name = new_resource.name diff --git a/providers/colocation.rb b/providers/colocation.rb index cc0c7eb..b69a39f 100644 --- a/providers/colocation.rb +++ b/providers/colocation.rb @@ -17,8 +17,8 @@ # limitations under the License. # -require ::File.join(::File.dirname(__FILE__), *%w(.. libraries pacemaker)) -require ::File.join(::File.dirname(__FILE__), 'common') +require ::File.expand_path('../libraries/pacemaker', ::File.dirname(__FILE__)) +require ::File.expand_path('common', ::File.dirname(__FILE__)) include Chef::Mixin::PacemakerCommon diff --git a/providers/common.rb b/providers/common.rb index d3492c1..1d5643c 100644 --- a/providers/common.rb +++ b/providers/common.rb @@ -1,5 +1,5 @@ require 'chef/application' -require ::File.join(::File.dirname(__FILE__), *%w(.. libraries pacemaker)) +require ::File.expand_path('../libraries/pacemaker', ::File.dirname(__FILE__)) class Chef module Mixin::PacemakerCommon diff --git a/providers/location.rb b/providers/location.rb index 9939984..99fffd4 100644 --- a/providers/location.rb +++ b/providers/location.rb @@ -17,8 +17,8 @@ # limitations under the License. # -require ::File.join(::File.dirname(__FILE__), - *%w(.. libraries pacemaker cib_object)) +require ::File.expand_path('../libraries/pacemaker/cib_object', + ::File.dirname(__FILE__)) action :create do name = new_resource.name diff --git a/providers/ms.rb b/providers/ms.rb index 22de550..c58cb34 100644 --- a/providers/ms.rb +++ b/providers/ms.rb @@ -17,8 +17,8 @@ # limitations under the License. # -require ::File.join(::File.dirname(__FILE__), - *%w(.. libraries pacemaker cib_object)) +require ::File.expand_path('../libraries/pacemaker/cib_object', + ::File.dirname(__FILE__)) action :create do name = new_resource.name diff --git a/providers/order.rb b/providers/order.rb index 0cca1bc..c4d07eb 100644 --- a/providers/order.rb +++ b/providers/order.rb @@ -17,8 +17,8 @@ # limitations under the License. # -require ::File.join(::File.dirname(__FILE__), - *%w(.. libraries pacemaker cib_object)) +require ::File.expand_path('../libraries/pacemaker/cib_object', + ::File.dirname(__FILE__)) action :create do name = new_resource.name diff --git a/providers/primitive.rb b/providers/primitive.rb index 95feda3..f36a26f 100644 --- a/providers/primitive.rb +++ b/providers/primitive.rb @@ -17,8 +17,8 @@ # limitations under the License. # -require ::File.join(::File.dirname(__FILE__), *%w(.. libraries pacemaker)) -require ::File.join(::File.dirname(__FILE__), 'common') +require ::File.expand_path('../libraries/pacemaker', ::File.dirname(__FILE__)) +require ::File.expand_path('common', ::File.dirname(__FILE__)) include Chef::Mixin::PacemakerCommon diff --git a/providers/property.rb b/providers/property.rb index ddd166a..cf27ee6 100644 --- a/providers/property.rb +++ b/providers/property.rb @@ -17,8 +17,8 @@ # limitations under the License. # -require ::File.join(::File.dirname(__FILE__), - *%w(.. libraries pacemaker cib_object)) +require ::File.expand_path('../libraries/pacemaker/cib_object', + ::File.dirname(__FILE__)) action :create do name = new_resource.name diff --git a/spec/fixtures/clone_resource.rb b/spec/fixtures/clone_resource.rb index 904968c..8adf1a0 100644 --- a/spec/fixtures/clone_resource.rb +++ b/spec/fixtures/clone_resource.rb @@ -1,6 +1,6 @@ -require ::File.join(::File.dirname(__FILE__), - *%w(.. .. libraries pacemaker resource clone)) -require ::File.join(::File.dirname(__FILE__), 'keystone_primitive') +require ::File.expand_path('../../libraries/pacemaker/resource/clone', + ::File.dirname(__FILE__)) +require ::File.expand_path('keystone_primitive', ::File.dirname(__FILE__)) module Chef::RSpec module Pacemaker diff --git a/spec/fixtures/colocation_constraint.rb b/spec/fixtures/colocation_constraint.rb index 3f5e872..7c88d29 100644 --- a/spec/fixtures/colocation_constraint.rb +++ b/spec/fixtures/colocation_constraint.rb @@ -1,5 +1,5 @@ -require ::File.join(::File.dirname(__FILE__), - *%w(.. .. libraries pacemaker constraint colocation)) +require ::File.expand_path('../../libraries/pacemaker/constraint/colocation', + ::File.dirname(__FILE__)) module Chef::RSpec module Pacemaker diff --git a/spec/fixtures/keystone_primitive.rb b/spec/fixtures/keystone_primitive.rb index db48d0d..8d25e53 100644 --- a/spec/fixtures/keystone_primitive.rb +++ b/spec/fixtures/keystone_primitive.rb @@ -1,5 +1,5 @@ -require ::File.join(::File.dirname(__FILE__), - *%w(.. .. libraries pacemaker resource primitive)) +require ::File.expand_path('../../libraries/pacemaker/resource/primitive', + ::File.dirname(__FILE__)) module Chef::RSpec module Pacemaker diff --git a/spec/helpers/common_object_examples.rb b/spec/helpers/common_object_examples.rb index 1df2687..e997a2b 100644 --- a/spec/helpers/common_object_examples.rb +++ b/spec/helpers/common_object_examples.rb @@ -1,5 +1,6 @@ require 'mixlib/shellout' -require File.join(File.dirname(__FILE__), %w(.. .. libraries pacemaker cib_object)) +require File.expand_path('../../libraries/pacemaker/cib_object', + File.dirname(__FILE__)) shared_examples "a CIB object" do def expect_to_match_fixture(obj) diff --git a/spec/libraries/pacemaker/cib_object_spec.rb b/spec/libraries/pacemaker/cib_object_spec.rb index 989e539..0362b3c 100644 --- a/spec/libraries/pacemaker/cib_object_spec.rb +++ b/spec/libraries/pacemaker/cib_object_spec.rb @@ -1,8 +1,8 @@ require 'spec_helper' require 'mixlib/shellout' -require File.join(File.dirname(__FILE__), %w(.. .. .. libraries pacemaker)) -require File.join(File.dirname(__FILE__), %w(.. .. fixtures keystone_primitive)) +require File.expand_path('../../../libraries/pacemaker', File.dirname(__FILE__)) +require File.expand_path('../../fixtures/keystone_primitive', File.dirname(__FILE__)) describe Pacemaker::CIBObject do diff --git a/spec/libraries/pacemaker/constraint/colocation_spec.rb b/spec/libraries/pacemaker/constraint/colocation_spec.rb index c46a4fa..dc13dbf 100644 --- a/spec/libraries/pacemaker/constraint/colocation_spec.rb +++ b/spec/libraries/pacemaker/constraint/colocation_spec.rb @@ -1,8 +1,8 @@ require 'spec_helper' -require File.join(File.dirname(__FILE__), %w(.. .. .. .. - libraries pacemaker constraint colocation)) -require File.join(File.dirname(__FILE__), %w(.. .. .. fixtures colocation_constraint)) -require File.join(File.dirname(__FILE__), %w(.. .. .. helpers common_object_examples)) +require File.expand_path('../../../../libraries/pacemaker/constraint/colocation', + File.dirname(__FILE__)) +require File.expand_path('../../../fixtures/colocation_constraint', File.dirname(__FILE__)) +require File.expand_path('../../../helpers/common_object_examples', File.dirname(__FILE__)) describe Pacemaker::Constraint::Colocation do let(:fixture) { Chef::RSpec::Pacemaker::Config::COLOCATION_CONSTRAINT.dup } diff --git a/spec/libraries/pacemaker/resource/primitive_spec.rb b/spec/libraries/pacemaker/resource/primitive_spec.rb index 61836f9..358dcd6 100644 --- a/spec/libraries/pacemaker/resource/primitive_spec.rb +++ b/spec/libraries/pacemaker/resource/primitive_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' -require File.join(File.dirname(__FILE__), %w(.. .. .. .. libraries pacemaker resource primitive)) -require File.join(File.dirname(__FILE__), %w(.. .. .. fixtures keystone_primitive)) -require File.join(File.dirname(__FILE__), %w(.. .. .. helpers common_object_examples)) +require File.expand_path('../../../../libraries/pacemaker/resource/primitive', File.dirname(__FILE__)) +require File.expand_path('../../../fixtures/keystone_primitive', File.dirname(__FILE__)) +require File.expand_path('../../../helpers/common_object_examples', File.dirname(__FILE__)) describe Pacemaker::Resource::Primitive do let(:fixture) { Chef::RSpec::Pacemaker::Config::KEYSTONE_PRIMITIVE.dup } diff --git a/spec/libraries/pacemaker/resource_spec.rb b/spec/libraries/pacemaker/resource_spec.rb index 4f2c1be..e196912 100644 --- a/spec/libraries/pacemaker/resource_spec.rb +++ b/spec/libraries/pacemaker/resource_spec.rb @@ -1,5 +1,6 @@ require 'spec_helper' -require File.join(File.dirname(__FILE__), %w(.. .. .. libraries pacemaker resource)) +require File.expand_path('../../../libraries/pacemaker/resource', + File.dirname(__FILE__)) describe Pacemaker::Resource do describe "#running?" do diff --git a/spec/providers/colocation_spec.rb b/spec/providers/colocation_spec.rb index 9b5f78e..115dc56 100644 --- a/spec/providers/colocation_spec.rb +++ b/spec/providers/colocation_spec.rb @@ -1,7 +1,7 @@ require 'chef/application' -require File.join(File.dirname(__FILE__), %w(.. spec_helper)) -require File.join(File.dirname(__FILE__), %w(.. helpers common)) -require File.join(File.dirname(__FILE__), %w(.. fixtures colocation_constraint)) +require File.expand_path('../spec_helper', File.dirname(__FILE__)) +require File.expand_path('../helpers/common', File.dirname(__FILE__)) +require File.expand_path('../fixtures/colocation_constraint', File.dirname(__FILE__)) describe "Chef::Provider::PacemakerColocation" do # for use inside examples: diff --git a/spec/providers/primitive_spec.rb b/spec/providers/primitive_spec.rb index 7364b77..3466798 100644 --- a/spec/providers/primitive_spec.rb +++ b/spec/providers/primitive_spec.rb @@ -1,7 +1,7 @@ require 'chef/application' -require File.join(File.dirname(__FILE__), %w(.. spec_helper)) -require File.join(File.dirname(__FILE__), %w(.. helpers common)) -require File.join(File.dirname(__FILE__), %w(.. fixtures keystone_primitive)) +require File.expand_path('../spec_helper', File.dirname(__FILE__)) +require File.expand_path('../helpers/common', File.dirname(__FILE__)) +require File.expand_path('../fixtures/keystone_primitive', File.dirname(__FILE__)) describe "Chef::Provider::PacemakerPrimitive" do # for use inside examples: