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