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 CHANGED
@@ -36,6 +36,8 @@ http://rdoc.info/projects/omg/peanuts
36
36
  Please report via Github issue tracking.
37
37
 
38
38
  === Example
39
+ See also http://gist.github.com/230202 for real world example.
40
+
39
41
  class Cheezburger
40
42
  include Peanuts
41
43
 
@@ -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.mapper.read(self, source)
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.mapper.write(self, dest)
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
- # shallow :friends do
157
+ # wrapper :friends do
148
158
  # element :friends, :name => :friend
149
159
  # end
150
- # shallow :cheeseburger, Cheeseburger, :name => :cheezburger
160
+ # wrapper :cheeseburger, Cheeseburger, :name => :cheezburger
151
161
  # ...
152
162
  # end
153
- def shallow_element(name, *args, &block)
154
- add_mapping(:shallow_element, name, *args, &block)
163
+ def wrapper_element(name, *args, &block)
164
+ add_mapping(:wrapper_element, name, *args, &block)
155
165
  end
156
166
 
157
- alias shallow shallow_element
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(:shallow) ? ShallowElement : (object_type ? Element : ElementValue)
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 :shallow_element
230
- ShallowElement
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
@@ -2,6 +2,10 @@ require 'enumerator'
2
2
 
3
3
  module Peanuts
4
4
  class Mapper
5
+ def self.of(cls)
6
+ cls.send(:mapper)
7
+ end
8
+
5
9
  include Enumerable
6
10
 
7
11
  attr_reader :root, :namespaces, :ns_context
@@ -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.mapper.read(type.new, reader)
144
+ Mapper.of(type).read(type.new, reader)
144
145
  end
145
146
 
146
147
  def write_value(writer, value)
147
- type.mapper.write_children(value, writer)
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 ShallowElement < Element
218
+ class WrapperElement < Element
192
219
  def read(nut, reader)
193
- type.mapper.read(nut, reader)
220
+ Mapper.of(type).read(nut, reader)
194
221
  end
195
222
 
196
223
  def write(nut, writer)
197
- write_node(writer) {|w| type.mapper.write_children(nut, w) }
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.mapper.define_accessors(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
@@ -3,7 +3,6 @@ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
3
3
  require 'bigdecimal'
4
4
  require 'test/unit'
5
5
  require 'rubygems'
6
- require 'shoulda'
7
6
  require 'peanuts'
8
7
 
9
8
 
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.0.7
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: 2009-09-30 00:00:00 +03:00
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.2.8
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'