kdonovan-happymapper 0.3.4

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.
@@ -0,0 +1,220 @@
1
+ dir = File.dirname(__FILE__)
2
+ $:.unshift(dir) unless $:.include?(dir) || $:.include?(File.expand_path(dir))
3
+
4
+ require 'date'
5
+ require 'time'
6
+ require 'rubygems'
7
+ gem 'libxml-ruby', '= 0.9.8'
8
+ require 'xml'
9
+
10
+ class Boolean; end
11
+
12
+ module HappyMapper
13
+
14
+ DEFAULT_NS = "happymapper"
15
+
16
+ def self.included(base)
17
+ base.instance_variable_set("@attributes", {})
18
+ base.instance_variable_set("@elements", {})
19
+ base.send :attr_accessor, :raw_xml
20
+ base.extend ClassMethods
21
+ end
22
+
23
+ def to_xml
24
+ doc = LibXML::XML::Document.new
25
+ doc.root = to_xml_node
26
+ doc.to_s
27
+ end
28
+
29
+ def to_xml_node(root_node = nil)
30
+ node = XML::Node.new(self.class.tag_name)
31
+ root_node ||= node
32
+ # add namespace to node and to root_element if not already set
33
+ if self.class.namespace_url
34
+ if root_node
35
+ namespace_object = root_node.namespaces.find_by_href(self.class.namespace_url)
36
+ namespace_object ||= XML::Namespace.new root_node, self.class.namespace, self.class.namespace_url
37
+ node.namespaces.namespace = namespace_object
38
+ end
39
+ end
40
+ # serialize elements
41
+ self.class.elements.each do |e|
42
+ if e.options[:single] == false
43
+ self.send("#{e.method_name}").each do |array_element|
44
+ node << e.to_xml_node(array_element,root_node)
45
+ end
46
+ else
47
+ element_value = self.send("#{e.method_name}")
48
+ node << e.to_xml_node(element_value,root_node) unless element_value.nil?
49
+ end
50
+ end
51
+ # serialize attributes
52
+ self.class.attributes.each do |a|
53
+ attribute_value = self.send("#{a.method_name}")
54
+ node.attributes[a.tag] = attribute_value.to_s unless attribute_value.nil?
55
+ end
56
+ node
57
+ end
58
+
59
+ module ClassMethods
60
+ # Control storing of raw XML data (off by default, but can be useful in certain situations)
61
+ @store_raw_xml = false
62
+
63
+ # Tell HappyMapper to store the raw XML in the appropriately-named raw_xml instance variable when parsing
64
+ def archive_raw_xml
65
+ @store_raw_xml = true
66
+ end
67
+
68
+ def store_raw_xml?
69
+ @store_raw_xml
70
+ end
71
+
72
+ def attribute(name, type, options={})
73
+ attribute = Attribute.new(name, type, options)
74
+ @attributes[to_s] ||= []
75
+ @attributes[to_s] << attribute
76
+ attr_accessor attribute.method_name.intern
77
+ end
78
+
79
+ def attributes
80
+ @attributes[to_s] || []
81
+ end
82
+
83
+ def element(name, type, options={})
84
+ options = {:namespace => @namespace}.merge(options)
85
+ element = Element.new(name, type, options)
86
+ @elements[to_s] ||= []
87
+ @elements[to_s] << element
88
+ attr_accessor element.method_name.intern
89
+
90
+ # set the default value of a collection instance variable to [] instead of nil
91
+ if options[:single] == false
92
+ module_eval <<-eof
93
+ def #{element.method_name}
94
+ @#{element.method_name} ||= []
95
+ end
96
+ eof
97
+ end
98
+ end
99
+
100
+ def elements
101
+ @elements[to_s] || []
102
+ end
103
+
104
+ def has_one(name, type, options={})
105
+ element name, type, {:single => true}.merge(options)
106
+ end
107
+
108
+ def has_many(name, type, options={})
109
+ element name, type, {:single => false}.merge(options)
110
+ end
111
+
112
+ # Specify a namespace if a node and all its children are all namespaced
113
+ # elements. This is simpler than passing the :namespace option to each
114
+ # defined element.
115
+ #
116
+ # namespace can either be a string for the prefix or a hash with 'prefix' => 'url'
117
+ def namespace(namespace = nil)
118
+ if namespace
119
+ if namespace.is_a? Hash
120
+ namespace.each_pair do |k,v|
121
+ @namespace = k.to_s
122
+ @namespace_url = v
123
+ end
124
+ else
125
+ @namespace = namespace
126
+ end
127
+ end
128
+ @namespace
129
+ end
130
+
131
+ def namespace_url(url = nil)
132
+ @namespace_url = url if url
133
+ @namespace_url
134
+ end
135
+
136
+ def tag(new_tag_name)
137
+ @tag_name = new_tag_name.to_s
138
+ end
139
+
140
+ def tag_name
141
+ @tag_name ||= to_s.split('::')[-1].downcase
142
+ end
143
+
144
+ def parse(xml, options = {})
145
+ # locally scoped copy of namespace for this parse run
146
+ namespace = @namespace
147
+
148
+ if xml.is_a?(XML::Node)
149
+ node = xml
150
+ else
151
+ if xml.is_a?(XML::Document)
152
+ node = xml.root
153
+ else
154
+ node = XML::Parser.string(xml).parse.root
155
+ end
156
+
157
+ root = node.name == tag_name
158
+ end
159
+
160
+ # This is the entry point into the parsing pipeline, so the default
161
+ # namespace prefix registered here will propagate down
162
+ namespaces = node.namespaces
163
+ if @namespace_url && namespaces.default.href != @namespace_url
164
+ namespace = namespaces.find_by_href(@namespace_url).prefix
165
+ elsif namespaces && namespaces.default
166
+ # don't assign the default_prefix if it has already been assigned
167
+ namespaces.default_prefix = DEFAULT_NS unless namespaces.find_by_prefix(DEFAULT_NS)
168
+ namespace ||= DEFAULT_NS
169
+ end
170
+
171
+ xpath = root ? '/' : (options[:deep]) ? './/' : './'
172
+ xpath += "#{namespace}:" if namespace
173
+ xpath += tag_name
174
+ # puts "parse: #{xpath}"
175
+
176
+ nodes = node.find(xpath)
177
+ collection = nodes.collect do |n|
178
+ obj = new
179
+ obj.raw_xml = n.to_s if obj.class.store_raw_xml?
180
+
181
+ attributes.each do |attr|
182
+ obj.send("#{attr.method_name}=",
183
+ attr.from_xml_node(n, namespace))
184
+ end
185
+
186
+ elements.each do |elem|
187
+ obj.send("#{elem.method_name}=",
188
+ elem.from_xml_node(n, namespace))
189
+ end
190
+
191
+ obj
192
+ end
193
+
194
+ # per http://libxml.rubyforge.org/rdoc/classes/LibXML/XML/Document.html#M000354
195
+ nodes = nil
196
+
197
+ if options[:single] || root
198
+ collection.first
199
+ else
200
+ collection
201
+ end
202
+ end
203
+
204
+ # Load for custom Marshaling
205
+ def _load(xml_str)
206
+ self.parse(xml_str)
207
+ end
208
+ end
209
+
210
+ # Define _load and _dump to allow Marshaling of HappyMapper objects. Note that this isn't as efficient as a
211
+ # binary data store could be, but such is the nature of XML.
212
+ def _dump(depth)
213
+ @raw_xml || self.to_xml
214
+ end
215
+
216
+ end
217
+
218
+ require 'happymapper/item'
219
+ require 'happymapper/attribute'
220
+ require 'happymapper/element'
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <address>
3
+ <street>Milchstrasse</street>
4
+ <housenumber>23</housenumber>
5
+ <postcode>26131</postcode>
6
+ <city>Oldenburg</city>
7
+ <country code="de">Germany</country>
8
+ </address>
@@ -0,0 +1,52 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <commit>
3
+ <removed type="array">
4
+ <removed>
5
+ <filename>commands.rb</filename>
6
+ </removed>
7
+ <removed>
8
+ <filename>helpers.rb</filename>
9
+ </removed>
10
+ </removed>
11
+ <added type="array">
12
+ <added>
13
+ <filename>commands/commands.rb</filename>
14
+ </added>
15
+ <added>
16
+ <filename>commands/helpers.rb</filename>
17
+ </added>
18
+ </added>
19
+ <message>move commands.rb and helpers.rb into commands/ dir</message>
20
+ <modified type="array">
21
+ <modified>
22
+ <diff>@@ -56,7 +56,7 @@ module GitHub
23
+ end
24
+
25
+ def load(file)
26
+ - file[0] == ?/ ? super : super(BasePath + "/#{file}")
27
+ + file[0] == ?/ ? super : super(BasePath + "/commands/#{file}")
28
+ end
29
+
30
+ def debug(*messages)</diff>
31
+ <filename>lib/github.rb</filename>
32
+ </modified>
33
+ </modified>
34
+ <parents type="array">
35
+ <parent>
36
+ <id>d462d2a2e60438ded3dd9e8e6593ca4146c5a0ba</id>
37
+ </parent>
38
+ </parents>
39
+ <url>http://github.com/defunkt/github-gem/commit/c26d4ce9807ecf57d3f9eefe19ae64e75bcaaa8b</url>
40
+ <author>
41
+ <name>Chris Wanstrath</name>
42
+ <email>chris@ozmm.org</email>
43
+ </author>
44
+ <id>c26d4ce9807ecf57d3f9eefe19ae64e75bcaaa8b</id>
45
+ <committed-date>2008-03-02T16:45:41-08:00</committed-date>
46
+ <authored-date>2008-03-02T16:45:41-08:00</authored-date>
47
+ <tree>28a1a1ca3e663d35ba8bf07d3f1781af71359b76</tree>
48
+ <committer>
49
+ <name>Chris Wanstrath</name>
50
+ <email>chris@ozmm.org</email>
51
+ </committer>
52
+ </commit>
@@ -0,0 +1,89 @@
1
+ <aws:weather xmlns:aws="http://www.aws.com/aws">
2
+ <aws:api version="2.0"/>
3
+ <aws:WebURL>http://weather.weatherbug.com/IN/Carmel-weather.html?ZCode=Z5546&amp;Units=0&amp;stat=MOCAR</aws:WebURL>
4
+ <aws:ob>
5
+ <aws:ob-date>
6
+ <aws:year number="2008"/>
7
+ <aws:month number="12" text="December" abbrv="Dec"/>
8
+ <aws:day number="30" text="Tuesday" abbrv="Tue"/>
9
+ <aws:hour number="4" hour-24="16"/>
10
+ <aws:minute number="18"/>
11
+ <aws:second number="01"/>
12
+ <aws:am-pm abbrv="PM"/>
13
+ <aws:time-zone offset="-5" text="Eastern Standard Time" abbrv="EST"/>
14
+ </aws:ob-date>
15
+ <aws:requested-station-id>mocar</aws:requested-station-id>
16
+ <aws:station-id>MOCAR</aws:station-id>
17
+ <aws:station>Mohawk Trail ES</aws:station>
18
+ <aws:city-state zipcode="46033">Carmel, IN</aws:city-state>
19
+ <aws:country>USA</aws:country>
20
+ <aws:latitude>39.9711111111111</aws:latitude>
21
+ <aws:longitude>-86.0938888888889</aws:longitude>
22
+ <aws:site-url>http://www1.ccs.k12.in.us/mte/home</aws:site-url>
23
+ <aws:aux-temp units="&amp;deg;F">74</aws:aux-temp>
24
+ <aws:aux-temp-rate units="&amp;deg;F">+0.0</aws:aux-temp-rate>
25
+ <aws:current-condition icon="http://deskwx.weatherbug.com/images/Forecast/icons/cond007.gif">Sunny</aws:current-condition>
26
+ <aws:dew-point units="&amp;deg;F">35</aws:dew-point>
27
+ <aws:elevation units="ft">817</aws:elevation>
28
+ <aws:feels-like units="&amp;deg;F">51</aws:feels-like>
29
+ <aws:gust-time>
30
+ <aws:year number="0001"/>
31
+ <aws:month number="1" text="January" abbrv="Jan"/>
32
+ <aws:day number="1" text="Monday" abbrv="Mon"/>
33
+ <aws:hour number="12" hour-24="00"/>
34
+ <aws:minute number="00"/>
35
+ <aws:second number="00"/>
36
+ <aws:am-pm abbrv="AM"/>
37
+ <aws:time-zone offset="-5" text="Eastern Standard Time" abbrv="EST"/>
38
+ </aws:gust-time>
39
+ <aws:gust-direction>W</aws:gust-direction>
40
+ <aws:gust-speed units="mph">25</aws:gust-speed>
41
+ <aws:humidity units="%">53</aws:humidity>
42
+ <aws:humidity-high units="%">100.0</aws:humidity-high>
43
+ <aws:humidity-low units="%">42.5</aws:humidity-low>
44
+ <aws:humidity-rate>-5.0</aws:humidity-rate>
45
+ <aws:indoor-temp units="&amp;deg;F">75</aws:indoor-temp>
46
+ <aws:indoor-temp-rate units="&amp;deg;F">+0.0</aws:indoor-temp-rate>
47
+ <aws:light>28</aws:light>
48
+ <aws:light-rate>-1.5</aws:light-rate>
49
+ <aws:moon-phase moon-phase-img="http://api.wxbug.net/images/moonphase/mphase02.gif">-10</aws:moon-phase>
50
+ <aws:pressure units="&quot;">29.71</aws:pressure>
51
+ <aws:pressure-high units="&quot;">30.18</aws:pressure-high>
52
+ <aws:pressure-low units="&quot;">29.71</aws:pressure-low>
53
+ <aws:pressure-rate units="&quot;/h">-0.04</aws:pressure-rate>
54
+ <aws:rain-month units="&quot;">6.64</aws:rain-month>
55
+ <aws:rain-rate units="&quot;/h">0.00</aws:rain-rate>
56
+ <aws:rain-rate-max units="&quot;/h">0.00</aws:rain-rate-max>
57
+ <aws:rain-today units="&quot;">0.00</aws:rain-today>
58
+ <aws:rain-year units="&quot;">53.83</aws:rain-year>
59
+ <aws:temp units="&amp;deg;F">51.8</aws:temp>
60
+ <aws:temp-high units="&amp;deg;F">52</aws:temp-high>
61
+ <aws:temp-low units="&amp;deg;F">29</aws:temp-low>
62
+ <aws:temp-rate units="&amp;deg;F/h">+2.5</aws:temp-rate>
63
+ <aws:sunrise>
64
+ <aws:year number="2008"/>
65
+ <aws:month number="12" text="December" abbrv="Dec"/>
66
+ <aws:day number="30" text="Tuesday" abbrv="Tue"/>
67
+ <aws:hour number="8" hour-24="08"/>
68
+ <aws:minute number="06"/>
69
+ <aws:second number="02"/>
70
+ <aws:am-pm abbrv="AM"/>
71
+ <aws:time-zone offset="-5" text="Eastern Standard Time" abbrv="EST"/>
72
+ </aws:sunrise>
73
+ <aws:sunset>
74
+ <aws:year number="2008"/>
75
+ <aws:month number="12" text="December" abbrv="Dec"/>
76
+ <aws:day number="30" text="Tuesday" abbrv="Tue"/>
77
+ <aws:hour number="5" hour-24="17"/>
78
+ <aws:minute number="28"/>
79
+ <aws:second number="53"/>
80
+ <aws:am-pm abbrv="PM"/>
81
+ <aws:time-zone offset="-5" text="Eastern Standard Time" abbrv="EST"/>
82
+ </aws:sunset>
83
+ <aws:wet-bulb units="&amp;deg;F">44.24</aws:wet-bulb>
84
+ <aws:wind-speed units="mph">4</aws:wind-speed>
85
+ <aws:wind-speed-avg units="mph">7</aws:wind-speed-avg>
86
+ <aws:wind-direction>SSW</aws:wind-direction>
87
+ <aws:wind-direction-avg>SW</aws:wind-direction-avg>
88
+ </aws:ob>
89
+ </aws:weather>
@@ -0,0 +1,23 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
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
+ <persons>
4
+ <person version="1199378491000" modified="2008-01-03T09:41:31-07:00" id="KWQS-BBQ">
5
+ <fsapi-v1:information>
6
+ <fsapi-v1:alternateIds>
7
+ <fsapi-v1:id>gedcom.1B5E3087E36D814FA9CBE0BE5B3721EA</fsapi-v1:id>
8
+ <fsapi-v1:id>KWQS-BB3</fsapi-v1:id>
9
+ <fsapi-v1:id>KWQS-W23</fsapi-v1:id>
10
+ <fsapi-v1:id>KWQS-W2S</fsapi-v1:id>
11
+ <fsapi-v1:id>KWQS-W29</fsapi-v1:id>
12
+ <fsapi-v1:id>KWQM-MMM</fsapi-v1:id>
13
+ <fsapi-v1:id>KWQS-W2Q</fsapi-v1:id>
14
+ <fsapi-v1:id>KWQS-BBQ</fsapi-v1:id>
15
+ </fsapi-v1:alternateIds>
16
+ <fsapi-v1:gender>Male</fsapi-v1:gender>
17
+ <fsapi-v1:living>false</fsapi-v1:living>
18
+ </fsapi-v1:information>
19
+ <!-- element to make sure that we're not parsing deep when not supposed to -->
20
+ <person id="KWQS-BBR" />
21
+ </person>
22
+ </persons>
23
+ </familytree>
@@ -0,0 +1,170 @@
1
+ <?xml version='1.0' encoding='UTF-8'?>
2
+ <v2:TrackReply xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:v2='http://fedex.com/ws/track/v2'>
3
+ <v2:HighestSeverity>SUCCESS</v2:HighestSeverity>
4
+ <v2:Notifications>
5
+ <v2:Severity>SUCCESS</v2:Severity>
6
+ <v2:Source>trck</v2:Source>
7
+ <v2:Code>0</v2:Code>
8
+ <v2:Message>Request was successfully processed.</v2:Message>
9
+ <v2:LocalizedMessage>Request was successfully processed.</v2:LocalizedMessage>
10
+ </v2:Notifications>
11
+ <ns:TransactionDetail xmlns:ns='http://fedex.com/ws/track/v2'>
12
+ <ns:CustomerTransactionId>20090102-111321</ns:CustomerTransactionId>
13
+ </ns:TransactionDetail>
14
+ <ns:Version xmlns:ns='http://fedex.com/ws/track/v2'>
15
+ <ns:ServiceId>trck</ns:ServiceId>
16
+ <ns:Major>2</ns:Major>
17
+ <ns:Intermediate>0</ns:Intermediate>
18
+ <ns:Minor>0</ns:Minor>
19
+ </ns:Version>
20
+ <v2:DuplicateWaybill>false</v2:DuplicateWaybill>
21
+ <v2:MoreData>false</v2:MoreData>
22
+ <v2:TrackDetails>
23
+ <v2:TrackingNumber>9611018034267800045212</v2:TrackingNumber>
24
+ <v2:TrackingNumberUniqueIdentifier>120081227094248461000~034267800045212</v2:TrackingNumberUniqueIdentifier>
25
+ <v2:StatusCode>OD</v2:StatusCode>
26
+ <v2:StatusDescription>On FedEx vehicle for delivery</v2:StatusDescription>
27
+ <v2:CarrierCode>FDXG</v2:CarrierCode>
28
+ <v2:ServiceInfo>Ground-Package Returns Program-Domestic</v2:ServiceInfo>
29
+ <v2:PackageWeight>
30
+ <v2:Units>LB</v2:Units>
31
+ <v2:Value>2.6</v2:Value>
32
+ </v2:PackageWeight>
33
+ <v2:Packaging>Package</v2:Packaging>
34
+ <v2:PackageSequenceNumber>1</v2:PackageSequenceNumber>
35
+ <v2:PackageCount>1</v2:PackageCount>
36
+ <v2:OriginLocationAddress>
37
+ <v2:City>SANFORD</v2:City>
38
+ <v2:StateOrProvinceCode>FL</v2:StateOrProvinceCode>
39
+ <v2:CountryCode>US</v2:CountryCode>
40
+ <v2:Residential>false</v2:Residential>
41
+ </v2:OriginLocationAddress>
42
+ <v2:ShipTimestamp>2008-12-29T00:00:00</v2:ShipTimestamp>
43
+ <v2:EstimatedDeliveryTimestamp>2009-01-02T00:00:00</v2:EstimatedDeliveryTimestamp>
44
+ <v2:SignatureProofOfDeliveryAvailable>false</v2:SignatureProofOfDeliveryAvailable>
45
+ <v2:ProofOfDeliveryNotificationsAvailable>true</v2:ProofOfDeliveryNotificationsAvailable>
46
+ <v2:ExceptionNotificationsAvailable>true</v2:ExceptionNotificationsAvailable>
47
+ <v2:Events>
48
+ <v2:Timestamp>2009-01-02T06:00:00</v2:Timestamp>
49
+ <v2:EventType>OD</v2:EventType>
50
+ <v2:EventDescription>On FedEx vehicle for delivery</v2:EventDescription>
51
+ <v2:Address>
52
+ <v2:City>WICHITA</v2:City>
53
+ <v2:StateOrProvinceCode>KS</v2:StateOrProvinceCode>
54
+ <v2:PostalCode>67226</v2:PostalCode>
55
+ <v2:CountryCode>US</v2:CountryCode>
56
+ <v2:Residential>false</v2:Residential>
57
+ </v2:Address>
58
+ </v2:Events>
59
+ <v2:Events>
60
+ <v2:Timestamp>2009-01-02T01:17:32</v2:Timestamp>
61
+ <v2:EventType>AR</v2:EventType>
62
+ <v2:EventDescription>At local FedEx facility</v2:EventDescription>
63
+ <v2:Address>
64
+ <v2:City>WICHITA</v2:City>
65
+ <v2:StateOrProvinceCode>KS</v2:StateOrProvinceCode>
66
+ <v2:PostalCode>67226</v2:PostalCode>
67
+ <v2:CountryCode>US</v2:CountryCode>
68
+ <v2:Residential>false</v2:Residential>
69
+ </v2:Address>
70
+ </v2:Events>
71
+ <v2:Events>
72
+ <v2:Timestamp>2009-01-01T21:49:49</v2:Timestamp>
73
+ <v2:EventType>DP</v2:EventType>
74
+ <v2:EventDescription>Departed FedEx location</v2:EventDescription>
75
+ <v2:Address>
76
+ <v2:City>LENEXA</v2:City>
77
+ <v2:StateOrProvinceCode>KS</v2:StateOrProvinceCode>
78
+ <v2:PostalCode>66227</v2:PostalCode>
79
+ <v2:CountryCode>US</v2:CountryCode>
80
+ <v2:Residential>false</v2:Residential>
81
+ </v2:Address>
82
+ </v2:Events>
83
+ <v2:Events>
84
+ <v2:Timestamp>2008-12-31T16:19:00</v2:Timestamp>
85
+ <v2:EventType>AR</v2:EventType>
86
+ <v2:EventDescription>Arrived at FedEx location</v2:EventDescription>
87
+ <v2:Address>
88
+ <v2:City>LENEXA</v2:City>
89
+ <v2:StateOrProvinceCode>KS</v2:StateOrProvinceCode>
90
+ <v2:PostalCode>66227</v2:PostalCode>
91
+ <v2:CountryCode>US</v2:CountryCode>
92
+ <v2:Residential>false</v2:Residential>
93
+ </v2:Address>
94
+ </v2:Events>
95
+ <v2:Events>
96
+ <v2:Timestamp>2008-12-30T11:01:23</v2:Timestamp>
97
+ <v2:EventType>DP</v2:EventType>
98
+ <v2:EventDescription>Departed FedEx location</v2:EventDescription>
99
+ <v2:Address>
100
+ <v2:City>ORLANDO</v2:City>
101
+ <v2:StateOrProvinceCode>FL</v2:StateOrProvinceCode>
102
+ <v2:PostalCode>32809</v2:PostalCode>
103
+ <v2:CountryCode>US</v2:CountryCode>
104
+ <v2:Residential>false</v2:Residential>
105
+ </v2:Address>
106
+ </v2:Events>
107
+ <v2:Events>
108
+ <v2:Timestamp>2008-12-30T05:00:00</v2:Timestamp>
109
+ <v2:EventType>AR</v2:EventType>
110
+ <v2:EventDescription>Arrived at FedEx location</v2:EventDescription>
111
+ <v2:Address>
112
+ <v2:City>ORLANDO</v2:City>
113
+ <v2:StateOrProvinceCode>FL</v2:StateOrProvinceCode>
114
+ <v2:PostalCode>32809</v2:PostalCode>
115
+ <v2:CountryCode>US</v2:CountryCode>
116
+ <v2:Residential>false</v2:Residential>
117
+ </v2:Address>
118
+ </v2:Events>
119
+ <v2:Events>
120
+ <v2:Timestamp>2008-12-30T03:16:33</v2:Timestamp>
121
+ <v2:EventType>DP</v2:EventType>
122
+ <v2:EventDescription>Left FedEx origin facility</v2:EventDescription>
123
+ <v2:Address>
124
+ <v2:City>SANFORD</v2:City>
125
+ <v2:StateOrProvinceCode>FL</v2:StateOrProvinceCode>
126
+ <v2:PostalCode>32771</v2:PostalCode>
127
+ <v2:CountryCode>US</v2:CountryCode>
128
+ <v2:Residential>false</v2:Residential>
129
+ </v2:Address>
130
+ </v2:Events>
131
+ <v2:Events>
132
+ <v2:Timestamp>2008-12-29T22:46:00</v2:Timestamp>
133
+ <v2:EventType>AR</v2:EventType>
134
+ <v2:EventDescription>Arrived at FedEx location</v2:EventDescription>
135
+ <v2:Address>
136
+ <v2:City>SANFORD</v2:City>
137
+ <v2:StateOrProvinceCode>FL</v2:StateOrProvinceCode>
138
+ <v2:PostalCode>32771</v2:PostalCode>
139
+ <v2:CountryCode>US</v2:CountryCode>
140
+ <v2:Residential>false</v2:Residential>
141
+ </v2:Address>
142
+ </v2:Events>
143
+ <v2:Events>
144
+ <v2:Timestamp>2008-12-29T17:12:00</v2:Timestamp>
145
+ <v2:EventType>PU</v2:EventType>
146
+ <v2:EventDescription>Picked up</v2:EventDescription>
147
+ <v2:Address>
148
+ <v2:City>SANFORD</v2:City>
149
+ <v2:StateOrProvinceCode>FL</v2:StateOrProvinceCode>
150
+ <v2:PostalCode>32771</v2:PostalCode>
151
+ <v2:CountryCode>US</v2:CountryCode>
152
+ <v2:Residential>false</v2:Residential>
153
+ </v2:Address>
154
+ </v2:Events>
155
+ <v2:Events>
156
+ <v2:Timestamp>2008-12-27T09:40:00</v2:Timestamp>
157
+ <v2:EventType>IP</v2:EventType>
158
+ <v2:EventDescription>In FedEx possession</v2:EventDescription>
159
+ <v2:StatusExceptionCode>084</v2:StatusExceptionCode>
160
+ <v2:StatusExceptionDescription>Tendered at FedEx location</v2:StatusExceptionDescription>
161
+ <v2:Address>
162
+ <v2:City>LONGWOOD</v2:City>
163
+ <v2:StateOrProvinceCode>FL</v2:StateOrProvinceCode>
164
+ <v2:PostalCode>327506398</v2:PostalCode>
165
+ <v2:CountryCode>US</v2:CountryCode>
166
+ <v2:Residential>false</v2:Residential>
167
+ </v2:Address>
168
+ </v2:Events>
169
+ </v2:TrackDetails>
170
+ </v2:TrackReply>
@@ -0,0 +1,5 @@
1
+ <!-- Posts missing attributes -->
2
+ <posts>
3
+ <post />
4
+ </posts>
5
+ <!-- fe04.api.del.ac4.yahoo.net uncompressed/chunked Sat Aug 9 00:20:11 PDT 2008 -->