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 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.4"
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-17}
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"]
@@ -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
- type.send(options[:parser].to_sym, value)
48
+ constant.send(options[:parser].to_sym, value)
45
49
  rescue
46
50
  nil
47
51
  end
48
52
  end
49
53
  else
50
- type.parse(node, options)
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?(type)
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?(type) || value.nil?
85
+ return value if value.kind_of?(constant) || value.nil?
82
86
  begin
83
- if type == String then value.to_s
84
- elsif type == Float then value.to_f
85
- elsif type == Time then Time.parse(value.to_s)
86
- elsif type == Date then Date.parse(value.to_s)
87
- elsif type == DateTime then DateTime.parse(value.to_s)
88
- elsif type == Boolean then ['true', 't', '1'].include?(value.to_s.downcase)
89
- elsif type == Integer
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)
@@ -1,3 +1,3 @@
1
1
  module HappyMapper
2
- Version = '0.2.4'
2
+ Version = '0.2.5'
3
3
  end
@@ -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')
@@ -274,72 +274,76 @@ describe HappyMapper do
274
274
 
275
275
  describe "being included into another class" do
276
276
  before do
277
- Foo.instance_variable_set("@attributes", {})
278
- Foo.instance_variable_set("@elements", {})
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
- Foo.attributes.should == []
287
+ @klass.attributes.should == []
284
288
  end
285
289
 
286
290
  it "should set @elements to a hash" do
287
- Foo.elements.should == []
291
+ @klass.elements.should == []
288
292
  end
289
293
 
290
294
  it "should allow adding an attribute" do
291
295
  lambda {
292
- Foo.attribute :name, String
293
- }.should change(Foo, :attributes)
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
- Foo.attribute :'bar-baz', String
299
- }.should change(Foo, :attributes)
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
- Foo.attribute :name, String
304
- Foo.attributes.size.should == 1
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
- Foo.element :name, String
310
- }.should change(Foo, :elements)
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
- Foo.element :'bar-baz', String
316
- }.should change(Foo, :elements)
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
- Foo.element(:name, String)
322
- Foo.elements.size.should == 1
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
- Foo.has_one(:user, User)
327
- element = Foo.elements.first
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
- Foo.has_many(:users, User)
335
- element = Foo.elements.first
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
- Foo.tag_name.should == 'foo'
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
- Foo.tag('FooBar')
352
- Foo.tag_name.should == 'FooBar'
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
- Foo.namespace(namespace = "foo")
357
- Foo.namespace.should == namespace
360
+ @klass.namespace(namespace = "foo")
361
+ @klass.namespace.should == namespace
358
362
  end
359
363
 
360
364
  it "should provide #parse" do
361
- Foo.should respond_to(:parse)
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
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-17 00:00:00 -04:00
12
+ date: 2009-05-27 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency