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 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'