diff options
author | Daniel Pittman <daniel@puppetlabs.com> | 2011-01-31 11:24:06 -0800 |
---|---|---|
committer | Daniel Pittman <daniel@rimspace.net> | 2011-01-31 11:24:06 -0800 |
commit | ecd7cda64bdf3c8cd97b7c05f9cf7eb890d3682b (patch) | |
tree | 6c07ee88a921caee62d88e3a0bb8cdcb3efbdeed | |
parent | d9b8f2ad68626b8655d98a8d9037283f671f86bb (diff) | |
parent | b88a088c6e53ef96914280e6937b9b9214b6c64b (diff) | |
download | facter-ecd7cda64bdf3c8cd97b7c05f9cf7eb890d3682b.tar.gz facter-ecd7cda64bdf3c8cd97b7c05f9cf7eb890d3682b.tar.xz facter-ecd7cda64bdf3c8cd97b7c05f9cf7eb890d3682b.zip |
Merge branch 'bug/next/5510-deterministic-fact-load-order' into next
-rw-r--r-- | lib/facter/util/loader.rb | 4 | ||||
-rwxr-xr-x | spec/unit/util/loader_spec.rb | 43 |
2 files changed, 45 insertions, 2 deletions
diff --git a/lib/facter/util/loader.rb b/lib/facter/util/loader.rb index ac90c48..2d2d9e8 100644 --- a/lib/facter/util/loader.rb +++ b/lib/facter/util/loader.rb @@ -30,7 +30,7 @@ class Facter::Util::Loader search_path.each do |dir| next unless FileTest.directory?(dir) - Dir.entries(dir).each do |file| + Dir.entries(dir).sort.each do |file| path = File.join(dir, file) if File.directory?(path) load_dir(path) @@ -62,7 +62,7 @@ class Facter::Util::Loader def load_dir(dir) return if dir =~ /\/\.+$/ or dir =~ /\/util$/ or dir =~ /\/lib$/ - Dir.entries(dir).find_all { |f| f =~ /\.rb$/ }.each do |file| + Dir.entries(dir).find_all { |f| f =~ /\.rb$/ }.sort.each do |file| load_file(File.join(dir, file)) end end diff --git a/spec/unit/util/loader_spec.rb b/spec/unit/util/loader_spec.rb index 0bb823e..eed533a 100755 --- a/spec/unit/util/loader_spec.rb +++ b/spec/unit/util/loader_spec.rb @@ -4,6 +4,20 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper') require 'facter/util/loader' + +# loader subclass for making assertions about file/directory ordering +class TestLoader < Facter::Util::Loader + def loaded_files + @loaded_files ||= [] + end + + def load_file(file) + loaded_files << file + super + end +end + + describe Facter::Util::Loader do def with_env(values) old = {} @@ -96,6 +110,21 @@ describe Facter::Util::Loader do @loader.load(:testing) end + it 'should load any ruby files in directories matching the fact name in the search path in sorted order regardless of the order returned by Dir.entries' do + @loader = TestLoader.new + + @loader.stubs(:search_path).returns %w{/one/dir} + FileTest.stubs(:exist?).returns false + FileTest.stubs(:directory?).with("/one/dir/testing").returns true + @loader.stubs(:search_path).returns %w{/one/dir} + + Dir.stubs(:entries).with("/one/dir/testing").returns %w{foo.rb bar.rb} + %w{/one/dir/testing/foo.rb /one/dir/testing/bar.rb}.each { |f| File.stubs(:directory?).with(f).returns false } + + @loader.load(:testing) + @loader.loaded_files.should == %w{/one/dir/testing/bar.rb /one/dir/testing/foo.rb} + end + it "should load any ruby files in directories matching the fact name in the search path" do @loader.expects(:search_path).returns %w{/one/dir} FileTest.stubs(:exist?).returns false @@ -166,6 +195,20 @@ describe Facter::Util::Loader do @loader.load_all end + it 'should load all files in sorted order for any given directory regardless of the order returned by Dir.entries' do + @loader = TestLoader.new + + @loader.stubs(:search_path).returns %w{/one/dir} + Dir.stubs(:entries).with("/one/dir").returns %w{foo.rb bar.rb} + + %w{/one/dir}.each { |f| File.stubs(:directory?).with(f).returns true } + %w{/one/dir/foo.rb /one/dir/bar.rb}.each { |f| File.stubs(:directory?).with(f).returns false } + + @loader.load_all + + @loader.loaded_files.should == %w{/one/dir/bar.rb /one/dir/foo.rb} + end + it "should not load files in the util subdirectory" do @loader.expects(:search_path).returns %w{/one/dir} |