peanuts 2.0.7 → 2.1
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/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'
|