senotrusov-ruby-xml-mapper 1.0.3 → 1.0.4
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/ruby-xml-mapper.rb +28 -23
- data/lib/ruby-xml-mapper/basic_containers.rb +39 -9
- metadata +12 -2
data/lib/ruby-xml-mapper.rb
CHANGED
@@ -12,13 +12,21 @@
|
|
12
12
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
13
|
# See the License for the specific language governing permissions and
|
14
14
|
# limitations under the License.
|
15
|
-
|
16
15
|
|
17
|
-
|
16
|
+
|
17
|
+
# In fact, this is prototype to define requirements.
|
18
|
+
# TODO: refactoring
|
19
|
+
# TODO: Extract mapping to separate object
|
20
|
+
# TODO: More clear caching
|
21
|
+
# TODO: File loading with filesystem restrictions and current directory (based on parent xml directory)
|
22
|
+
# TODO: Use more libxml API
|
18
23
|
|
19
24
|
require 'libxml'
|
20
25
|
|
21
26
|
module RubyXmlMapper
|
27
|
+
mattr_accessor :file_cache
|
28
|
+
self.file_cache = {}
|
29
|
+
|
22
30
|
def self.included model
|
23
31
|
model.extend RubyXmlMapper::RubyXmlMapperClassMethods
|
24
32
|
|
@@ -34,22 +42,11 @@ module RubyXmlMapper
|
|
34
42
|
model.xml_child_mappings = {}
|
35
43
|
end
|
36
44
|
|
37
|
-
|
38
|
-
def initialize_from_xml node, load_source = true
|
45
|
+
def initialize_from_xml node
|
39
46
|
initialize_from_xml_attr_mapping(node) if xml_attr_mappings.length
|
40
|
-
|
41
|
-
|
42
|
-
if
|
43
|
-
unless source_dir_path
|
44
|
-
raise "source_dir_path not defined in #{self.class.inspect}"
|
45
|
-
end
|
46
|
-
|
47
|
-
initialize_from_xml(self.class.parse_xml_file(File.expand_path_restricted(@source, source_dir_path)), false)
|
48
|
-
else
|
49
|
-
initialize_from_xml_child_mapping(node) if xml_child_mappings.length
|
50
|
-
initialize_from_xml_self_mapping(node) if xml_self_mapping
|
51
|
-
initialize_from_xml_content_mapping(node) if xml_content_mapping
|
52
|
-
end
|
47
|
+
initialize_from_xml_child_mapping(node) if xml_child_mappings.length
|
48
|
+
initialize_from_xml_self_mapping(node) if xml_self_mapping
|
49
|
+
initialize_from_xml_content_mapping(node) if xml_content_mapping
|
53
50
|
end
|
54
51
|
|
55
52
|
private
|
@@ -157,13 +154,21 @@ module RubyXmlMapper
|
|
157
154
|
end
|
158
155
|
|
159
156
|
def new_from_xml_file file_name
|
160
|
-
new_from_xml_node(parse_xml_file(file_name))
|
157
|
+
RubyXmlMapper.file_cache[file_name] ||= new_from_xml_node(parse_xml_file(file_name))
|
161
158
|
end
|
162
159
|
|
163
160
|
def new_from_xml_node node
|
164
|
-
|
165
|
-
|
166
|
-
|
161
|
+
if node.attributes["source"]
|
162
|
+
unless source_dir_path
|
163
|
+
raise "source_dir_path not defined in #{self.class.inspect}"
|
164
|
+
end
|
165
|
+
new_from_xml_file(File.expand_path_restricted(node.attributes["source"], source_dir_path))
|
166
|
+
else
|
167
|
+
allocated = allocate
|
168
|
+
allocated.initialize_from_xml node
|
169
|
+
allocated.after_initialize if allocated.respond_to?(:after_initialize)
|
170
|
+
allocated
|
171
|
+
end
|
167
172
|
end
|
168
173
|
|
169
174
|
def xml args
|
@@ -207,10 +212,10 @@ module RubyXmlMapper
|
|
207
212
|
def register_self_mapping args
|
208
213
|
if args[:type].kind_of?(Array)
|
209
214
|
register_type_array(args)
|
210
|
-
elsif args[:type] == :self && self < RubyXmlMapper::
|
215
|
+
elsif args[:type] == :self && self < RubyXmlMapper::Hash
|
211
216
|
|
212
217
|
else
|
213
|
-
raise(":type must be kind_of Array or :self with the following supported types: RubyXmlMapper::
|
218
|
+
raise(":type must be kind_of Array or :self with the following supported types: RubyXmlMapper::Hash )")
|
214
219
|
end
|
215
220
|
|
216
221
|
self.xml_self_mapping = args
|
@@ -14,8 +14,6 @@
|
|
14
14
|
# limitations under the License.
|
15
15
|
|
16
16
|
|
17
|
-
# TODO: Double check .strip - is it needed actually
|
18
|
-
|
19
17
|
class String
|
20
18
|
def self.new_from_xml_attr attr
|
21
19
|
new(attr.value.strip.gsub(/\s*[\r\n]\s*/, "\n"))
|
@@ -66,22 +64,27 @@ class RubyXmlMapper::Boolean
|
|
66
64
|
end
|
67
65
|
end
|
68
66
|
|
69
|
-
class RubyXmlMapper::
|
70
|
-
def self.new_from_xml_node node
|
71
|
-
created = new
|
72
|
-
created.initialize_from_xml_node node
|
73
|
-
created
|
74
|
-
end
|
67
|
+
class RubyXmlMapper::Hash < Hash
|
75
68
|
|
76
69
|
def initialize_from_xml_node node
|
77
70
|
node.each_element do |child|
|
78
|
-
|
71
|
+
next if xml_child_mappings.has_key?(child.name)
|
72
|
+
|
73
|
+
self[child.name.to_sym] = if child.attributes["type"] && respond_to?(cast_method = "cast_to_#{child.attributes["type"]}")
|
74
|
+
__send__(cast_method, child.content)
|
75
|
+
else
|
76
|
+
autocast_value(child.content)
|
77
|
+
end
|
79
78
|
end
|
79
|
+
|
80
80
|
node.each_attr do |attr|
|
81
|
+
next if xml_attr_mappings.has_key?(attr.name)
|
82
|
+
|
81
83
|
self[attr.name.to_sym] = autocast_value(attr.value)
|
82
84
|
end
|
83
85
|
end
|
84
86
|
|
87
|
+
# we're eating copypasta!
|
85
88
|
def autocast_value value
|
86
89
|
if value =~ /\A\s*-*\d+\.\d+\s*\z/
|
87
90
|
value.to_f
|
@@ -103,6 +106,33 @@ class RubyXmlMapper::HashOfStringAndNumeric < Hash
|
|
103
106
|
|
104
107
|
end
|
105
108
|
end
|
109
|
+
|
110
|
+
def cast_to_float value
|
111
|
+
value.to_f
|
112
|
+
end
|
113
|
+
|
114
|
+
def cast_to_integer value
|
115
|
+
value.to_i
|
116
|
+
end
|
117
|
+
|
118
|
+
def cast_to_range value
|
119
|
+
matchdata = value.match(/\A\s*(-*\d+)\s*\.\.\s*(-*\d+)\s*\z/)
|
120
|
+
Range.new(matchdata[1].to_i, matchdata[2].to_i)
|
121
|
+
end
|
122
|
+
|
123
|
+
def cast_to_boolean value
|
124
|
+
if value =~ /\A\s*true\s*\z/i
|
125
|
+
true
|
126
|
+
elsif value =~ /\A\s*false\s*\z/i
|
127
|
+
false
|
128
|
+
else
|
129
|
+
nil
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def cast_to_string value
|
134
|
+
value.strip.gsub(/\s*[\r\n]\s*/, "\n").gsub(/\n\s*\n/, "\n")
|
135
|
+
end
|
106
136
|
end
|
107
137
|
|
108
138
|
require 'time'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: senotrusov-ruby-xml-mapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stanislav Senotrusov
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-07-
|
12
|
+
date: 2009-07-30 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -22,6 +22,16 @@ dependencies:
|
|
22
22
|
- !ruby/object:Gem::Version
|
23
23
|
version: 1.1.3
|
24
24
|
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rails
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "0"
|
34
|
+
version:
|
25
35
|
description:
|
26
36
|
email: senotrusov@gmail.com
|
27
37
|
executables: []
|