saxaphone 0.5.3 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/saxaphone/element.rb +41 -5
- data/test/element_test.rb +29 -19
- metadata +10 -5
data/lib/saxaphone/element.rb
CHANGED
@@ -9,14 +9,17 @@ module Saxaphone
|
|
9
9
|
|
10
10
|
@element_handlers = {}
|
11
11
|
@stored_attributes = Set.new
|
12
|
+
@attribute_aliases = {}
|
12
13
|
|
13
14
|
class << self
|
14
15
|
attr_accessor :element_handlers
|
15
16
|
attr_accessor :stored_attributes
|
17
|
+
attr_accessor :attribute_aliases
|
16
18
|
|
17
19
|
def inherited(base)
|
18
|
-
base.element_handlers
|
19
|
-
base.stored_attributes
|
20
|
+
base.element_handlers = element_handlers.dup
|
21
|
+
base.stored_attributes = stored_attributes.dup
|
22
|
+
base.attribute_aliases = attribute_aliases.dup
|
20
23
|
end
|
21
24
|
|
22
25
|
# A block can be passed to <tt>setup</tt>,
|
@@ -87,10 +90,12 @@ module Saxaphone
|
|
87
90
|
#
|
88
91
|
# element.attributes # => {"dollars" => "4.33"}
|
89
92
|
def element_attribute(element_name, options = {})
|
90
|
-
|
93
|
+
if as = options.delete(:as)
|
94
|
+
attribute_aliases[element_name] = as
|
95
|
+
end
|
91
96
|
|
92
97
|
has_element(element_name) do |element|
|
93
|
-
|
98
|
+
assign_attribute_value(element.name, element.content)
|
94
99
|
end
|
95
100
|
end
|
96
101
|
|
@@ -158,6 +163,29 @@ module Saxaphone
|
|
158
163
|
self.stored_attributes += attribute_names.flatten.to_set
|
159
164
|
end
|
160
165
|
|
166
|
+
# Define a white listed attribute that is extracted
|
167
|
+
# from the XML element and stored in the attribute hash:
|
168
|
+
#
|
169
|
+
# WidgetElement < Saxaphone::Element
|
170
|
+
# store_attribute 'href', as: 'uri'
|
171
|
+
# end
|
172
|
+
#
|
173
|
+
# element = WidgetElement.parse %{
|
174
|
+
# <widget href="http://www.example.com" color="red" price="3.21">
|
175
|
+
# ...
|
176
|
+
# </widget>
|
177
|
+
# }
|
178
|
+
#
|
179
|
+
# element.attributes # => {"uri" => "http://www.example.com"}
|
180
|
+
#
|
181
|
+
def store_attribute(attribute_name, options = {})
|
182
|
+
if as = options.delete(:as)
|
183
|
+
attribute_aliases[attribute_name] = as
|
184
|
+
end
|
185
|
+
|
186
|
+
self.stored_attributes << attribute_name
|
187
|
+
end
|
188
|
+
|
161
189
|
def handler_for(element_name)
|
162
190
|
element_handlers[element_name] || element_handlers['*']
|
163
191
|
end
|
@@ -171,7 +199,11 @@ module Saxaphone
|
|
171
199
|
def initialize(name = '', content = '', attribute_array = [])
|
172
200
|
self.name = name
|
173
201
|
self.content = content
|
174
|
-
self.attributes =
|
202
|
+
self.attributes = {}
|
203
|
+
attribute_array.each do |key, value|
|
204
|
+
assign_attribute_value(key, value) if self.class.stored_attributes.include?(key)
|
205
|
+
end
|
206
|
+
# self.attributes = Hash[attribute_array.select { |(key, value)| self.class.stored_attributes.include?(key) }]
|
175
207
|
setup
|
176
208
|
end
|
177
209
|
|
@@ -193,6 +225,10 @@ module Saxaphone
|
|
193
225
|
|
194
226
|
end
|
195
227
|
|
228
|
+
def assign_attribute_value(key, value)
|
229
|
+
attributes[self.class.attribute_aliases[key] || key] = value
|
230
|
+
end
|
231
|
+
|
196
232
|
def append_content(string)
|
197
233
|
content << string
|
198
234
|
end
|
data/test/element_test.rb
CHANGED
@@ -16,7 +16,27 @@ class Saxaphone::ElementTest < MiniTest::Spec
|
|
16
16
|
assert_equal 'hola', element.setup_attr
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
19
|
+
def test_accessors_inheritence
|
20
|
+
parent = Class.new(Saxaphone::Element) do
|
21
|
+
has_element 'foo'
|
22
|
+
store_attributes 'faz'
|
23
|
+
end
|
24
|
+
|
25
|
+
child = Class.new(parent) do
|
26
|
+
has_element 'bar'
|
27
|
+
store_attribute 'baz', as: 'moo'
|
28
|
+
end
|
29
|
+
|
30
|
+
assert_equal ['foo'].to_set, parent.element_handlers.keys.to_set
|
31
|
+
assert_equal ['faz'].to_set, parent.stored_attributes
|
32
|
+
assert_equal({}, parent.attribute_aliases)
|
33
|
+
|
34
|
+
assert_equal ['foo', 'bar'].to_set, child.element_handlers.keys.to_set
|
35
|
+
assert_equal ['faz', 'baz'].to_set, child.stored_attributes
|
36
|
+
assert_equal({'baz' => 'moo'}, child.attribute_aliases)
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_store_attributes
|
20
40
|
element = Class.new(Saxaphone::Element) do
|
21
41
|
store_attributes 'a', 'm'
|
22
42
|
end.new('foo', 'bar', [['a', 'b'], ['m', 'n'], ['x', 'y']])
|
@@ -26,6 +46,14 @@ class Saxaphone::ElementTest < MiniTest::Spec
|
|
26
46
|
assert_equal({'a' => 'b', 'm' => 'n'}, element.attributes)
|
27
47
|
end
|
28
48
|
|
49
|
+
def test_store_attribute
|
50
|
+
element = Class.new(Saxaphone::Element) do
|
51
|
+
store_attribute 'm', as: 'n'
|
52
|
+
end.new('foo', 'bar', [['a', 'b'], ['m', 'o']])
|
53
|
+
|
54
|
+
assert_equal({'n' => 'o'}, element.attributes)
|
55
|
+
end
|
56
|
+
|
29
57
|
def test_element_attributes
|
30
58
|
element = define_element do
|
31
59
|
element_attributes %w(foo bar)
|
@@ -122,24 +150,6 @@ class Saxaphone::ElementTest < MiniTest::Spec
|
|
122
150
|
# silence?
|
123
151
|
end
|
124
152
|
|
125
|
-
def test_attributes_inherited
|
126
|
-
parent = Class.new(Saxaphone::Element) do
|
127
|
-
has_element 'foo'
|
128
|
-
store_attributes 'faz'
|
129
|
-
end
|
130
|
-
|
131
|
-
child = Class.new(parent) do
|
132
|
-
has_element 'bar'
|
133
|
-
store_attributes 'baz'
|
134
|
-
end
|
135
|
-
|
136
|
-
assert_equal ['foo'].to_set, parent.element_handlers.keys.to_set
|
137
|
-
assert_equal ['faz'].to_set, parent.stored_attributes
|
138
|
-
|
139
|
-
assert_equal ['foo', 'bar'].to_set, child.element_handlers.keys.to_set
|
140
|
-
assert_equal ['faz', 'baz'].to_set, child.stored_attributes
|
141
|
-
end
|
142
|
-
|
143
153
|
private
|
144
154
|
def define_element(&block)
|
145
155
|
Class.new(Saxaphone::Element, &block).new
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: saxaphone
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-07-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nokogiri
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,7 +21,12 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
25
30
|
description: Use objects
|
26
31
|
email: developer@matthewhiggins.com
|
27
32
|
executables: []
|
@@ -59,7 +64,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
59
64
|
version: 1.3.5
|
60
65
|
requirements: []
|
61
66
|
rubyforge_project:
|
62
|
-
rubygems_version: 1.8.
|
67
|
+
rubygems_version: 1.8.24
|
63
68
|
signing_key:
|
64
69
|
specification_version: 3
|
65
70
|
summary: Object Oriented SAX Parsing
|