Class: SOAP::Property

Inherits:
Object show all
Includes:
Enumerable
Defined in:
lib/soap/property.rb

Overview

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

Defined Under Namespace

Modules: Util

Constant Summary collapse

FrozenError =
(RUBY_VERSION >= "1.9.0") ? RuntimeError : TypeError
KEY_REGSRC =
'([^=:\\\\]*(?:\\\\.[^=:\\\\]*)*)'
DEF_REGSRC =
'\\s*' + KEY_REGSRC + '\\s*[=:]\\s*(.*)'
COMMENT_REGEXP =
Regexp.new('^(?:#.*|)$', nil, 'u')
CATDEF_REGEXP =
Regexp.new("^\\[\\s*#{KEY_REGSRC}\\s*\\]$", nil, 'u')
LINE_REGEXP =
Regexp.new("^#{DEF_REGSRC}$", nil, 'u')

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Enumerable

#inject

Constructor Details

#initializeProperty

Returns a new instance of Property.



59
60
61
62
63
64
# File 'lib/soap/property.rb', line 59

def initialize
  @store = Hash.new
  @hook = Hash.new
  @self_hook = Array.new
  @locked = false
end

Class Method Details

.load(stream) ⇒ Object



51
52
53
# File 'lib/soap/property.rb', line 51

def self.load(stream)
  new.load(stream)
end

.loadproperty(propname) ⇒ Object



55
56
57
# File 'lib/soap/property.rb', line 55

def self.loadproperty(propname)
  new.loadproperty(propname)
end

Instance Method Details

#<<(value) ⇒ Object

value: an Object key is generated by property



122
123
124
# File 'lib/soap/property.rb', line 122

def <<(value)
  self[generate_new_key] = value
end

#[](name) ⇒ Object

name: a Symbol, String or an Array



105
106
107
# File 'lib/soap/property.rb', line 105

def [](name)
  referent(name_to_a(name))
end

#[]=(name, value) ⇒ Object

name: a Symbol, String or an Array value: an Object



111
112
113
114
115
116
117
118
# File 'lib/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) ⇒ Object

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



129
130
131
132
133
134
135
136
# File 'lib/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

#eachObject



138
139
140
141
142
# File 'lib/soap/property.rb', line 138

def each
  @store.each do |key, value|
    yield(key, value)
  end
end

#empty?Boolean

Returns:

  • (Boolean)


144
145
146
# File 'lib/soap/property.rb', line 144

def empty?
  @store.empty?
end

#keysObject



148
149
150
# File 'lib/soap/property.rb', line 148

def keys
  @store.keys
end

#load(stream) ⇒ Object



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/soap/property.rb', line 71

def load(stream)
  key_prefix = ""
  stream.each_with_index do |line, lineno|
    line.sub!(/\r?\n\z/u, '')
    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) ⇒ Object

find property from $:.



94
95
96
97
98
99
100
101
102
# File 'lib/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) ⇒ Object



156
157
158
159
160
161
162
163
164
# File 'lib/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?Boolean

Returns:

  • (Boolean)


176
177
178
# File 'lib/soap/property.rb', line 176

def locked?
  @locked
end

#unlock(cascade = false) ⇒ Object



166
167
168
169
170
171
172
173
174
# File 'lib/soap/property.rb', line 166

def unlock(cascade = false)
  @locked = false
  if cascade
    each_key do |key|
	key.unlock(cascade)
    end
  end
  self
end

#valuesObject



152
153
154
# File 'lib/soap/property.rb', line 152

def values
  @store.values
end