happymapper 0.2.4 → 0.2.5
Sign up to get free protection for your applications and to get access to all the features.
- data/History +8 -0
- data/happymapper.gemspec +2 -2
- data/lib/happymapper/item.rb +30 -11
- data/lib/happymapper/version.rb +1 -1
- data/spec/happymapper_item_spec.rb +21 -0
- data/spec/happymapper_spec.rb +44 -27
- metadata +2 -2
data/History
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
== 0.2.5
|
2
|
+
* 1 minor tweak
|
3
|
+
* Classes can now be strings instead of constants so you don't have to worry about class definition order (this was all for technicalpickles, enjoy!)
|
4
|
+
|
5
|
+
== 0.2.4
|
6
|
+
* 1 minor tweak
|
7
|
+
* Added a patch that allows even crazy namespaces to work
|
8
|
+
|
1
9
|
== 0.2.3
|
2
10
|
* 1 minor tweak
|
3
11
|
* bumped the version of libxml-ruby to 1.1.3
|
data/happymapper.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{happymapper}
|
5
|
-
s.version = "0.2.
|
5
|
+
s.version = "0.2.5"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["John Nunemaker"]
|
9
|
-
s.date = %q{2009-05-
|
9
|
+
s.date = %q{2009-05-27}
|
10
10
|
s.description = %q{object to xml mapping library}
|
11
11
|
s.email = %q{nunemaker@gmail.com}
|
12
12
|
s.extra_rdoc_files = ["lib/happymapper/attribute.rb", "lib/happymapper/element.rb", "lib/happymapper/item.rb", "lib/happymapper/version.rb", "lib/happymapper.rb", "README", "TODO"]
|
data/lib/happymapper/item.rb
CHANGED
@@ -21,6 +21,10 @@ module HappyMapper
|
|
21
21
|
|
22
22
|
@xml_type = self.class.to_s.split('::').last.downcase
|
23
23
|
end
|
24
|
+
|
25
|
+
def constant
|
26
|
+
@constant ||= constantize(type)
|
27
|
+
end
|
24
28
|
|
25
29
|
def from_xml_node(node, namespace)
|
26
30
|
if primitive?
|
@@ -41,13 +45,13 @@ module HappyMapper
|
|
41
45
|
end
|
42
46
|
|
43
47
|
begin
|
44
|
-
|
48
|
+
constant.send(options[:parser].to_sym, value)
|
45
49
|
rescue
|
46
50
|
nil
|
47
51
|
end
|
48
52
|
end
|
49
53
|
else
|
50
|
-
|
54
|
+
constant.parse(node, options)
|
51
55
|
end
|
52
56
|
end
|
53
57
|
end
|
@@ -62,7 +66,7 @@ module HappyMapper
|
|
62
66
|
end
|
63
67
|
|
64
68
|
def primitive?
|
65
|
-
Types.include?(
|
69
|
+
Types.include?(constant)
|
66
70
|
end
|
67
71
|
|
68
72
|
def element?
|
@@ -78,15 +82,15 @@ module HappyMapper
|
|
78
82
|
end
|
79
83
|
|
80
84
|
def typecast(value)
|
81
|
-
return value if value.kind_of?(
|
85
|
+
return value if value.kind_of?(constant) || value.nil?
|
82
86
|
begin
|
83
|
-
if
|
84
|
-
elsif
|
85
|
-
elsif
|
86
|
-
elsif
|
87
|
-
elsif
|
88
|
-
elsif
|
89
|
-
elsif
|
87
|
+
if constant == String then value.to_s
|
88
|
+
elsif constant == Float then value.to_f
|
89
|
+
elsif constant == Time then Time.parse(value.to_s)
|
90
|
+
elsif constant == Date then Date.parse(value.to_s)
|
91
|
+
elsif constant == DateTime then DateTime.parse(value.to_s)
|
92
|
+
elsif constant == Boolean then ['true', 't', '1'].include?(value.to_s.downcase)
|
93
|
+
elsif constant == Integer
|
90
94
|
# ganked from datamapper
|
91
95
|
value_to_i = value.to_i
|
92
96
|
if value_to_i == 0 && value != '0'
|
@@ -108,6 +112,21 @@ module HappyMapper
|
|
108
112
|
end
|
109
113
|
|
110
114
|
private
|
115
|
+
def constantize(type)
|
116
|
+
if type.is_a?(String)
|
117
|
+
names = type.split('::')
|
118
|
+
constant = Object
|
119
|
+
names.each do |name|
|
120
|
+
constant = constant.const_defined?(name) ?
|
121
|
+
constant.const_get(name) :
|
122
|
+
constant.const_missing(name)
|
123
|
+
end
|
124
|
+
constant
|
125
|
+
else
|
126
|
+
type
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
111
130
|
def find(node, namespace, &block)
|
112
131
|
# this node has a custom namespace (that is present in the doc)
|
113
132
|
if self.namespace && node.namespaces.find_by_prefix(self.namespace)
|
data/lib/happymapper/version.rb
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
2
|
|
3
|
+
module Foo
|
4
|
+
class Bar; end
|
5
|
+
end
|
6
|
+
|
3
7
|
describe HappyMapper::Item do
|
4
8
|
|
5
9
|
describe "new instance" do
|
@@ -24,6 +28,23 @@ describe HappyMapper::Item do
|
|
24
28
|
end
|
25
29
|
end
|
26
30
|
|
31
|
+
describe "#constant" do
|
32
|
+
it "should just use type if constant" do
|
33
|
+
item = HappyMapper::Item.new(:foo, String)
|
34
|
+
item.constant.should == String
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should convert string type to constant" do
|
38
|
+
item = HappyMapper::Item.new(:foo, 'String')
|
39
|
+
item.constant.should == String
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should convert string with :: to constant" do
|
43
|
+
item = HappyMapper::Item.new(:foo, 'Foo::Bar')
|
44
|
+
item.constant.should == Foo::Bar
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
27
48
|
describe "#method_name" do
|
28
49
|
it "should convert dashes to underscores" do
|
29
50
|
item = HappyMapper::Item.new(:'foo-bar', String, :tag => 'foobar')
|
data/spec/happymapper_spec.rb
CHANGED
@@ -274,72 +274,76 @@ describe HappyMapper do
|
|
274
274
|
|
275
275
|
describe "being included into another class" do
|
276
276
|
before do
|
277
|
-
|
278
|
-
|
277
|
+
@klass = Class.new do
|
278
|
+
include HappyMapper
|
279
|
+
|
280
|
+
def self.to_s
|
281
|
+
'Foo'
|
282
|
+
end
|
283
|
+
end
|
279
284
|
end
|
280
|
-
class Foo; include HappyMapper end
|
281
285
|
|
282
286
|
it "should set attributes to an array" do
|
283
|
-
|
287
|
+
@klass.attributes.should == []
|
284
288
|
end
|
285
289
|
|
286
290
|
it "should set @elements to a hash" do
|
287
|
-
|
291
|
+
@klass.elements.should == []
|
288
292
|
end
|
289
293
|
|
290
294
|
it "should allow adding an attribute" do
|
291
295
|
lambda {
|
292
|
-
|
293
|
-
}.should change(
|
296
|
+
@klass.attribute :name, String
|
297
|
+
}.should change(@klass, :attributes)
|
294
298
|
end
|
295
299
|
|
296
300
|
it "should allow adding an attribute containing a dash" do
|
297
301
|
lambda {
|
298
|
-
|
299
|
-
}.should change(
|
302
|
+
@klass.attribute :'bar-baz', String
|
303
|
+
}.should change(@klass, :attributes)
|
300
304
|
end
|
301
305
|
|
302
306
|
it "should be able to get all attributes in array" do
|
303
|
-
|
304
|
-
|
307
|
+
@klass.attribute :name, String
|
308
|
+
@klass.attributes.size.should == 1
|
305
309
|
end
|
306
310
|
|
307
311
|
it "should allow adding an element" do
|
308
312
|
lambda {
|
309
|
-
|
310
|
-
}.should change(
|
313
|
+
@klass.element :name, String
|
314
|
+
}.should change(@klass, :elements)
|
311
315
|
end
|
312
316
|
|
313
317
|
it "should allow adding an element containing a dash" do
|
314
318
|
lambda {
|
315
|
-
|
316
|
-
}.should change(
|
319
|
+
@klass.element :'bar-baz', String
|
320
|
+
}.should change(@klass, :elements)
|
317
321
|
|
318
322
|
end
|
319
323
|
|
320
324
|
it "should be able to get all elements in array" do
|
321
|
-
|
322
|
-
|
325
|
+
@klass.element(:name, String)
|
326
|
+
@klass.elements.size.should == 1
|
323
327
|
end
|
324
328
|
|
325
329
|
it "should allow has one association" do
|
326
|
-
|
327
|
-
element =
|
330
|
+
@klass.has_one(:user, User)
|
331
|
+
element = @klass.elements.first
|
328
332
|
element.name.should == 'user'
|
329
333
|
element.type.should == User
|
330
334
|
element.options[:single] = true
|
331
335
|
end
|
332
336
|
|
333
337
|
it "should allow has many association" do
|
334
|
-
|
335
|
-
element =
|
338
|
+
@klass.has_many(:users, User)
|
339
|
+
element = @klass.elements.first
|
336
340
|
element.name.should == 'users'
|
337
341
|
element.type.should == User
|
338
342
|
element.options[:single] = false
|
339
343
|
end
|
340
344
|
|
341
345
|
it "should default tag name to lowercase class" do
|
342
|
-
|
346
|
+
@klass.tag_name.should == 'foo'
|
343
347
|
end
|
344
348
|
|
345
349
|
it "should default tag name of class in modules to the last constant lowercase" do
|
@@ -348,17 +352,17 @@ describe HappyMapper do
|
|
348
352
|
end
|
349
353
|
|
350
354
|
it "should allow setting tag name" do
|
351
|
-
|
352
|
-
|
355
|
+
@klass.tag('FooBar')
|
356
|
+
@klass.tag_name.should == 'FooBar'
|
353
357
|
end
|
354
358
|
|
355
359
|
it "should allow setting a namespace" do
|
356
|
-
|
357
|
-
|
360
|
+
@klass.namespace(namespace = "foo")
|
361
|
+
@klass.namespace.should == namespace
|
358
362
|
end
|
359
363
|
|
360
364
|
it "should provide #parse" do
|
361
|
-
|
365
|
+
@klass.should respond_to(:parse)
|
362
366
|
end
|
363
367
|
end
|
364
368
|
|
@@ -551,6 +555,19 @@ describe HappyMapper do
|
|
551
555
|
property.value.should == '85301'
|
552
556
|
end
|
553
557
|
|
558
|
+
it "should allow instantiating with a string" do
|
559
|
+
module StringFoo
|
560
|
+
class Bar
|
561
|
+
include HappyMapper
|
562
|
+
has_many :things, 'StringFoo::Thing'
|
563
|
+
end
|
564
|
+
|
565
|
+
class Thing
|
566
|
+
include HappyMapper
|
567
|
+
end
|
568
|
+
end
|
569
|
+
end
|
570
|
+
|
554
571
|
xit "should parse family search xml" do
|
555
572
|
tree = FamilySearch::FamilyTree.parse(fixture_file('family_tree.xml'))
|
556
573
|
tree.version.should == '1.0.20071213.942'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: happymapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Nunemaker
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-05-
|
12
|
+
date: 2009-05-27 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|