sax_stream 1.0.10 → 1.1.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.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 82bb680bba7d2bcd8a63f9a4c2aa32df0bfe54b4
|
4
|
+
data.tar.gz: da983be14a8e7987696782d022e968977e8cb433
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2a05a4969707727138d3e6990c669219728f5a6602b88ac8710c766c6e92fa94f58bf049ba375011d769e58de8f059df14a9f6659235cfdcbba4513b61c56c68
|
7
|
+
data.tar.gz: e8bc73f976ccac10a0541eb8f7dbaccc2db2d2789e848a19bce8848ec5b5a13a9de00be8c71f988549f17a09515d69a0af371673407e73f66c6ec6a6c3d96c7b
|
@@ -19,6 +19,10 @@ module SaxStream
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
+
def relative_attributes
|
23
|
+
@attrs
|
24
|
+
end
|
25
|
+
|
22
26
|
def content
|
23
27
|
@content
|
24
28
|
end
|
@@ -77,6 +81,10 @@ module SaxStream
|
|
77
81
|
@elements.last.attributes(path)
|
78
82
|
end
|
79
83
|
|
84
|
+
def relative_attributes
|
85
|
+
@elements.last.relative_attributes
|
86
|
+
end
|
87
|
+
|
80
88
|
def record_characters(string)
|
81
89
|
# indented_puts " record: #{string.inspect}"
|
82
90
|
if @elements.last
|
@@ -0,0 +1,124 @@
|
|
1
|
+
module SaxStream
|
2
|
+
module Internal
|
3
|
+
class FieldMappings
|
4
|
+
class MappingOptions
|
5
|
+
def initialize(element, key)
|
6
|
+
@element = element
|
7
|
+
@key = key
|
8
|
+
@attributes = parse_attributes(key) if key.is_a?(String)
|
9
|
+
end
|
10
|
+
|
11
|
+
def element
|
12
|
+
@element
|
13
|
+
end
|
14
|
+
|
15
|
+
def allows_mapping?(key, attributes)
|
16
|
+
compare_attributes(attributes)
|
17
|
+
end
|
18
|
+
|
19
|
+
def method_missing(name, *params)
|
20
|
+
@element.send(name, *params)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def parse_attributes(key)
|
26
|
+
matches = key.match(/\[(.*)\]/)
|
27
|
+
if matches
|
28
|
+
return hashify_attribute(matches[1])
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def hashify_attribute(string)
|
33
|
+
parts = string.split('=')
|
34
|
+
{parts[0] => parts[1]}
|
35
|
+
end
|
36
|
+
|
37
|
+
def compare_attributes(attributes)
|
38
|
+
return true unless @attributes
|
39
|
+
|
40
|
+
attributes_hash = Hash[*attributes.flatten]
|
41
|
+
|
42
|
+
result = !@attributes.detect do |key, value|
|
43
|
+
inner_result = attributes_hash[key] != value
|
44
|
+
inner_result
|
45
|
+
end
|
46
|
+
result
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def initialize
|
51
|
+
@mappings ||= CoreExtensions::OrderedHash.new
|
52
|
+
end
|
53
|
+
|
54
|
+
def store(key, mapping)
|
55
|
+
parsed_key = build_key_from_array(key)
|
56
|
+
new_value = MappingOptions.new(mapping, key)
|
57
|
+
|
58
|
+
if class_mappings[parsed_key]
|
59
|
+
unless class_mappings[parsed_key].is_a?(Array)
|
60
|
+
old_value = class_mappings[parsed_key]
|
61
|
+
class_mappings[parsed_key] = [old_value]
|
62
|
+
end
|
63
|
+
class_mappings[parsed_key] << new_value
|
64
|
+
puts "stored array for #{parsed_key}"
|
65
|
+
else
|
66
|
+
class_mappings[parsed_key] = new_value
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def class_mappings
|
71
|
+
@mappings
|
72
|
+
end
|
73
|
+
|
74
|
+
def field_mapping(key, attributes = [])
|
75
|
+
result = find_non_regex_mapping(key) || regex_field_mapping(key)
|
76
|
+
|
77
|
+
unless result.is_a?(Array)
|
78
|
+
result = [result]
|
79
|
+
end
|
80
|
+
result.compact!
|
81
|
+
|
82
|
+
result.detect do |one_result|
|
83
|
+
one_result.element if one_result.allows_mapping?(key, attributes)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
private
|
88
|
+
|
89
|
+
def find_non_regex_mapping(key)
|
90
|
+
class_mappings[key]
|
91
|
+
end
|
92
|
+
|
93
|
+
def regex_field_mapping(key)
|
94
|
+
regex_mappings.each do |regex, mapping|
|
95
|
+
return mapping if regex =~ key
|
96
|
+
end
|
97
|
+
nil
|
98
|
+
end
|
99
|
+
|
100
|
+
def regex_mappings
|
101
|
+
@regex_mappings ||= class_mappings.reject do |key, mapping|
|
102
|
+
!key.is_a?(Regexp)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def build_key_from_array(key_array)
|
107
|
+
if key_array.is_a?(Array)
|
108
|
+
joined_key = "(#{key_array.join('|')})".gsub('*', '[^/]+')
|
109
|
+
Regexp.new(joined_key)
|
110
|
+
else
|
111
|
+
build_key_regex(key_array)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def build_key_regex(key)
|
116
|
+
if key.include?('*')
|
117
|
+
Regexp.new(key.gsub('*', '[^/]+'))
|
118
|
+
else
|
119
|
+
key.sub(/\[.*\]/, '')
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
@@ -76,7 +76,7 @@ module SaxStream
|
|
76
76
|
end
|
77
77
|
|
78
78
|
def start_child_node(name, attrs)
|
79
|
-
handler = @mapper_class.child_handler_for(prefix_with_element_stack(name), @collector, @stack, @current_object)
|
79
|
+
handler = @mapper_class.child_handler_for(prefix_with_element_stack(name), attrs, @collector, @stack, @current_object)
|
80
80
|
if handler
|
81
81
|
@stack.push(handler)
|
82
82
|
handler.start_element(name, attrs)
|
data/lib/sax_stream/mapper.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'sax_stream/internal/mapping_factory'
|
2
2
|
require 'sax_stream/internal/xml_builder'
|
3
3
|
require 'sax_stream/core_extensions/ordered_hash'
|
4
|
+
require 'sax_stream/internal/field_mappings'
|
4
5
|
|
5
6
|
module SaxStream
|
6
7
|
# Include this module to make your class map an XML node. For usage examples, see the READEME.
|
@@ -78,23 +79,23 @@ module SaxStream
|
|
78
79
|
end
|
79
80
|
|
80
81
|
def map_element_stack_top_onto_object(object, element_stack)
|
81
|
-
map_key_onto_object(object, element_stack.path, element_stack.content)
|
82
|
+
map_key_onto_object(object, element_stack.path, element_stack.content, element_stack.relative_attributes)
|
82
83
|
element_stack.attributes.each do |key, value|
|
83
84
|
map_key_onto_object(object, key, value)
|
84
85
|
end
|
85
86
|
end
|
86
87
|
|
87
|
-
def map_key_onto_object(object, key, value)
|
88
|
+
def map_key_onto_object(object, key, value, attributes = [])
|
88
89
|
if value
|
89
|
-
mapping = field_mapping(key)
|
90
|
+
mapping = field_mapping(key, attributes)
|
90
91
|
if mapping
|
91
92
|
mapping.map_value_onto_object(object, value)
|
92
93
|
end
|
93
94
|
end
|
94
95
|
end
|
95
96
|
|
96
|
-
def child_handler_for(key, collector, handler_stack, current_object)
|
97
|
-
mapping = field_mapping(key)
|
97
|
+
def child_handler_for(key, attributes, collector, handler_stack, current_object)
|
98
|
+
mapping = field_mapping(key, attributes)
|
98
99
|
if mapping
|
99
100
|
mapping.handler_for(key, collector, handler_stack, current_object)
|
100
101
|
end
|
@@ -108,12 +109,6 @@ module SaxStream
|
|
108
109
|
@mappings_incuding_inherited ||= parent_class_values(:mappings, CoreExtensions::OrderedHash.new).merge(class_mappings).freeze
|
109
110
|
end
|
110
111
|
|
111
|
-
def regex_mappings
|
112
|
-
@regex_mappings ||= mappings.reject do |key, mapping|
|
113
|
-
!key.is_a?(Regexp)
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
112
|
def should_collect?
|
118
113
|
@collect
|
119
114
|
end
|
@@ -123,52 +118,39 @@ module SaxStream
|
|
123
118
|
@group_keys[group_name] ||= []
|
124
119
|
end
|
125
120
|
|
121
|
+
def field_mapping(key, attributes = [])
|
122
|
+
field_mappings.field_mapping(key, attributes) || parent_field_mapping(key, attributes)
|
123
|
+
end
|
124
|
+
|
126
125
|
private
|
127
126
|
|
127
|
+
def class_mappings
|
128
|
+
field_mappings.class_mappings
|
129
|
+
end
|
130
|
+
|
128
131
|
def store_relation_mapping(key, mapping)
|
129
132
|
class_relation_mappings << mapping
|
130
133
|
store_field_mapping(key, mapping)
|
131
134
|
end
|
132
135
|
|
133
136
|
def store_field_mapping(key, mapping)
|
134
|
-
key
|
135
|
-
class_mappings[key] = mapping
|
137
|
+
field_mappings.store(key, mapping)
|
136
138
|
end
|
137
139
|
|
138
|
-
def
|
139
|
-
|
140
|
-
joined_key = "(#{key_array.join('|')})".gsub('*', '[^/]+')
|
141
|
-
Regexp.new(joined_key)
|
142
|
-
else
|
143
|
-
build_key_regex(key_array)
|
144
|
-
end
|
140
|
+
def field_mappings
|
141
|
+
@field_mappings ||= Internal::FieldMappings.new
|
145
142
|
end
|
146
143
|
|
147
|
-
def
|
148
|
-
|
149
|
-
end
|
150
|
-
|
151
|
-
def field_mapping(key)
|
152
|
-
mappings[key] || regex_field_mapping(key)
|
153
|
-
end
|
154
|
-
|
155
|
-
def regex_field_mapping(key)
|
156
|
-
regex_mappings.each do |regex, mapping|
|
157
|
-
return mapping if regex =~ key
|
158
|
-
end
|
159
|
-
nil
|
144
|
+
def parent_field_mapping(*params)
|
145
|
+
parent_class_values :field_mapping, nil, *params
|
160
146
|
end
|
161
147
|
|
162
148
|
def class_relation_mappings
|
163
149
|
@relation_mappings ||= []
|
164
150
|
end
|
165
151
|
|
166
|
-
def
|
167
|
-
|
168
|
-
end
|
169
|
-
|
170
|
-
def parent_class_values(method_name, default)
|
171
|
-
superclass && superclass.respond_to?(method_name) ? superclass.send(method_name) : default
|
152
|
+
def parent_class_values(method_name, default = nil, *params)
|
153
|
+
superclass && superclass.respond_to?(method_name) ? superclass.send(method_name, *params) : default
|
172
154
|
end
|
173
155
|
|
174
156
|
def mapping_options=(values)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sax_stream
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Craig Ambrose
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-02-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -32,12 +32,15 @@ executables: []
|
|
32
32
|
extensions: []
|
33
33
|
extra_rdoc_files: []
|
34
34
|
files:
|
35
|
+
- ./LICENSE
|
36
|
+
- ./README.markdown
|
35
37
|
- lib/sax_stream/collectors/block_collector.rb
|
36
38
|
- lib/sax_stream/collectors/naive_collector.rb
|
37
39
|
- lib/sax_stream/core_extensions/ordered_hash.rb
|
38
40
|
- lib/sax_stream/errors.rb
|
39
41
|
- lib/sax_stream/internal/combined_handler.rb
|
40
42
|
- lib/sax_stream/internal/element_stack.rb
|
43
|
+
- lib/sax_stream/internal/field_mappings.rb
|
41
44
|
- lib/sax_stream/internal/handler_stack.rb
|
42
45
|
- lib/sax_stream/internal/mapper_handler.rb
|
43
46
|
- lib/sax_stream/internal/mapping_factory.rb
|
@@ -51,12 +54,10 @@ files:
|
|
51
54
|
- lib/sax_stream/internal/xml_builder.rb
|
52
55
|
- lib/sax_stream/mapper.rb
|
53
56
|
- lib/sax_stream/parser.rb
|
57
|
+
- lib/sax_stream/types.rb
|
54
58
|
- lib/sax_stream/types/boolean.rb
|
55
59
|
- lib/sax_stream/types/decimal.rb
|
56
60
|
- lib/sax_stream/types/integer.rb
|
57
|
-
- lib/sax_stream/types.rb
|
58
|
-
- ./LICENSE
|
59
|
-
- ./README.markdown
|
60
61
|
homepage: http://github.com/craigambrose/sax_stream
|
61
62
|
licenses: []
|
62
63
|
metadata: {}
|
@@ -76,7 +77,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
76
77
|
version: '0'
|
77
78
|
requirements: []
|
78
79
|
rubyforge_project:
|
79
|
-
rubygems_version: 2.
|
80
|
+
rubygems_version: 2.2.2
|
80
81
|
signing_key:
|
81
82
|
specification_version: 4
|
82
83
|
summary: A streaming XML parser which builds objects and passes them to a collecter
|