jimmyz-happymapper 0.3.2 → 0.3.3

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/History CHANGED
@@ -1,3 +1,9 @@
1
+ == 0.3.3
2
+ * 1 bug fix 2 minor enhancements
3
+ * Don't serialize nil elements of primitive type (jimmyz)
4
+ * Added the xml version/encoding header to serialized xml string on to_xml (jimmyz)
5
+ * Bug fix: Don't parse deep on non-primitive elements unless :deep => true (jimmyz)
6
+
1
7
  == 0.3.2
2
8
  * 1 bug fix
3
9
  * to_xml_node was blowing up if a non-primitive element was nil. Fixed (jimmyz)
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.3.2"
5
+ s.version = "0.3.3"
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-02-19}
9
+ s.date = %q{2009-02-21}
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.rb CHANGED
@@ -20,31 +20,34 @@ module HappyMapper
20
20
  end
21
21
 
22
22
  def to_xml
23
- node = to_xml_node
24
- node.to_s
23
+ doc = LibXML::XML::Document.new
24
+ doc.root = to_xml_node
25
+ doc.to_s
25
26
  end
26
27
 
27
28
  def to_xml_node(root_node = nil)
28
29
  node = XML::Node.new(self.class.tag_name)
29
30
  root_node ||= node
31
+ # add namespace to node and to root_element if not already set
30
32
  if self.class.namespace_url
31
33
  if root_node
32
34
  namespace_object = root_node.namespaces.find_by_href(self.class.namespace_url)
33
35
  namespace_object ||= XML::Namespace.new root_node, self.class.namespace, self.class.namespace_url
34
36
  node.namespaces.namespace = namespace_object
35
37
  end
36
- else
37
- nil
38
38
  end
39
+ # serialize elements
39
40
  self.class.elements.each do |e|
40
41
  if e.options[:single] == false
41
42
  self.send("#{e.method_name}").each do |array_element|
42
43
  node << e.to_xml_node(array_element,root_node)
43
44
  end
44
45
  else
45
- node << e.to_xml_node(self.send("#{e.method_name}"),root_node)
46
+ element_value = self.send("#{e.method_name}")
47
+ node << e.to_xml_node(element_value,root_node) unless element_value.nil?
46
48
  end
47
49
  end
50
+ # serialize attributes
48
51
  self.class.attributes.each do |a|
49
52
  attribute_value = self.send("#{a.method_name}")
50
53
  node.attributes[a.tag] = attribute_value.to_s unless attribute_value.nil?
@@ -152,7 +155,7 @@ module HappyMapper
152
155
  namespace ||= DEFAULT_NS
153
156
  end
154
157
 
155
- xpath = root ? '/' : './/'
158
+ xpath = root ? '/' : (options[:deep]) ? './/' : './'
156
159
  xpath += "#{namespace}:" if namespace
157
160
  xpath += tag_name
158
161
  # puts "parse: #{xpath}"
@@ -1,3 +1,3 @@
1
1
  module HappyMapper
2
- Version = '0.3.2'
2
+ Version = '0.3.3'
3
3
  end
@@ -16,6 +16,8 @@
16
16
  <fsapi-v1:gender>Male</fsapi-v1:gender>
17
17
  <fsapi-v1:living>false</fsapi-v1:living>
18
18
  </fsapi-v1:information>
19
+ <!-- element to make sure that we're not parsing deep when not supposed to -->
20
+ <person id="KWQS-BBR" />
19
21
  </person>
20
22
  </persons>
21
23
  </familytree>
@@ -170,7 +170,8 @@ end
170
170
 
171
171
  class Radar
172
172
  include HappyMapper
173
- has_many :places, Place
173
+ # places needs to be deep because it lives out in places/place
174
+ has_many :places, Place, :deep => true
174
175
  end
175
176
 
176
177
  class Post
@@ -550,6 +551,12 @@ describe HappyMapper do
550
551
  track.tran_detail.cust_tran_id.should == '20090102-111321'
551
552
  end
552
553
 
554
+ it "should not parse deep for elements unless deep option is set" do
555
+ tree = FamilySearch::FamilyTree.parse(fixture_file('family_tree.xml'))
556
+ tree.persons.person.size.should_not == 2
557
+ tree.persons.person.size.should == 1
558
+ end
559
+
553
560
  it "should parse family search xml" do
554
561
  tree = FamilySearch::FamilyTree.parse(fixture_file('family_tree.xml'))
555
562
  tree.version.should == '1.0.20071213.942'
@@ -595,6 +602,12 @@ describe HappyMapper do
595
602
  doc.should match_xpath("/address/country","Germany")
596
603
  end
597
604
 
605
+ it "should include an xml version/encoding header" do
606
+ address = Address.new
607
+ xml = address.to_xml
608
+ xml.should =~ /<?xml version=".*" encoding=".*"?>/
609
+ end
610
+
598
611
  it "should return xml with non-primitive elements from ruby objects" do
599
612
  posts = Posts.parse(fixture_file('posts.xml'))
600
613
  xml = posts.to_xml
@@ -645,6 +658,13 @@ describe HappyMapper do
645
658
  lambda{
646
659
  ft.to_xml
647
660
  }.should_not raise_error
661
+
662
+ # Check for nil elements of primitive type
663
+ info = FamilySearch::Information.new
664
+ namespace = {'fsapi-v1' => 'http://api.familysearch.org/v1'}
665
+ doc = REXML::Document.new info.to_xml
666
+ doc.should have_nodes("/fsapi-v1:information/fsapi-v1:gender",0,namespace)
667
+ doc.should have_nodes("/fsapi-v1:information/fsapi-v1:living",0,namespace)
648
668
  end
649
669
 
650
670
  describe "with namespace url and prefix" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jimmyz-happymapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.3.3
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-02-19 00:00:00 -08:00
12
+ date: 2009-02-21 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency