Property stream format:
line separator is \r?\n. 1 line per a property. line which begins with '#' is a comment line. empty line is ignored, too. key/value separator is ':' or '='. '\' as escape character. but line separator cannot be escaped. \s at the head/tail of key/value are trimmed. '[' + key + ']' indicates property section. for example, [aaa.bbb] ccc = ddd eee.fff = ggg [] aaa.hhh = iii is the same as; aaa.bbb.ccc = ddd aaa.bbb.eee.fff = ggg aaa.hhh = iii
# File soap/property.rb, line 51 def self.load(stream) new.load(stream) end
value: an Object key is generated by property
# File soap/property.rb, line 122 def <<(value) self[generate_new_key] = value end
name: a Symbol, String or an Array
# File soap/property.rb, line 105 def [](name) referent(name_to_a(name)) end
name: a Symbol, String or an Array value: an Object
# File soap/property.rb, line 111 def []=(name, value) name_pair = name_to_a(name).freeze hooks = assign(name_pair, value) hooks.each do |hook| hook.call(name_pair, value) end value end
name: a Symbol, String or an Array; nil means hook to the root cascade: true/false; for cascading hook of sub key hook: block which will be called with 2 args, name and value
# File soap/property.rb, line 129 def add_hook(name = nil, cascade = false, &hook) if name == nil or name == true or name == false cascade = name assign_self_hook(cascade, &hook) else assign_hook(name_to_a(name), cascade, &hook) end end
# File soap/property.rb, line 138 def each @store.each do |key, value| yield(key, value) end end
# File soap/property.rb, line 71 def load(stream) key_prefix = "" stream.each_with_index do |line, lineno| line.sub!(/\r?\n\z/, '') case line when COMMENT_REGEXP next when CATDEF_REGEXP key_prefix = $1.strip when LINE_REGEXP key, value = $1.strip, $2.strip key = "#{key_prefix}.#{key}" unless key_prefix.empty? key, value = loadstr(key), loadstr(value) self[key] = value else raise TypeError.new( "property format error at line #{lineno + 1}: `#{line}'") end end self end
find property from $:.
# File soap/property.rb, line 94 def loadproperty(propname) return loadpropertyfile(propname) if File.file?(propname) $:.each do |path| if File.file?(file = File.join(path, propname)) return loadpropertyfile(file) end end nil end
# File soap/property.rb, line 156 def lock(cascade = false) if cascade each_key do |key| key.lock(cascade) end end @locked = true self end
# File soap/property.rb, line 182 def deref_key(key) check_lock(key) ref = @store[key] ||= self.class.new unless propkey?(ref) raise ArgumentError.new("key `#{key}' already defined as a value") end ref end
# File soap/property.rb, line 199 def local_assign(key, value) check_lock(key) if @locked if propkey?(value) raise FrozenError.new("cannot add any key to locked property") elsif propkey?(@store[key]) raise FrozenError.new("cannot override any key in locked property") end end @store[key] = value end
# File soap/property.rb, line 219 def local_assign_hook(key, cascade, &hook) check_lock(key) @store[key] ||= nil (@hook[key] ||= []) << [hook, cascade] end