In Files

  • soap/property.rb

Class/Module Index [+]

Quicksearch

SOAP::Property

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

Public Class Methods

load(stream) click to toggle source
 
               # File soap/property.rb, line 51
def self.load(stream)
  new.load(stream)
end
            
loadproperty(propname) click to toggle source
 
               # File soap/property.rb, line 55
def self.loadproperty(propname)
  new.loadproperty(propname)
end
            
new() click to toggle source
 
               # File soap/property.rb, line 59
def initialize
  @store = Hash.new
  @hook = Hash.new
  @self_hook = Array.new
  @locked = false
end
            

Public Instance Methods

<<(value) click to toggle source

value: an Object key is generated by property

 
               # File soap/property.rb, line 122
def <<(value)
  self[generate_new_key] = value
end
            
[](name) click to toggle source

name: a Symbol, String or an Array

 
               # File soap/property.rb, line 105
def [](name)
  referent(name_to_a(name))
end
            
[]=(name, value) click to toggle source

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
            
add_hook(name = nil, cascade = false, &hook) click to toggle source

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
            
each() click to toggle source
 
               # File soap/property.rb, line 138
def each
  @store.each do |key, value|
    yield(key, value)
  end
end
            
empty?() click to toggle source
 
               # File soap/property.rb, line 144
def empty?
  @store.empty?
end
            
keys() click to toggle source
 
               # File soap/property.rb, line 148
def keys
  @store.keys
end
            
load(stream) click to toggle source
 
               # 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
            
loadproperty(propname) click to toggle source

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
            
lock(cascade = false) click to toggle source
 
               # 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
            
locked?() click to toggle source
 
               # File soap/property.rb, line 176
def locked?
  @locked
end
            
unlock(cascade = false) click to toggle source
 
               # File soap/property.rb, line 166
def unlock(cascade = false)
  @locked = false
  if cascade
    each_key do |key|
      key.unlock(cascade)
    end
  end
  self
end
            
values() click to toggle source
 
               # File soap/property.rb, line 152
def values
  @store.values
end
            

Protected Instance Methods

deref_key(key) click to toggle source
 
               # 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
            
local_assign(key, value) click to toggle source
 
               # 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
            
local_assign_hook(key, cascade, &hook) click to toggle source
 
               # File soap/property.rb, line 219
def local_assign_hook(key, cascade, &hook)
  check_lock(key)
  @store[key] ||= nil
  (@hook[key] ||= []) << [hook, cascade]
end
            
local_hook(key, direct) click to toggle source
 
               # File soap/property.rb, line 211
def local_hook(key, direct)
  hooks = []
  (@self_hook + (@hook[key] || NO_HOOK)).each do |hook, cascade|
    hooks << hook if direct or cascade
  end
  hooks
end
            
local_referent(key) click to toggle source
 
               # File soap/property.rb, line 191
def local_referent(key)
  check_lock(key)
  if propkey?(@store[key]) and @store[key].locked?
    raise FrozenError.new("cannot split any key from locked property")
  end
  @store[key]
end
            

Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.

If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.

If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.

If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.

blog comments powered by Disqus