jnunemaker-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,15 +2,15 @@
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"]
13
- s.files = ["examples/amazon.rb", "examples/current_weather.rb", "examples/dashed_elements.rb", "examples/post.rb", "examples/twitter.rb", "happymapper.gemspec", "History", "lib/happymapper/attribute.rb", "lib/happymapper/element.rb", "lib/happymapper/item.rb", "lib/happymapper/version.rb", "lib/happymapper.rb", "License", "Manifest", "Rakefile", "README", "spec/fixtures/address.xml", "spec/fixtures/commit.xml", "spec/fixtures/current_weather.xml", "spec/fixtures/family_tree.xml", "spec/fixtures/multiple_namespaces.xml", "spec/fixtures/pita.xml", "spec/fixtures/posts.xml", "spec/fixtures/product_default_namespace.xml", "spec/fixtures/product_no_namespace.xml", "spec/fixtures/product_single_namespace.xml", "spec/fixtures/radar.xml", "spec/fixtures/statuses.xml", "spec/happymapper_attribute_spec.rb", "spec/happymapper_element_spec.rb", "spec/happymapper_item_spec.rb", "spec/happymapper_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "TODO", "website/css/common.css", "website/index.html"]
13
+ s.files = ["examples/amazon.rb", "examples/current_weather.rb", "examples/dashed_elements.rb", "examples/post.rb", "examples/twitter.rb", "happymapper.gemspec", "History", "lib/happymapper/attribute.rb", "lib/happymapper/element.rb", "lib/happymapper/item.rb", "lib/happymapper/version.rb", "lib/happymapper.rb", "License", "Manifest", "Rakefile", "README", "spec/fixtures/address.xml", "spec/fixtures/analytics.xml", "spec/fixtures/commit.xml", "spec/fixtures/current_weather.xml", "spec/fixtures/family_tree.xml", "spec/fixtures/multiple_namespaces.xml", "spec/fixtures/pita.xml", "spec/fixtures/posts.xml", "spec/fixtures/product_default_namespace.xml", "spec/fixtures/product_no_namespace.xml", "spec/fixtures/product_single_namespace.xml", "spec/fixtures/radar.xml", "spec/fixtures/statuses.xml", "spec/happymapper_attribute_spec.rb", "spec/happymapper_element_spec.rb", "spec/happymapper_item_spec.rb", "spec/happymapper_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "TODO", "website/css/common.css", "website/index.html"]
14
14
  s.has_rdoc = true
15
15
  s.homepage = %q{http://happymapper.rubyforge.org}
16
16
  s.post_install_message = %q{May you have many happy mappings!}
@@ -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
@@ -0,0 +1,61 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <feed xmlns="http://www.w3.org/2005/Atom"
3
+ xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/"
4
+ xmlns:dxp="http://schemas.google.com/analytics/2009">
5
+ <id>http://www.google.com/analytics/feeds/accounts/nunemaker@gmail.com</id>
6
+ <updated>2009-04-22T23:21:23.000-07:00</updated>
7
+ <title type="text">Profile list for nunemaker@gmail.com</title>
8
+ <link rel="self" type="application/atom+xml"
9
+ href="http://www.google.com/analytics/feeds/accounts/default"/>
10
+ <author>
11
+ <name>Google Analytics</name>
12
+ </author>
13
+ <generator version="1.0">Google Analytics</generator>
14
+ <openSearch:totalResults>4</openSearch:totalResults>
15
+ <openSearch:startIndex>1</openSearch:startIndex>
16
+ <openSearch:itemsPerPage>4</openSearch:itemsPerPage>
17
+ <entry>
18
+ <id>http://www.google.com/analytics/feeds/accounts/ga:47912</id>
19
+ <updated>2008-11-24T12:11:32.000-08:00</updated>
20
+ <title type="text">addictedtonew.com</title>
21
+ <link rel="alternate" type="text/html" href="http://www.google.com/analytics"/>
22
+ <dxp:tableId>ga:47912</dxp:tableId>
23
+ <dxp:property name="ga:accountId" value="85301"/>
24
+ <dxp:property name="ga:accountName" value="addictedtonew.com"/>
25
+ <dxp:property name="ga:profileId" value="47912"/>
26
+ <dxp:property name="ga:webPropertyId" value="UA-85301-1"/>
27
+ </entry>
28
+ <entry>
29
+ <id>http://www.google.com/analytics/feeds/accounts/ga:1897579</id>
30
+ <updated>2008-11-24T12:11:32.000-08:00</updated>
31
+ <title type="text">railstips.org</title>
32
+ <link rel="alternate" type="text/html" href="http://www.google.com/analytics"/>
33
+ <dxp:tableId>ga:1897579</dxp:tableId>
34
+ <dxp:property name="ga:accountId" value="85301"/>
35
+ <dxp:property name="ga:accountName" value="addictedtonew.com"/>
36
+ <dxp:property name="ga:profileId" value="1897579"/>
37
+ <dxp:property name="ga:webPropertyId" value="UA-85301-7"/>
38
+ </entry>
39
+ <entry>
40
+ <id>http://www.google.com/analytics/feeds/accounts/ga:17132454</id>
41
+ <updated>2009-04-22T23:21:23.000-07:00</updated>
42
+ <title type="text">johnnunemaker.com</title>
43
+ <link rel="alternate" type="text/html" href="http://www.google.com/analytics"/>
44
+ <dxp:tableId>ga:17132454</dxp:tableId>
45
+ <dxp:property name="ga:accountId" value="85301"/>
46
+ <dxp:property name="ga:accountName" value="addictedtonew.com"/>
47
+ <dxp:property name="ga:profileId" value="17132454"/>
48
+ <dxp:property name="ga:webPropertyId" value="UA-85301-25"/>
49
+ </entry>
50
+ <entry>
51
+ <id>http://www.google.com/analytics/feeds/accounts/ga:17132478</id>
52
+ <updated>2009-04-22T23:21:23.000-07:00</updated>
53
+ <title type="text">harmonyapp.com</title>
54
+ <link rel="alternate" type="text/html" href="http://www.google.com/analytics"/>
55
+ <dxp:tableId>ga:17132478</dxp:tableId>
56
+ <dxp:property name="ga:accountId" value="85301"/>
57
+ <dxp:property name="ga:accountName" value="addictedtonew.com"/>
58
+ <dxp:property name="ga:profileId" value="17132478"/>
59
+ <dxp:property name="ga:webPropertyId" value="UA-85301-26"/>
60
+ </entry>
61
+ </feed>
@@ -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: jnunemaker-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 -07:00
12
+ date: 2009-05-27 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -64,6 +64,7 @@ files:
64
64
  - Rakefile
65
65
  - README
66
66
  - spec/fixtures/address.xml
67
+ - spec/fixtures/analytics.xml
67
68
  - spec/fixtures/commit.xml
68
69
  - spec/fixtures/current_weather.xml
69
70
  - spec/fixtures/family_tree.xml