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 =

COMMENT_REGEXP = Regexp.new(‘^(?:#.*|)$’, nil, ‘u’) CATDEF_REGEXP = KEY_REGSRC\\s*\\">Regexp.new(“^\$”, nil, ‘u’) LINE_REGEXP = Regexp.new(“^#DEF_REGSRC$”, nil, ‘u’)

Regexp.new('^(?:#.*|)$')
CATDEF_REGEXP =

RubyJedi: Attempt at 1.9 Compatibility // , nil, ‘u’)

Regexp.new("^\\[\\s*#{KEY_REGSRC}\\s*\\]$")
LINE_REGEXP =

RubyJedi: Attempt at 1.9 Compatibility // , nil, ‘u’)

Regexp.new("^#{DEF_REGSRC}$")

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeProperty

Returns a new instance of Property.



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

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

Class Method Details

.load(stream) ⇒ Object



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

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

.loadproperty(propname) ⇒ Object



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

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

Instance Method Details

#<<(value) ⇒ Object

value: an Object key is generated by property



133
134
135
# File 'lib/soap/property.rb', line 133

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

#[](name) ⇒ Object

name: a Symbol, String or an Array



116
117
118
# File 'lib/soap/property.rb', line 116

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

#[]=(name, value) ⇒ Object

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



122
123
124
125
126
127
128
129
# File 'lib/soap/property.rb', line 122

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



140
141
142
143
144
145
146
147
# File 'lib/soap/property.rb', line 140

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



149
150
151
152
153
# File 'lib/soap/property.rb', line 149

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

#empty?Boolean

Returns:

  • (Boolean)


155
156
157
# File 'lib/soap/property.rb', line 155

def empty?
  @store.empty?
end

#keysObject



159
160
161
# File 'lib/soap/property.rb', line 159

def keys
  @store.keys
end

#load(stream) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/soap/property.rb', line 77

def load(stream)
  key_prefix = ""
  if stream.respond_to?(:each_line) # Ruby 1.9 and beyond
    stream = stream.each_line      
  elsif stream.respond_to?(:lines) # RubyJedi: compatible with Ruby 1.8.6
    stream = stream.lines
  end
  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 $:.



105
106
107
108
109
110
111
112
113
# File 'lib/soap/property.rb', line 105

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



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

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

#locked?Boolean

Returns:

  • (Boolean)


187
188
189
# File 'lib/soap/property.rb', line 187

def locked?
  @locked
end

#unlock(cascade = false) ⇒ Object



177
178
179
180
181
182
183
184
185
# File 'lib/soap/property.rb', line 177

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

#valuesObject



163
164
165
# File 'lib/soap/property.rb', line 163

def values
  @store.values
end