lightningdb-happymapper 0.3.1 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- data/happymapper.gemspec +3 -3
- data/lib/happymapper/item.rb +31 -18
- data/spec/fixtures/family_tree.xml +15 -1
- data/spec/happymapper_spec.rb +21 -5
- metadata +3 -2
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.
|
5
|
+
s.version = "0.3.2"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
-
s.authors = ["John Nunemaker"]
|
9
|
-
s.date = %q{2009-
|
8
|
+
s.authors = ["John Nunemaker", "Dave Bolton"]
|
9
|
+
s.date = %q{2009-03-17}
|
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
@@ -18,7 +18,7 @@ module HappyMapper
|
|
18
18
|
self.type = type
|
19
19
|
#self.tag = o.delete(:tag) || name.to_s
|
20
20
|
self.tag = o[:tag] || name.to_s
|
21
|
-
self.options = o.merge(:name => self.name)
|
21
|
+
self.options = { :single => true }.merge(o.merge(:name => self.name))
|
22
22
|
|
23
23
|
@xml_type = self.class.to_s.split('::').last.downcase
|
24
24
|
end
|
@@ -120,29 +120,42 @@ module HappyMapper
|
|
120
120
|
end
|
121
121
|
|
122
122
|
if element?
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
result.instance_eval <<-EOV
|
132
|
-
def value.#{xml_attribute.name}
|
133
|
-
#{attribute_value.inspect}
|
134
|
-
end
|
135
|
-
EOV
|
136
|
-
end
|
137
|
-
end
|
123
|
+
if options[:single]
|
124
|
+
result = node.find_first(xpath(namespace))
|
125
|
+
if result
|
126
|
+
value = yield(result)
|
127
|
+
handle_attributes_option(result,value)
|
128
|
+
value
|
129
|
+
else
|
130
|
+
nil
|
138
131
|
end
|
139
|
-
value
|
140
132
|
else
|
141
|
-
|
133
|
+
results = node.find(xpath(namespace)).collect do |result|
|
134
|
+
value = yield(result)
|
135
|
+
handle_attributes_option(result,value)
|
136
|
+
value
|
137
|
+
end
|
138
|
+
results
|
142
139
|
end
|
143
140
|
else
|
144
141
|
yield(node[tag])
|
145
142
|
end
|
146
143
|
end
|
144
|
+
|
145
|
+
def handle_attributes_option(result, value)
|
146
|
+
if options[:attributes].is_a?(Hash)
|
147
|
+
result.attributes.each do |xml_attribute|
|
148
|
+
if attribute_options = options[:attributes][xml_attribute.name.to_sym]
|
149
|
+
attribute_value = Attribute.new(xml_attribute.name.to_sym, *attribute_options).from_xml_node(result, namespace)
|
150
|
+
result.instance_eval <<-EOV
|
151
|
+
def value.#{xml_attribute.name}
|
152
|
+
#{attribute_value.inspect}
|
153
|
+
end
|
154
|
+
EOV
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
147
159
|
end
|
148
160
|
end
|
161
|
+
|
@@ -2,6 +2,20 @@
|
|
2
2
|
<familytree xmlns="http://api.familysearch.org/familytree/v1" xmlns:fsapi-v1="http://api.familysearch.org/v1" version="1.0.20071213.942" statusMessage="OK" statusCode="200">
|
3
3
|
<persons>
|
4
4
|
<person version="1199378491000" modified="2008-01-03T09:41:31-07:00" id="KWQS-BBQ">
|
5
|
+
<information>
|
6
|
+
<alternateIds>
|
7
|
+
<id>gedcom.1B5E3087E36D814FA9CBE0BE5B3721EA</id>
|
8
|
+
<id>KWQS-BB3</id>
|
9
|
+
<id>KWQS-W23</id>
|
10
|
+
<id>KWQS-W2S</id>
|
11
|
+
<id>KWQS-W29</id>
|
12
|
+
<id>KWQM-MMM</id>
|
13
|
+
<id>KWQS-W2Q</id>
|
14
|
+
<id>KWQS-BBQ</id>
|
15
|
+
</alternateIds>
|
16
|
+
<gender>Male</gender>
|
17
|
+
<living>false</living>
|
18
|
+
</information>
|
5
19
|
</person>
|
6
20
|
</persons>
|
7
|
-
</familytree>
|
21
|
+
</familytree>
|
data/spec/happymapper_spec.rb
CHANGED
@@ -35,12 +35,26 @@ class Product
|
|
35
35
|
end
|
36
36
|
|
37
37
|
module FamilySearch
|
38
|
+
class AlternateIds
|
39
|
+
include HappyMapper
|
40
|
+
|
41
|
+
tag 'alternateIds'
|
42
|
+
has_many :ids, String, :tag => 'id'
|
43
|
+
end
|
44
|
+
|
45
|
+
class Information
|
46
|
+
include HappyMapper
|
47
|
+
|
48
|
+
has_one :alternateIds, AlternateIds
|
49
|
+
end
|
50
|
+
|
38
51
|
class Person
|
39
52
|
include HappyMapper
|
40
53
|
|
41
54
|
attribute :version, String
|
42
55
|
attribute :modified, Time
|
43
56
|
attribute :id, String
|
57
|
+
has_one :information, Information
|
44
58
|
end
|
45
59
|
|
46
60
|
class Persons
|
@@ -542,14 +556,16 @@ describe HappyMapper do
|
|
542
556
|
track.tran_detail.cust_tran_id.should == '20090102-111321'
|
543
557
|
end
|
544
558
|
|
545
|
-
|
559
|
+
it "should parse family search xml" do
|
546
560
|
tree = FamilySearch::FamilyTree.parse(fixture_file('family_tree.xml'))
|
547
561
|
tree.version.should == '1.0.20071213.942'
|
548
562
|
tree.status_message.should == 'OK'
|
549
563
|
tree.status_code.should == '200'
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
564
|
+
tree.persons.person.size.should == 1
|
565
|
+
tree.persons.person.first.version.should == '1199378491000'
|
566
|
+
tree.persons.person.first.modified.should == Time.utc(2008, 1, 3, 16, 41, 31) # 2008-01-03T09:41:31-07:00
|
567
|
+
tree.persons.person.first.id.should == 'KWQS-BBQ'
|
568
|
+
tree.persons.person.first.information.alternateIds.ids.should_not be_kind_of(String)
|
569
|
+
tree.persons.person.first.information.alternateIds.ids.size.should == 8
|
554
570
|
end
|
555
571
|
end
|
metadata
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lightningdb-happymapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Nunemaker
|
8
|
+
- Dave Bolton
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
12
|
|
12
|
-
date: 2009-
|
13
|
+
date: 2009-03-17 00:00:00 -07:00
|
13
14
|
default_executable:
|
14
15
|
dependencies:
|
15
16
|
- !ruby/object:Gem::Dependency
|