| In: |
soap/property.rb
|
| Parent: | Object |
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
| KEY_REGSRC | = | '([^=:\\\\]*(?:\\\\.[^=:\\\\]*)*)' |
| DEF_REGSRC | = | '\\s*' + KEY_REGSRC + '\\s*[=:]\\s*(.*)' |
| COMMENT_REGEXP | = | Regexp.new('^(?:#.*|)$') |
| CATDEF_REGEXP | = | Regexp.new("^\\[\\s*#{KEY_REGSRC}\\s*\\]$") |
| LINE_REGEXP | = | Regexp.new("^#{DEF_REGSRC}$") |
| NO_HOOK | = | [].freeze |
find property from $:.
# File soap/property.rb, line 46 def self.loadproperty(propname) $:.each do |path| if File.file?(file = File.join(path, propname)) return open(file) end end nil end
# File soap/property.rb, line 55 def initialize @store = Hash.new @hook = Hash.new @self_hook = Array.new @locked = false end
value: an Object key is generated by property
# File soap/property.rb, line 108 def <<(value) self[generate_new_key] = value end
name: a Symbol, String or an Array
# File soap/property.rb, line 91 def [](name) referent(name_to_a(name)) end
name: a Symbol, String or an Array value: an Object
# File soap/property.rb, line 97 def []=(name, value) hooks = assign(name_to_a(name), value) normalized_name = normalize_name(name) hooks.each do |hook| hook.call(normalized_name, value) end value end
name: a Symbol, String or an Array. nil means hook to the root hook: block which will be called with 2 args, name and value
# File soap/property.rb, line 114 def add_hook(name = nil, &hook) if name.nil? assign_self_hook(&hook) else assign_hook(name_to_a(name), &hook) end end
# File soap/property.rb, line 67 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 = eval("\"#{key}\"") value = eval("\"#{value}\"") self[key] = value else raise TypeError.new( "property format error at line #{lineno + 1}: `#{line}'") end end self end
# File soap/property.rb, line 140 def lock(cascade = false) if cascade each_key do |key| key.lock(cascade) end end @locked = true self end