peanuts 2.0.7 → 2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +2 -0
- data/lib/peanuts/mappable.rb +30 -22
- data/lib/peanuts/mapper.rb +4 -0
- data/lib/peanuts/mappings.rb +35 -6
- data/spec/cat_spec.rb +0 -1
- metadata +3 -4
- data/lib/omg-peanuts.rb +0 -1
data/README.rdoc
CHANGED
data/lib/peanuts/mappable.rb
CHANGED
@@ -12,7 +12,7 @@ module Peanuts #:nodoc:
|
|
12
12
|
def from_xml(source, options = {})
|
13
13
|
source = XML::Reader.new(source, options) unless source.is_a?(XML::Reader)
|
14
14
|
e = source.find_element
|
15
|
-
e && self.class.
|
15
|
+
e && Mapper.of(self.class).read(self, source)
|
16
16
|
end
|
17
17
|
|
18
18
|
# save_to(:string|:document[, options]) -> new_string|new_document
|
@@ -32,7 +32,7 @@ module Peanuts #:nodoc:
|
|
32
32
|
# puts doc.to_s
|
33
33
|
def to_xml(dest = :string, options = {})
|
34
34
|
dest = XML::Writer.new(dest, options) unless dest.is_a?(XML::Writer)
|
35
|
-
self.class.
|
35
|
+
Mapper.of(self.class).write(self, dest)
|
36
36
|
dest.result
|
37
37
|
end
|
38
38
|
end
|
@@ -50,6 +50,16 @@ module Peanuts #:nodoc:
|
|
50
50
|
cls
|
51
51
|
end
|
52
52
|
|
53
|
+
def self.object_type?(type)
|
54
|
+
type.is_a?(Class) && !(type < Converter)
|
55
|
+
end
|
56
|
+
|
57
|
+
def from_xml(source, options = {})
|
58
|
+
new.from_xml(source, options)
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
53
63
|
# mapper -> Mapper
|
54
64
|
#
|
55
65
|
# Returns the mapper for the class.
|
@@ -144,17 +154,20 @@ module Peanuts #:nodoc:
|
|
144
154
|
# class Cat
|
145
155
|
# include Peanuts
|
146
156
|
# ...
|
147
|
-
#
|
157
|
+
# wrapper :friends do
|
148
158
|
# element :friends, :name => :friend
|
149
159
|
# end
|
150
|
-
#
|
160
|
+
# wrapper :cheeseburger, Cheeseburger, :name => :cheezburger
|
151
161
|
# ...
|
152
162
|
# end
|
153
|
-
def
|
154
|
-
add_mapping(:
|
163
|
+
def wrapper_element(name, *args, &block)
|
164
|
+
add_mapping(:wrapper_element, name, *args, &block)
|
155
165
|
end
|
156
166
|
|
157
|
-
alias
|
167
|
+
alias wrapper wrapper_element
|
168
|
+
|
169
|
+
alias shallow_element wrapper_element
|
170
|
+
alias shallow wrapper_element
|
158
171
|
|
159
172
|
# elements(name[, type][, options]) -> mapping_object
|
160
173
|
# elements(name[, options]) { block } -> mapping_object
|
@@ -198,40 +211,35 @@ module Peanuts #:nodoc:
|
|
198
211
|
add_mapping(:attribute, name, *args)
|
199
212
|
end
|
200
213
|
|
214
|
+
def content(name, *args, &block)
|
215
|
+
add_mapping(:content, name, *args, &block)
|
216
|
+
end
|
217
|
+
|
201
218
|
def schema(schema = nil)
|
202
219
|
mapper.schema = schema if schema
|
203
220
|
mapper.schema
|
204
221
|
end
|
205
222
|
|
206
|
-
def from_xml(source, options = {})
|
207
|
-
new.from_xml(source, options)
|
208
|
-
end
|
209
|
-
|
210
|
-
private
|
211
|
-
def object_type?(type)
|
212
|
-
type.is_a?(Class) && !(type < Converter)
|
213
|
-
end
|
214
|
-
|
215
223
|
def add_mapping(node, name, *args, &block)
|
216
224
|
type, options = *args
|
217
225
|
type, options = (block ? Class.new : :string), type if type.nil? || type.is_a?(Hash)
|
218
226
|
|
219
|
-
object_type = object_type?(type)
|
227
|
+
object_type = MappableType.object_type?(type)
|
220
228
|
options = prepare_options(node, options || {})
|
221
229
|
|
222
230
|
mapper << m = case node
|
223
231
|
when :element
|
224
|
-
options.delete(:
|
232
|
+
options.delete(:wrapper) ? WrapperElement : (object_type ? Element : ElementValue)
|
225
233
|
when :elements
|
226
234
|
object_type ? Elements : ElementValues
|
227
235
|
when :attribute
|
228
236
|
Attribute
|
229
|
-
when :
|
230
|
-
|
237
|
+
when :wrapper_element
|
238
|
+
WrapperElement
|
239
|
+
when :content
|
240
|
+
Content
|
231
241
|
end.new(name, type, options)
|
232
242
|
|
233
|
-
raise ArgumentError, 'bad type for shallow element' if !object_type && m.is_a?(ShallowElement)
|
234
|
-
|
235
243
|
default_ns = m.prefix ? mapper.default_ns : m.namespace_uri
|
236
244
|
if object_type && !type.is_a?(MappableType)
|
237
245
|
raise ArgumentError, 'block is required' unless block
|
data/lib/peanuts/mapper.rb
CHANGED
data/lib/peanuts/mappings.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'forwardable'
|
2
2
|
require 'peanuts/converters'
|
3
|
+
require 'set'
|
3
4
|
|
4
5
|
module Peanuts
|
5
6
|
class Mapping
|
@@ -140,11 +141,37 @@ module Peanuts
|
|
140
141
|
module ObjectMapping
|
141
142
|
private
|
142
143
|
def read_value(reader)
|
143
|
-
type.
|
144
|
+
Mapper.of(type).read(type.new, reader)
|
144
145
|
end
|
145
146
|
|
146
147
|
def write_value(writer, value)
|
147
|
-
type.
|
148
|
+
Mapper.of(type).write_children(value, writer)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
class Content < MemberMapping
|
153
|
+
NODETYPES = Set[:text, :significant_whitespace, :cdata].freeze
|
154
|
+
|
155
|
+
include ValueMapping
|
156
|
+
|
157
|
+
node_type :text
|
158
|
+
|
159
|
+
def initialize(name, type, options)
|
160
|
+
options[:name] = '#text'
|
161
|
+
super
|
162
|
+
end
|
163
|
+
|
164
|
+
def matches?(reader)
|
165
|
+
NODETYPES.include? reader.node_type
|
166
|
+
end
|
167
|
+
|
168
|
+
private
|
169
|
+
def read_it(reader, acc)
|
170
|
+
(acc || '') << read_value(reader)
|
171
|
+
end
|
172
|
+
|
173
|
+
def write_it(writer, value)
|
174
|
+
write_value(writer, value) if value
|
148
175
|
end
|
149
176
|
end
|
150
177
|
|
@@ -188,13 +215,13 @@ module Peanuts
|
|
188
215
|
node_type :element
|
189
216
|
end
|
190
217
|
|
191
|
-
class
|
218
|
+
class WrapperElement < Element
|
192
219
|
def read(nut, reader)
|
193
|
-
type.
|
220
|
+
Mapper.of(type).read(nut, reader)
|
194
221
|
end
|
195
222
|
|
196
223
|
def write(nut, writer)
|
197
|
-
write_node(writer) {|w| type.
|
224
|
+
write_node(writer) {|w| Mapper.of(type).write_children(nut, w) }
|
198
225
|
end
|
199
226
|
|
200
227
|
def clear(nut)
|
@@ -202,8 +229,10 @@ module Peanuts
|
|
202
229
|
end
|
203
230
|
|
204
231
|
def define_accessors(type)
|
205
|
-
self.type.
|
232
|
+
Mapper.of(self.type).define_accessors(type)
|
206
233
|
end
|
207
234
|
end
|
235
|
+
|
236
|
+
ShallowElement = WrapperElement
|
208
237
|
end
|
209
238
|
end
|
data/spec/cat_spec.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: peanuts
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: "2.1"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Igor Gunko
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2010-01-30 00:00:00 +02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -30,7 +30,7 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 1.
|
33
|
+
version: "1.3"
|
34
34
|
version:
|
35
35
|
description: " Peanuts is an XML to Ruby and back again mapping library.\n"
|
36
36
|
email: tekmon@gmail.com
|
@@ -46,7 +46,6 @@ files:
|
|
46
46
|
- MIT-LICENSE
|
47
47
|
- Rakefile
|
48
48
|
- lib/peanuts.rb
|
49
|
-
- lib/omg-peanuts.rb
|
50
49
|
- lib/peanuts/mappable.rb
|
51
50
|
- lib/peanuts/mappings.rb
|
52
51
|
- lib/peanuts/converters.rb
|
data/lib/omg-peanuts.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
require 'peanuts'
|