lib/ihl_ruby/config.rb in yore-0.0.3 vs lib/ihl_ruby/config.rb in yore-0.0.4
- old
+ new
@@ -1,5 +1,10 @@
+require 'rubygems'
+gem 'RequirePaths'; require 'require_paths'
+require_paths '..'
+require 'ihl_ruby/xml_utils'
+
class ConfigClass < Hash
attr_reader :default_values
def initialize(aDefaultValues,aNewValues=nil,&aBlock)
@@ -101,7 +106,97 @@
def to_hash
{}.merge(self)
end
+end
+
+class ConfigXmlClass < ConfigClass
+ attr_accessor :xmlRoot
+ def initialize(aDefaultValues,aConfig)
+ return super(aDefaultValues,aConfig) unless aConfig.is_a?(REXML::Element)
+ @xmlRoot = aConfig.deep_clone
+ super(aDefaultValues,XmlUtils.read_simple_items(@xmlRoot,'/Yore/SimpleItems'))
+ end
+end
+
+# credentials files look like :
+#<?xml version="1.0" encoding="UTF-8"?>
+#<Credentials>
+# <SimpleItems namespace="global">
+# <Item name=""></Item>
+# <Item name=""></Item>
+# <Item name=""></Item>
+# </SimpleItems>
+# <SimpleItems namespace="yore_test">
+# <Item name=""></Item>
+# <Item name=""></Item>
+# <Item name=""></Item>
+# </SimpleItems>
+#</Credentials>
+#
+# global .credentials.xml file
+# local .credentials.xml file
+# cred = Credentials.new() # optionally specify filename or path or hash. if nil then use Dir.pwd
+#
+# def initialize(aSource)
+# # load global namespace from ~/.credentials.xml
+# # load global namespace from local .credentials.xml
+# # load given namespace from ~/.credentials.xml
+# # load given namespace from local .credentials.xml
+# # merge all top to bottom
+class Credentials < Hash
+
+ CRED_FILENAME = ".credentials.xml"
+
+ def find_file_upwards(aFilename,aStartPath=nil)
+ aStartPath ||= Dir.pwd
+ return nil if aFilename.nil? || aFilename.empty?
+ arrPath = aStartPath.split(File::SEPARATOR)
+ while arrPath.length > 0
+ path = File.join(arrPath.join(File::SEPARATOR),aFilename)
+ return path if File.exists?(path)
+ arrPath.pop
+ end
+ return nil
+ end
+
+ def get_all_credentials(aXmlRoot)
+ return nil unless aXmlRoot
+ result = {}
+ REXML::XPath.each(aXmlRoot, '/Credentials/SimpleItems') do |si|
+ ns = si.attributes['Namespace']
+ values = XmlUtils.read_simple_items(si)
+ result[ns.to_sym] = values.symbolize_keys if ns && values
+ end
+ return result
+ end
+
+ #XmlUtils.read_simple_items(@xmlRoot,'/Yore/SimpleItems')
+ def get_user_credentials
+ return get_all_credentials(XmlUtils.get_file_root(File.join(HOME_PATH,CRED_FILENAME)))
+ end
+
+ def get_local_credentials(aSource=nil)
+ aSource ||= Dir.pwd
+ # assume source is a directory path, but other types could be supported later
+ return nil unless file=find_file_upwards(CRED_FILENAME,aSource)
+ return get_all_credentials(XmlUtils.get_file_root(file))
+ end
+
+ def initialize(aNamespace=nil,aSource=nil)
+ #HOME_PATH can be preset by tests eg. ::Credentials.const_set('HOME_PATH',@user_dir)
+ Credentials.const_set("HOME_PATH", ENV['HOME']) unless Credentials.const_defined? "HOME_PATH"
+ arrCredentials = []
+ user_credentials = get_user_credentials()
+ local_credentials = get_local_credentials(aSource)
+ arrCredentials << user_credentials[:global] if user_credentials
+ arrCredentials << local_credentials[:global] if local_credentials
+ arrCredentials << user_credentials[aNamespace.to_sym] if aNamespace && user_credentials
+ arrCredentials << local_credentials[aNamespace.to_sym] if aNamespace && local_credentials
+ arrCredentials.compact!
+ arrCredentials.each do |c|
+ self.merge!(c)
+ end
+ end
end