after_ship 0.0.2 → 0.0.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.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/README.md +69 -32
- data/after_ship.gemspec +4 -4
- data/lib/after_ship/checkpoint.rb +35 -28
- data/lib/after_ship/core/attributes.rb +14 -0
- data/lib/after_ship/core/date_utils.rb +76 -0
- data/lib/after_ship/core/error.rb +29 -0
- data/lib/after_ship/core/error_handler.rb +67 -0
- data/lib/after_ship/core/request.rb +131 -0
- data/lib/after_ship/core/version.rb +4 -0
- data/lib/after_ship/courier.rb +45 -0
- data/lib/after_ship/tracking.rb +78 -6
- data/lib/after_ship.rb +158 -214
- data/spec/integration/after_ship_spec.rb +40 -0
- data/spec/request_stubs.rb +30 -97
- data/spec/requests/couriers.json +50 -0
- data/spec/requests/tracking/created.json +53 -0
- data/spec/requests/tracking/{delivered_ok.json → delivered.json} +79 -65
- data/spec/requests/trackings.json +654 -0
- data/spec/units/after_ship_spec.rb +104 -0
- data/spec/units/checkpoint_spec.rb +135 -0
- data/spec/units/courier_spec.rb +41 -0
- data/spec/{lib → units}/date_utils_spec.rb +17 -9
- data/spec/units/error_handler_spec.rb +168 -0
- data/spec/units/request_spec.rb +190 -0
- data/spec/units/tracking_spec.rb +276 -0
- metadata +39 -25
- data/lib/after_ship/version.rb +0 -3
- data/lib/attributes.rb +0 -12
- data/lib/date_utils.rb +0 -61
- data/spec/lib/after_ship_spec.rb +0 -137
- data/spec/lib/checkpoint_spec.rb +0 -139
- data/spec/lib/tracking_spec.rb +0 -89
- data/spec/requests/tracking/delivered_wild.json +0 -653
- data/spec/requests/tracking/in_transit.json +0 -443
data/spec/request_stubs.rb
CHANGED
@@ -1,133 +1,66 @@
|
|
1
|
-
# trackings
|
1
|
+
# Get trackings
|
2
2
|
WebMock.stub_request(
|
3
3
|
:get,
|
4
|
-
'https://api.aftership.com/
|
4
|
+
'https://api.aftership.com/v4/trackings'
|
5
5
|
).with(
|
6
|
-
body: '{}',
|
7
6
|
headers: { 'Aftership-Api-Key' => 'key' }
|
8
7
|
).to_return(
|
9
8
|
status: 200,
|
10
|
-
body:
|
9
|
+
body: File.open('spec/requests/trackings.json')
|
11
10
|
)
|
12
11
|
|
13
|
-
#
|
12
|
+
# Get a tracking
|
14
13
|
WebMock.stub_request(
|
15
14
|
:get,
|
16
|
-
'https://api.aftership.com/
|
15
|
+
'https://api.aftership.com/v4/trackings/ups/delivered'
|
17
16
|
).with(
|
18
|
-
body: '{}',
|
19
17
|
headers: { 'Aftership-Api-Key' => 'key' }
|
20
18
|
).to_return(
|
21
19
|
status: 200,
|
22
|
-
body: File.open('spec/requests/tracking/
|
20
|
+
body: File.open('spec/requests/tracking/delivered.json')
|
23
21
|
)
|
24
22
|
|
25
|
-
#
|
26
|
-
WebMock.stub_request(
|
27
|
-
:get,
|
28
|
-
'https://api.aftership.com/v3/trackings/ups/delivered-wild'
|
29
|
-
).with(
|
30
|
-
body: '{}',
|
31
|
-
headers: { 'Aftership-Api-Key' => 'key' }
|
32
|
-
).to_return(
|
33
|
-
status: 200,
|
34
|
-
body: File.open('spec/requests/tracking/delivered_wild.json')
|
35
|
-
)
|
36
|
-
|
37
|
-
# tracking with real in-transit data
|
38
|
-
WebMock.stub_request(
|
39
|
-
:get,
|
40
|
-
'https://api.aftership.com/v3/trackings/usps/in-transit'
|
41
|
-
).with(
|
42
|
-
body: '{}',
|
43
|
-
headers: { 'Aftership-Api-Key' => 'key' }
|
44
|
-
).to_return(
|
45
|
-
status: 200,
|
46
|
-
body: File.open('spec/requests/tracking/in_transit.json')
|
47
|
-
)
|
48
|
-
|
49
|
-
# tracking
|
50
|
-
WebMock.stub_request(
|
51
|
-
:get,
|
52
|
-
'https://api.aftership.com/v3/trackings/ups/ABC123'
|
53
|
-
).with(
|
54
|
-
body: '{}',
|
55
|
-
headers: { 'Aftership-Api-Key' => 'key' }
|
56
|
-
).to_return(
|
57
|
-
status: 200,
|
58
|
-
body: %({"meta":{"code":200},"data":{"tracking":{}}})
|
59
|
-
)
|
60
|
-
|
61
|
-
[201, 400, 401, 402, 404, 409, 429, 500, 502, 503, 504, 666].each do |code|
|
62
|
-
WebMock.stub_request(
|
63
|
-
:get,
|
64
|
-
"https://api.aftership.com/v3/trackings/ups/#{ code }"
|
65
|
-
).with(
|
66
|
-
body: '{}',
|
67
|
-
headers: { 'Aftership-Api-Key' => 'key' }
|
68
|
-
).to_return(
|
69
|
-
status: 200,
|
70
|
-
body: %({"meta":{"code":#{code}},"data":{"tracking":{"slug":"ups"}}})
|
71
|
-
)
|
72
|
-
end
|
73
|
-
|
74
|
-
# create_tracking
|
23
|
+
# Create a tracking
|
75
24
|
WebMock.stub_request(
|
76
25
|
:post,
|
77
|
-
'https://api.aftership.com/
|
26
|
+
'https://api.aftership.com/v4/trackings'
|
78
27
|
).with(
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
:post,
|
88
|
-
'https://api.aftership.com/v3/trackings'
|
89
|
-
).with(
|
90
|
-
body: %({"tracking":{"tracking_number":"ABC123","slug":"ups","order_id":"1234"}}), # rubocop:disable Metrics/LineLength
|
91
|
-
headers: { 'Aftership-Api-Key' => 'key' }
|
28
|
+
headers: { 'Aftership-Api-Key' => 'key' },
|
29
|
+
body: MultiJson.dump(
|
30
|
+
'tracking' => {
|
31
|
+
'tracking_number' => 'created',
|
32
|
+
'slug' => 'ups',
|
33
|
+
'order_id' => 'external-id'
|
34
|
+
}
|
35
|
+
)
|
92
36
|
).to_return(
|
93
37
|
status: 200,
|
94
|
-
body:
|
38
|
+
body: File.open('spec/requests/tracking/created.json')
|
95
39
|
)
|
96
40
|
|
97
|
-
#
|
98
|
-
|
41
|
+
# Update a tracking
|
99
42
|
WebMock.stub_request(
|
100
43
|
:put,
|
101
|
-
'https://api.aftership.com/
|
44
|
+
'https://api.aftership.com/v4/trackings/ups/updated'
|
102
45
|
).with(
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
## App-specific AfterShip tests
|
111
|
-
|
112
|
-
# create_tracking
|
113
|
-
WebMock.stub_request(
|
114
|
-
:post,
|
115
|
-
'https://api.aftership.com/v3/trackings'
|
116
|
-
).with(
|
117
|
-
body: %({"tracking":{"tracking_number":"ABC123","slug":"ups","order_id":"1234"}}), # rubocop:disable Metrics/LineLength
|
118
|
-
headers: { 'Aftership-Api-Key' => 'key' }
|
46
|
+
headers: { 'Aftership-Api-Key' => 'key' },
|
47
|
+
body: MultiJson.dump(
|
48
|
+
'tracking' => {
|
49
|
+
'order_id' => 'external-id'
|
50
|
+
}
|
51
|
+
)
|
119
52
|
).to_return(
|
120
53
|
status: 200,
|
121
|
-
body:
|
54
|
+
body: File.open('spec/requests/tracking/created.json')
|
122
55
|
)
|
123
56
|
|
57
|
+
# Couriers
|
124
58
|
WebMock.stub_request(
|
125
|
-
:
|
126
|
-
'https://api.aftership.com/
|
59
|
+
:get,
|
60
|
+
'https://api.aftership.com/v4/couriers'
|
127
61
|
).with(
|
128
|
-
body: %({"tracking":{"tracking_number":"EXISTING","slug":"ups","order_id":"1234"}}), # rubocop:disable Metrics/LineLength
|
129
62
|
headers: { 'Aftership-Api-Key' => 'key' }
|
130
63
|
).to_return(
|
131
64
|
status: 200,
|
132
|
-
body:
|
65
|
+
body: File.open('spec/requests/couriers.json')
|
133
66
|
)
|
@@ -0,0 +1,50 @@
|
|
1
|
+
{
|
2
|
+
"meta": {
|
3
|
+
"code": 200
|
4
|
+
},
|
5
|
+
"data": {
|
6
|
+
"total": 4,
|
7
|
+
"couriers": [
|
8
|
+
{
|
9
|
+
"slug": "usps",
|
10
|
+
"name": "USPS",
|
11
|
+
"phone": "+1 800-275-8777",
|
12
|
+
"other_name": "United States Postal Service",
|
13
|
+
"web_url": "https://www.usps.com",
|
14
|
+
"required_fields": [
|
15
|
+
|
16
|
+
]
|
17
|
+
},
|
18
|
+
{
|
19
|
+
"slug": "ups",
|
20
|
+
"name": "UPS",
|
21
|
+
"phone": "+1 800 742 5877",
|
22
|
+
"other_name": "United Parcel Service",
|
23
|
+
"web_url": "http://www.ups.com",
|
24
|
+
"required_fields": [
|
25
|
+
|
26
|
+
]
|
27
|
+
},
|
28
|
+
{
|
29
|
+
"slug": "fedex",
|
30
|
+
"name": "FedEx",
|
31
|
+
"phone": "+1 800 247 4747",
|
32
|
+
"other_name": "Federal Express",
|
33
|
+
"web_url": "http://www.fedex.com/",
|
34
|
+
"required_fields": [
|
35
|
+
|
36
|
+
]
|
37
|
+
},
|
38
|
+
{
|
39
|
+
"slug": "dhl",
|
40
|
+
"name": "DHL Express",
|
41
|
+
"phone": "+1 800 225 5345",
|
42
|
+
"other_name": "DHL International",
|
43
|
+
"web_url": "http://www.dhl.com/",
|
44
|
+
"required_fields": [
|
45
|
+
|
46
|
+
]
|
47
|
+
}
|
48
|
+
]
|
49
|
+
}
|
50
|
+
}
|
@@ -0,0 +1,53 @@
|
|
1
|
+
{
|
2
|
+
"meta": {
|
3
|
+
"code": 201
|
4
|
+
},
|
5
|
+
"data": {
|
6
|
+
"tracking": {
|
7
|
+
"id": "547348581a374b0a3d91f2ba",
|
8
|
+
"created_at": "2014-11-24T15:01:44+00:00",
|
9
|
+
"updated_at": "2014-11-24T15:01:44+00:00",
|
10
|
+
"tracking_number": "1Z0659120300549388",
|
11
|
+
"tracking_account_number": null,
|
12
|
+
"tracking_postal_code": null,
|
13
|
+
"tracking_ship_date": null,
|
14
|
+
"slug": "ups",
|
15
|
+
"active": true,
|
16
|
+
"android": [
|
17
|
+
|
18
|
+
],
|
19
|
+
"custom_fields": {
|
20
|
+
},
|
21
|
+
"customer_name": null,
|
22
|
+
"delivery_time": 0,
|
23
|
+
"destination_country_iso3": null,
|
24
|
+
"emails": [
|
25
|
+
|
26
|
+
],
|
27
|
+
"expected_delivery": null,
|
28
|
+
"ios": [
|
29
|
+
|
30
|
+
],
|
31
|
+
"note": null,
|
32
|
+
"order_id": "external-id",
|
33
|
+
"order_id_path": null,
|
34
|
+
"origin_country_iso3": null,
|
35
|
+
"shipment_package_count": 0,
|
36
|
+
"shipment_type": null,
|
37
|
+
"shipment_weight": 0,
|
38
|
+
"shipment_weight_unit": "",
|
39
|
+
"signed_by": null,
|
40
|
+
"smses": [
|
41
|
+
|
42
|
+
],
|
43
|
+
"source": "api",
|
44
|
+
"tag": "Pending",
|
45
|
+
"title": "1Z0659120300549388",
|
46
|
+
"tracked_count": 0,
|
47
|
+
"unique_token": "Zyw-V8LlD",
|
48
|
+
"checkpoints": [
|
49
|
+
|
50
|
+
]
|
51
|
+
}
|
52
|
+
}
|
53
|
+
}
|
@@ -4,43 +4,57 @@
|
|
4
4
|
},
|
5
5
|
"data": {
|
6
6
|
"tracking": {
|
7
|
-
"
|
8
|
-
"
|
9
|
-
"
|
7
|
+
"id": "5457a109bb8bce546b7abafa",
|
8
|
+
"created_at": "2014-11-03T15:36:41+00:00",
|
9
|
+
"updated_at": "2014-11-03T19:55:45+00:00",
|
10
|
+
"tracking_number": "1ZA2207X0444990982",
|
11
|
+
"tracking_account_number": null,
|
12
|
+
"tracking_postal_code": null,
|
13
|
+
"tracking_ship_date": null,
|
10
14
|
"slug": "ups",
|
11
15
|
"active": false,
|
16
|
+
"android": [
|
17
|
+
|
18
|
+
],
|
12
19
|
"custom_fields": {
|
13
20
|
},
|
14
21
|
"customer_name": null,
|
22
|
+
"delivery_time": 4,
|
15
23
|
"destination_country_iso3": "USA",
|
16
24
|
"emails": [
|
17
25
|
|
18
26
|
],
|
19
27
|
"expected_delivery": null,
|
20
|
-
"
|
28
|
+
"ios": [
|
29
|
+
|
30
|
+
],
|
31
|
+
"note": null,
|
32
|
+
"order_id": "PL-35210992",
|
21
33
|
"order_id_path": null,
|
22
34
|
"origin_country_iso3": "IND",
|
23
|
-
"shipment_package_count":
|
24
|
-
"shipment_type": "
|
25
|
-
"
|
35
|
+
"shipment_package_count": 1,
|
36
|
+
"shipment_type": "UPS SAVER",
|
37
|
+
"shipment_weight": 1,
|
38
|
+
"shipment_weight_unit": "kg",
|
39
|
+
"signed_by": "A GUPTA (OFFICE)",
|
26
40
|
"smses": [
|
27
41
|
|
28
42
|
],
|
29
43
|
"source": "api",
|
30
44
|
"tag": "Delivered",
|
31
|
-
"title": "
|
32
|
-
"tracked_count":
|
33
|
-
"unique_token": "
|
45
|
+
"title": "1ZA2207X0444990982",
|
46
|
+
"tracked_count": 3,
|
47
|
+
"unique_token": "bk6ysTW1U",
|
34
48
|
"checkpoints": [
|
35
49
|
{
|
36
50
|
"slug": "ups",
|
37
51
|
"city": null,
|
38
|
-
"created_at": "2014-
|
52
|
+
"created_at": "2014-11-03T15:36:41+00:00",
|
39
53
|
"country_name": "IN",
|
40
54
|
"message": "BILLING INFORMATION RECEIVED",
|
41
55
|
"country_iso3": "IND",
|
42
56
|
"tag": "InfoReceived",
|
43
|
-
"checkpoint_time": "2014-
|
57
|
+
"checkpoint_time": "2014-10-30T10:05:48",
|
44
58
|
"coordinates": [
|
45
59
|
|
46
60
|
],
|
@@ -50,12 +64,12 @@
|
|
50
64
|
{
|
51
65
|
"slug": "ups",
|
52
66
|
"city": "MUMBAI",
|
53
|
-
"created_at": "2014-
|
67
|
+
"created_at": "2014-11-03T15:36:41+00:00",
|
54
68
|
"country_name": "IN",
|
55
69
|
"message": "PICKUP SCAN",
|
56
70
|
"country_iso3": null,
|
57
71
|
"tag": "InTransit",
|
58
|
-
"checkpoint_time": "2014-
|
72
|
+
"checkpoint_time": "2014-10-30T20:02:00",
|
59
73
|
"coordinates": [
|
60
74
|
|
61
75
|
],
|
@@ -65,12 +79,12 @@
|
|
65
79
|
{
|
66
80
|
"slug": "ups",
|
67
81
|
"city": "MUMBAI",
|
68
|
-
"created_at": "2014-
|
82
|
+
"created_at": "2014-11-03T15:36:42+00:00",
|
69
83
|
"country_name": "IN",
|
70
84
|
"message": "ORIGIN SCAN",
|
71
85
|
"country_iso3": null,
|
72
86
|
"tag": "InTransit",
|
73
|
-
"checkpoint_time": "2014-
|
87
|
+
"checkpoint_time": "2014-10-31T02:54:00",
|
74
88
|
"coordinates": [
|
75
89
|
|
76
90
|
],
|
@@ -80,12 +94,12 @@
|
|
80
94
|
{
|
81
95
|
"slug": "ups",
|
82
96
|
"city": "MUMBAI",
|
83
|
-
"created_at": "2014-
|
97
|
+
"created_at": "2014-11-03T15:36:42+00:00",
|
84
98
|
"country_name": "IN",
|
85
99
|
"message": "DEPARTURE SCAN",
|
86
100
|
"country_iso3": null,
|
87
101
|
"tag": "InTransit",
|
88
|
-
"checkpoint_time": "2014-
|
102
|
+
"checkpoint_time": "2014-10-31T05:45:00",
|
89
103
|
"coordinates": [
|
90
104
|
|
91
105
|
],
|
@@ -95,12 +109,12 @@
|
|
95
109
|
{
|
96
110
|
"slug": "ups",
|
97
111
|
"city": "MUMBAI",
|
98
|
-
"created_at": "2014-
|
112
|
+
"created_at": "2014-11-03T15:36:42+00:00",
|
99
113
|
"country_name": "IN",
|
100
114
|
"message": "ARRIVAL SCAN",
|
101
115
|
"country_iso3": null,
|
102
116
|
"tag": "InTransit",
|
103
|
-
"checkpoint_time": "2014-
|
117
|
+
"checkpoint_time": "2014-10-31T06:01:00",
|
104
118
|
"coordinates": [
|
105
119
|
|
106
120
|
],
|
@@ -110,12 +124,12 @@
|
|
110
124
|
{
|
111
125
|
"slug": "ups",
|
112
126
|
"city": "MUMBAI",
|
113
|
-
"created_at": "2014-
|
127
|
+
"created_at": "2014-11-03T15:36:42+00:00",
|
114
128
|
"country_name": "IN",
|
115
129
|
"message": "DEPARTURE SCAN",
|
116
130
|
"country_iso3": null,
|
117
131
|
"tag": "InTransit",
|
118
|
-
"checkpoint_time": "2014-
|
132
|
+
"checkpoint_time": "2014-10-31T16:55:00",
|
119
133
|
"coordinates": [
|
120
134
|
|
121
135
|
],
|
@@ -124,13 +138,13 @@
|
|
124
138
|
},
|
125
139
|
{
|
126
140
|
"slug": "ups",
|
127
|
-
"city":
|
128
|
-
"created_at": "2014-
|
141
|
+
"city": null,
|
142
|
+
"created_at": "2014-11-03T15:36:42+00:00",
|
129
143
|
"country_name": "DE",
|
130
|
-
"message": "
|
131
|
-
"country_iso3":
|
144
|
+
"message": "THE PACKAGE IS AWAITING CLEARING AGENCY REVIEW. / THE PACKAGE IS AT THE CLEARING AGENCY AWAITING FINAL RELEASE.",
|
145
|
+
"country_iso3": "DEU",
|
132
146
|
"tag": "InTransit",
|
133
|
-
"checkpoint_time": "2014-
|
147
|
+
"checkpoint_time": "2014-11-01T00:18:00",
|
134
148
|
"coordinates": [
|
135
149
|
|
136
150
|
],
|
@@ -140,12 +154,12 @@
|
|
140
154
|
{
|
141
155
|
"slug": "ups",
|
142
156
|
"city": "KOELN (COLOGNE)",
|
143
|
-
"created_at": "2014-
|
157
|
+
"created_at": "2014-11-03T15:36:42+00:00",
|
144
158
|
"country_name": "DE",
|
145
159
|
"message": "DEPARTURE SCAN",
|
146
160
|
"country_iso3": null,
|
147
161
|
"tag": "InTransit",
|
148
|
-
"checkpoint_time": "2014-
|
162
|
+
"checkpoint_time": "2014-11-01T01:12:00",
|
149
163
|
"coordinates": [
|
150
164
|
|
151
165
|
],
|
@@ -154,108 +168,108 @@
|
|
154
168
|
},
|
155
169
|
{
|
156
170
|
"slug": "ups",
|
157
|
-
"city":
|
158
|
-
"created_at": "2014-
|
159
|
-
"country_name": "
|
160
|
-
"message": "
|
161
|
-
"country_iso3":
|
171
|
+
"city": null,
|
172
|
+
"created_at": "2014-11-03T15:36:42+00:00",
|
173
|
+
"country_name": "DE",
|
174
|
+
"message": "THE PACKAGE IS AWAITING CLEARING AGENCY REVIEW. / YOUR PACKAGE WAS RELEASED BY THE CLEARING AGENCY.",
|
175
|
+
"country_iso3": "DEU",
|
162
176
|
"tag": "InTransit",
|
163
|
-
"checkpoint_time": "2014-
|
177
|
+
"checkpoint_time": "2014-11-02T08:17:00",
|
164
178
|
"coordinates": [
|
165
179
|
|
166
180
|
],
|
167
|
-
"state":
|
181
|
+
"state": null,
|
168
182
|
"zip": null
|
169
183
|
},
|
170
184
|
{
|
171
185
|
"slug": "ups",
|
172
|
-
"city": "
|
173
|
-
"created_at": "2014-
|
186
|
+
"city": "LOUISVILLE",
|
187
|
+
"created_at": "2014-11-03T15:36:42+00:00",
|
174
188
|
"country_name": "US",
|
175
189
|
"message": "IMPORT SCAN",
|
176
190
|
"country_iso3": null,
|
177
191
|
"tag": "InTransit",
|
178
|
-
"checkpoint_time": "2014-
|
192
|
+
"checkpoint_time": "2014-11-02T11:44:00",
|
179
193
|
"coordinates": [
|
180
194
|
|
181
195
|
],
|
182
|
-
"state": "
|
196
|
+
"state": "KY",
|
183
197
|
"zip": null
|
184
198
|
},
|
185
199
|
{
|
186
200
|
"slug": "ups",
|
187
|
-
"city": "
|
188
|
-
"created_at": "2014-
|
201
|
+
"city": "LOUISVILLE",
|
202
|
+
"created_at": "2014-11-03T15:36:42+00:00",
|
189
203
|
"country_name": "US",
|
190
204
|
"message": "DEPARTURE SCAN",
|
191
205
|
"country_iso3": null,
|
192
206
|
"tag": "InTransit",
|
193
|
-
"checkpoint_time": "2014-
|
207
|
+
"checkpoint_time": "2014-11-02T15:45:00",
|
194
208
|
"coordinates": [
|
195
209
|
|
196
210
|
],
|
197
|
-
"state": "
|
211
|
+
"state": "KY",
|
198
212
|
"zip": null
|
199
213
|
},
|
200
214
|
{
|
201
215
|
"slug": "ups",
|
202
|
-
"city": "
|
203
|
-
"created_at": "2014-
|
216
|
+
"city": "OAKLAND",
|
217
|
+
"created_at": "2014-11-03T15:36:42+00:00",
|
204
218
|
"country_name": "US",
|
205
219
|
"message": "ARRIVAL SCAN",
|
206
220
|
"country_iso3": null,
|
207
221
|
"tag": "InTransit",
|
208
|
-
"checkpoint_time": "2014-
|
222
|
+
"checkpoint_time": "2014-11-02T17:20:00",
|
209
223
|
"coordinates": [
|
210
224
|
|
211
225
|
],
|
212
|
-
"state": "
|
226
|
+
"state": "CA",
|
213
227
|
"zip": null
|
214
228
|
},
|
215
229
|
{
|
216
230
|
"slug": "ups",
|
217
|
-
"city": "
|
218
|
-
"created_at": "2014-
|
231
|
+
"city": "OAKLAND",
|
232
|
+
"created_at": "2014-11-03T15:36:42+00:00",
|
219
233
|
"country_name": "US",
|
220
|
-
"message": "
|
234
|
+
"message": "DEPARTURE SCAN",
|
221
235
|
"country_iso3": null,
|
222
|
-
"tag": "
|
223
|
-
"checkpoint_time": "2014-
|
236
|
+
"tag": "InTransit",
|
237
|
+
"checkpoint_time": "2014-11-03T03:22:00",
|
224
238
|
"coordinates": [
|
225
239
|
|
226
240
|
],
|
227
|
-
"state": "
|
241
|
+
"state": "CA",
|
228
242
|
"zip": null
|
229
243
|
},
|
230
244
|
{
|
231
245
|
"slug": "ups",
|
232
|
-
"city": "
|
233
|
-
"created_at": "2014-
|
246
|
+
"city": "SAN FRANCISCO",
|
247
|
+
"created_at": "2014-11-03T15:36:42+00:00",
|
234
248
|
"country_name": "US",
|
235
|
-
"message": "
|
249
|
+
"message": "OUT FOR DELIVERY",
|
236
250
|
"country_iso3": null,
|
237
|
-
"tag": "
|
238
|
-
"checkpoint_time": "2014-
|
251
|
+
"tag": "OutForDelivery",
|
252
|
+
"checkpoint_time": "2014-11-03T06:20:00",
|
239
253
|
"coordinates": [
|
240
254
|
|
241
255
|
],
|
242
|
-
"state": "
|
256
|
+
"state": "CA",
|
243
257
|
"zip": null
|
244
258
|
},
|
245
259
|
{
|
246
260
|
"slug": "ups",
|
247
|
-
"city": "
|
248
|
-
"created_at": "2014-
|
261
|
+
"city": "SAN FRANCISCO",
|
262
|
+
"created_at": "2014-11-03T19:55:45+00:00",
|
249
263
|
"country_name": "US",
|
250
264
|
"message": "DELIVERED",
|
251
265
|
"country_iso3": null,
|
252
266
|
"tag": "Delivered",
|
253
|
-
"checkpoint_time": "2014-
|
267
|
+
"checkpoint_time": "2014-11-03T09:56:00",
|
254
268
|
"coordinates": [
|
255
269
|
|
256
270
|
],
|
257
|
-
"state": "
|
258
|
-
"zip": "
|
271
|
+
"state": "CA",
|
272
|
+
"zip": "94110"
|
259
273
|
}
|
260
274
|
]
|
261
275
|
}
|