summaryrefslogtreecommitdiffstats
path: root/lib/puppet/string/string_collection.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/puppet/string/string_collection.rb')
-rw-r--r--lib/puppet/string/string_collection.rb66
1 files changed, 22 insertions, 44 deletions
diff --git a/lib/puppet/string/string_collection.rb b/lib/puppet/string/string_collection.rb
index e9cba7f55..45a192703 100644
--- a/lib/puppet/string/string_collection.rb
+++ b/lib/puppet/string/string_collection.rb
@@ -26,61 +26,39 @@ module Puppet::String::StringCollection
return @strings.keys
end
- def self.versions(name)
- versions = []
- $LOAD_PATH.each do |dir|
- next unless FileTest.directory?(dir)
- v_dir = File.join dir, %w[puppet string v*]
- Dir.glob(File.join v_dir, "#{name}{.rb,/*.rb}").each do |f|
- v = f.sub(%r[.*/v([^/]+?)/#{name}(?:(?:/[^/]+)?.rb)$], '\1')
- if validate_version(v)
- versions << v
- else
- warn "'#{v}' (#{f}) is not a valid version string; skipping"
- end
- end
- end
- return versions.uniq.sort { |a, b| compare_versions(a, b) }
- end
-
def self.validate_version(version)
!!(SEMVER_VERSION =~ version.to_s)
end
- def self.compare_versions(a, b)
- a, b = [a, b].map do |x|
- parts = SEMVER_VERSION.match(x).to_a[1..4]
- parts[0..2] = parts[0..2].map { |e| e.to_i }
- parts
- end
-
- cmp = a[0..2] <=> b[0..2]
- if cmp == 0
- cmp = a[3] <=> b[3]
- cmp = +1 if a[3].empty? && !b[3].empty?
- cmp = -1 if b[3].empty? && !a[3].empty?
- end
- cmp
- end
-
def self.[](name, version)
- version = versions(name).last if version == :latest
- unless version.nil?
- @strings[underscorize(name)][version] if string?(name, version)
- end
+ @strings[underscorize(name)][version] if string?(name, version)
end
def self.string?(name, version)
- version = versions(name).last if version == :latest
- return false if version.nil?
-
name = underscorize(name)
+ cache = @strings[name]
+ return true if cache.has_key?(version)
- unless @strings.has_key?(name) && @strings[name].has_key?(version)
- require "puppet/string/v#{version}/#{name}"
+ loaded = cache.keys
+
+ files = ["puppet/string/#{name}"]
+ unless version == :current
+ files << "#{name}@#{version}/puppet/string/#{name}"
end
- return @strings.has_key?(name) && @strings[name].has_key?(version)
- rescue LoadError
+
+ files.each do |file|
+ begin
+ require file
+ if version == :current || !file.include?('@')
+ loaded = (cache.keys - loaded).first
+ cache[:current] = cache[loaded] unless loaded.nil?
+ end
+ return true if cache.has_key?(version)
+ rescue LoadError
+ # pass
+ end
+ end
+
return false
end