postmaster 1.0.1 → 1.1.0
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/lib/example.rb +50 -10
- data/lib/postmaster.rb +10 -1
- data/lib/postmaster/address.rb +1 -0
- data/lib/postmaster/postmaster_object.rb +9 -4
- data/lib/postmaster/rates.rb +11 -0
- data/lib/postmaster/shipment.rb +7 -1
- data/lib/postmaster/tracking.rb +5 -0
- data/lib/postmaster/transit_times.rb +17 -0
- data/lib/postmaster/util.rb +10 -0
- data/lib/postmaster/version.rb +1 -1
- data/test/test_address.rb +29 -11
- data/test/test_rates.rb +34 -0
- data/test/test_shipment.rb +17 -21
- data/test/test_tracking.rb +27 -0
- data/test/test_transit_times.rb +39 -0
- metadata +12 -4
data/lib/example.rb
CHANGED
@@ -1,29 +1,59 @@
|
|
1
1
|
require "postmaster"
|
2
2
|
|
3
|
+
# at startup set API key
|
3
4
|
Postmaster.api_key = "example-api-key"
|
4
5
|
|
6
|
+
# at first validate recipient address
|
5
7
|
result = Postmaster::AddressValidation.validate(
|
6
|
-
:company => "
|
8
|
+
:company => "Postmaster Inc.",
|
7
9
|
:contact => "Joe Smith",
|
8
|
-
:line1 => "
|
10
|
+
:line1 => "701 Brazos St. Suite 1616",
|
9
11
|
:city => "Austin",
|
10
12
|
:state => "TX",
|
11
|
-
:zip => "
|
13
|
+
:zip => "78701",
|
12
14
|
:country => "US"
|
13
15
|
)
|
16
|
+
#puts result.inspect
|
14
17
|
|
18
|
+
# if address is ok you can ask for time and rates for it
|
19
|
+
result = Postmaster::TransitTimes.get(
|
20
|
+
:from_zip => "78701",
|
21
|
+
:to_zip => "78704",
|
22
|
+
:weight => 1.5,
|
23
|
+
:carrier => "fedex"
|
24
|
+
)
|
25
|
+
#puts result.inspect
|
26
|
+
|
27
|
+
result = Postmaster::Rates.get(
|
28
|
+
:from_zip => "78701",
|
29
|
+
:to_zip => "78704",
|
30
|
+
:weight => 1.5,
|
31
|
+
:carrier => "fedex"
|
32
|
+
)
|
33
|
+
#puts result.inspect
|
34
|
+
|
35
|
+
# when user will choose delivery type you create shipment
|
15
36
|
result = Postmaster::Shipment.create(
|
37
|
+
:from => {
|
38
|
+
:company => "Postmaster Inc.",
|
39
|
+
:contact => "Joe Smith",
|
40
|
+
:line1 => "701 Brazos St. Suite 1616",
|
41
|
+
:city => "Austin",
|
42
|
+
:state => "TX",
|
43
|
+
:zip_code => "78701",
|
44
|
+
:phone_no => "512-693-4040",
|
45
|
+
:country => "US"
|
46
|
+
},
|
16
47
|
:to => {
|
17
|
-
:company => "ASLS",
|
18
48
|
:contact => "Joe Smith",
|
19
|
-
:line1 => "
|
49
|
+
:line1 => "701 Brazos St. Suite 1616",
|
20
50
|
:city => "Austin",
|
21
51
|
:state => "TX",
|
22
|
-
:zip_code => "
|
23
|
-
:phone_no => "
|
52
|
+
:zip_code => "78701",
|
53
|
+
:phone_no => "512-693-4040",
|
24
54
|
:country => "US"
|
25
55
|
},
|
26
|
-
:carrier => "
|
56
|
+
:carrier => "fedex",
|
27
57
|
:service => "2DAY",
|
28
58
|
:package => {
|
29
59
|
:value => 55,
|
@@ -34,9 +64,19 @@ result = Postmaster::Shipment.create(
|
|
34
64
|
},
|
35
65
|
:reference => "Order # 54321"
|
36
66
|
)
|
67
|
+
#puts result.inspect
|
68
|
+
|
69
|
+
# store in your DB shipment ID for later use
|
70
|
+
shipment_id = result.id
|
71
|
+
|
72
|
+
# anytime you can extract shipment data
|
73
|
+
shipment = Postmaster::Shipment.retrieve(shipment_id)
|
74
|
+
#puts shipment.inspect
|
37
75
|
|
38
|
-
|
76
|
+
# or check delivery status
|
39
77
|
result = shipment.track()
|
78
|
+
#puts result.inspect
|
40
79
|
|
41
|
-
shipment
|
80
|
+
# you can cancel shipment, but only before being picked up by the carrier
|
42
81
|
result = shipment.void()
|
82
|
+
#puts result.inspect
|
data/lib/postmaster.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
require 'pp'
|
3
3
|
require 'cgi'
|
4
4
|
require 'set'
|
5
|
+
require 'date'
|
5
6
|
require 'rubygems'
|
6
7
|
require 'openssl'
|
7
8
|
|
@@ -26,6 +27,8 @@ require 'postmaster/address'
|
|
26
27
|
require 'postmaster/shipment'
|
27
28
|
require 'postmaster/package'
|
28
29
|
require 'postmaster/tracking'
|
30
|
+
require 'postmaster/transit_times'
|
31
|
+
require 'postmaster/rates'
|
29
32
|
|
30
33
|
# Errors
|
31
34
|
require 'postmaster/errors/postmaster_error'
|
@@ -159,7 +162,13 @@ module Postmaster
|
|
159
162
|
begin
|
160
163
|
error_obj = Postmaster::JSON.load(rbody)
|
161
164
|
error_obj = Util.symbolize_names(error_obj)
|
162
|
-
|
165
|
+
if error_obj.has_key?(:message)
|
166
|
+
error = error_obj
|
167
|
+
elsif error_obj.has_key?(:error)
|
168
|
+
error = error_obj[:error]
|
169
|
+
else
|
170
|
+
raise PostmasterError.new # escape from parsing
|
171
|
+
end
|
163
172
|
rescue MultiJson::DecodeError, PostmasterError
|
164
173
|
raise APIError.new("Invalid response object from API: #{rbody.inspect} (HTTP response code was #{rcode})", rcode, rbody)
|
165
174
|
end
|
data/lib/postmaster/address.rb
CHANGED
@@ -35,11 +35,12 @@ module Postmaster
|
|
35
35
|
# which keys should be converted to Postmaster_Objects
|
36
36
|
obj_keys = {
|
37
37
|
'Postmaster::Shipment.to' => Postmaster::Address,
|
38
|
-
'Postmaster::Shipment.
|
38
|
+
'Postmaster::Shipment.from' => Postmaster::Address,
|
39
39
|
'Postmaster::Shipment.package' => Postmaster::Package,
|
40
40
|
'Postmaster::AddressProposal.address' => Postmaster::Address,
|
41
|
-
|
42
|
-
|
41
|
+
'Postmaster::Tracking.last_update' => 'DateTime',
|
42
|
+
'Postmaster::TrackingHistory.timestamp' => 'DateTime',
|
43
|
+
'Postmaster::TransitTime.delivery_timestamp' => 'DateTime'
|
43
44
|
}
|
44
45
|
|
45
46
|
# which keys should be converted to list of Postmaster_Objects
|
@@ -66,7 +67,11 @@ module Postmaster
|
|
66
67
|
full_key = self.class.name + "." + k.to_s
|
67
68
|
if obj_keys.has_key?(full_key)
|
68
69
|
klass = obj_keys[full_key]
|
69
|
-
|
70
|
+
if klass == 'DateTime'
|
71
|
+
@values[k] = DateTime.strptime(v.to_s, '%s')
|
72
|
+
else
|
73
|
+
@values[k] = klass.construct_from(v)
|
74
|
+
end
|
70
75
|
elsif obj_list_keys.has_key?(full_key)
|
71
76
|
klass = obj_list_keys[full_key]
|
72
77
|
@values[k] = []
|
data/lib/postmaster/shipment.rb
CHANGED
@@ -1,9 +1,15 @@
|
|
1
1
|
module Postmaster
|
2
2
|
|
3
3
|
class Shipment < APIResource
|
4
|
-
include Postmaster::APIOperations::Create
|
5
4
|
include Postmaster::APIOperations::List
|
6
5
|
|
6
|
+
def self.create(params={})
|
7
|
+
Util.normalize_address(params[:to])
|
8
|
+
Util.normalize_address(params[:from])
|
9
|
+
response = Postmaster.request(:post, self.url, params)
|
10
|
+
self.construct_from(response)
|
11
|
+
end
|
12
|
+
|
7
13
|
def track
|
8
14
|
response = Postmaster.request(:get, url('track'))
|
9
15
|
if response[:results].nil?
|
data/lib/postmaster/tracking.rb
CHANGED
@@ -0,0 +1,17 @@
|
|
1
|
+
module Postmaster
|
2
|
+
|
3
|
+
class TransitTimes < APIResource
|
4
|
+
|
5
|
+
def self.get(params={})
|
6
|
+
response = Postmaster.request(:post, '/v1/times', params)
|
7
|
+
if response[:services].nil?
|
8
|
+
return nil
|
9
|
+
end
|
10
|
+
response[:services].map { |i| Postmaster::TransitTime.construct_from(i) }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class TransitTime < APIResource
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
data/lib/postmaster/util.rb
CHANGED
@@ -64,5 +64,15 @@ module Postmaster
|
|
64
64
|
end
|
65
65
|
result
|
66
66
|
end
|
67
|
+
|
68
|
+
def self.normalize_address(params)
|
69
|
+
if params != nil && params.has_key?(:address)
|
70
|
+
line1, line2, line3 = params.delete(:address)
|
71
|
+
params[:line1] = line1 if line1
|
72
|
+
params[:line2] = line2 if line2
|
73
|
+
params[:line3] = line3 if line3
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
67
77
|
end
|
68
78
|
end
|
data/lib/postmaster/version.rb
CHANGED
data/test/test_address.rb
CHANGED
@@ -10,19 +10,17 @@ require 'uri'
|
|
10
10
|
|
11
11
|
class TestAddressRuby < Test::Unit::TestCase
|
12
12
|
include Mocha
|
13
|
-
|
14
|
-
sample_address =
|
15
|
-
|
13
|
+
|
16
14
|
context "Address" do
|
17
15
|
|
18
16
|
should "be valid" do
|
19
17
|
result = Postmaster::AddressValidation.validate({
|
20
|
-
:company => "
|
18
|
+
:company => "Postmaster Inc.",
|
21
19
|
:contact => "Joe Smith",
|
22
|
-
:line1 => "
|
20
|
+
:line1 => "701 Brazos St. Suite 1616",
|
23
21
|
:city => "Austin",
|
24
22
|
:state => "TX",
|
25
|
-
:zip_code => "
|
23
|
+
:zip_code => "78701",
|
26
24
|
:country => "US",
|
27
25
|
})
|
28
26
|
|
@@ -34,23 +32,43 @@ class TestAddressRuby < Test::Unit::TestCase
|
|
34
32
|
address = result[:addresses][0]
|
35
33
|
assert_instance_of(Postmaster::Address, address);
|
36
34
|
assert(address.keys.include?(:zip_code))
|
37
|
-
assert_equal("
|
35
|
+
assert_equal("78701", address[:zip_code])
|
38
36
|
end
|
39
37
|
|
40
38
|
should "be invalid" do
|
39
|
+
assert_raises Postmaster::InvalidRequestError do
|
40
|
+
result = Postmaster::AddressValidation.validate({
|
41
|
+
:company => "Postmaster Inc.",
|
42
|
+
:contact => "Joe Smith",
|
43
|
+
:line1 => "007 Nowhere Ave",
|
44
|
+
:city => "Austin",
|
45
|
+
:state => "TX",
|
46
|
+
:zip_code => "00001",
|
47
|
+
:country => "US",
|
48
|
+
})
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
should "be valid with address instead of line1" do
|
41
53
|
result = Postmaster::AddressValidation.validate({
|
42
|
-
:company => "
|
54
|
+
:company => "Postmaster Inc.",
|
43
55
|
:contact => "Joe Smith",
|
44
|
-
:
|
56
|
+
:address => ["701 Brazos St. Suite 1616"],
|
45
57
|
:city => "Austin",
|
46
58
|
:state => "TX",
|
47
|
-
:zip_code => "
|
59
|
+
:zip_code => "78701",
|
48
60
|
:country => "US",
|
49
61
|
})
|
50
62
|
|
51
63
|
assert_instance_of(Postmaster::AddressValidation, result);
|
52
64
|
assert(result.keys.include?(:status))
|
53
|
-
|
65
|
+
assert_kind_of(Array, result[:addresses])
|
66
|
+
assert(!result[:addresses].empty?)
|
67
|
+
|
68
|
+
address = result[:addresses][0]
|
69
|
+
assert_instance_of(Postmaster::Address, address);
|
70
|
+
assert(address.keys.include?(:zip_code))
|
71
|
+
assert_equal("78701", address[:zip_code])
|
54
72
|
end
|
55
73
|
|
56
74
|
end
|
data/test/test_rates.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'test/unit'
|
3
|
+
require 'postmaster'
|
4
|
+
require 'rubygems'
|
5
|
+
require 'shoulda'
|
6
|
+
require 'mocha'
|
7
|
+
require 'rest-client'
|
8
|
+
require 'cgi'
|
9
|
+
require 'uri'
|
10
|
+
|
11
|
+
class TestRatesRuby < Test::Unit::TestCase
|
12
|
+
include Mocha
|
13
|
+
|
14
|
+
context "Rates" do
|
15
|
+
|
16
|
+
should "return data" do
|
17
|
+
result = Postmaster::Rates.get(
|
18
|
+
:from_zip => "78701",
|
19
|
+
:to_zip => "78704",
|
20
|
+
:weight => 1.5,
|
21
|
+
:carrier => "fedex"
|
22
|
+
)
|
23
|
+
|
24
|
+
assert_instance_of(Postmaster::Rates, result);
|
25
|
+
assert(result.keys.include?(:currency))
|
26
|
+
assert(result.keys.include?(:charge))
|
27
|
+
assert(result.keys.include?(:service))
|
28
|
+
|
29
|
+
possible_values = ['GROUND', '3DAY', '2DAY', '2DAY_EARLY', '1DAY', '1DAY_EARLY', '1DAY_MORNING']
|
30
|
+
assert(possible_values.include?(result[:service]))
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
data/test/test_shipment.rb
CHANGED
@@ -13,35 +13,31 @@ class TestShipmentRuby < Test::Unit::TestCase
|
|
13
13
|
|
14
14
|
sample_shipment = {
|
15
15
|
:to => {
|
16
|
-
:company => "
|
16
|
+
:company => "Postmaster Inc.",
|
17
17
|
:contact => "Joe Smith",
|
18
|
-
:line1 => "
|
18
|
+
:line1 => "701 Brazos St. Suite 1616",
|
19
19
|
:city => "Austin",
|
20
20
|
:state => "TX",
|
21
|
-
:zip_code => "
|
22
|
-
:phone_no => "
|
23
|
-
:country => "US"
|
21
|
+
:zip_code => "78701",
|
22
|
+
:phone_no => "512-693-4040",
|
24
23
|
},
|
25
|
-
:
|
26
|
-
:company => "
|
24
|
+
:from => {
|
25
|
+
:company => "Postmaster Inc.",
|
27
26
|
:contact => "Joe Smith",
|
28
|
-
:
|
27
|
+
:address => ["701 Brazos St. Suite 1616"],
|
29
28
|
:city => "Austin",
|
30
29
|
:state => "TX",
|
31
|
-
:zip_code => "
|
32
|
-
:phone_no => "
|
33
|
-
:country => "US"
|
30
|
+
:zip_code => "78701",
|
31
|
+
:phone_no => "512-693-4040",
|
34
32
|
},
|
35
|
-
:carrier => "
|
33
|
+
:carrier => "fedex",
|
36
34
|
:service => "2DAY",
|
37
35
|
:package => {
|
38
|
-
:value => 55,
|
39
36
|
:weight => 1.5,
|
40
37
|
:length => 10,
|
41
38
|
:width => 6,
|
42
39
|
:height => 8,
|
43
40
|
},
|
44
|
-
:reference => "Order # 54321"
|
45
41
|
}
|
46
42
|
|
47
43
|
context "Shipment" do
|
@@ -51,12 +47,14 @@ class TestShipmentRuby < Test::Unit::TestCase
|
|
51
47
|
assert_instance_of(Postmaster::Shipment, result)
|
52
48
|
assert(result.keys.include?(:status))
|
53
49
|
assert_equal("Processing", result[:status])
|
54
|
-
assert(result.keys.include?(:
|
55
|
-
|
56
|
-
assert(result[:
|
57
|
-
|
50
|
+
assert(result.keys.include?(:packages))
|
51
|
+
assert_kind_of(Array, result[:packages])
|
52
|
+
assert(!result[:packages].empty?)
|
53
|
+
assert_instance_of(Postmaster::Package, result[:packages][0])
|
54
|
+
assert(result[:packages][0].keys.include?(:type))
|
55
|
+
assert_equal("CUSTOM", result[:packages][0][:type])
|
58
56
|
assert_instance_of(Postmaster::Address, result[:to])
|
59
|
-
assert_instance_of(Postmaster::Address, result[:
|
57
|
+
assert_instance_of(Postmaster::Address, result[:from])
|
60
58
|
end
|
61
59
|
|
62
60
|
should "be the same after retreave" do
|
@@ -66,8 +64,6 @@ class TestShipmentRuby < Test::Unit::TestCase
|
|
66
64
|
shipment1hash = shipment1.to_hash
|
67
65
|
shipment2hash = shipment2.to_hash
|
68
66
|
# label_urls can be different, so ignore it during check
|
69
|
-
shipment1hash[:package].delete(:label_url)
|
70
|
-
shipment2hash[:package].delete(:label_url)
|
71
67
|
shipment1hash[:packages][0].delete(:label_url)
|
72
68
|
shipment2hash[:packages][0].delete(:label_url)
|
73
69
|
assert_equal(shipment1hash, shipment2hash)
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'test/unit'
|
3
|
+
require 'postmaster'
|
4
|
+
require 'rubygems'
|
5
|
+
require 'shoulda'
|
6
|
+
require 'mocha'
|
7
|
+
require 'rest-client'
|
8
|
+
require 'cgi'
|
9
|
+
require 'uri'
|
10
|
+
|
11
|
+
class TestTrackingRuby < Test::Unit::TestCase
|
12
|
+
include Mocha
|
13
|
+
|
14
|
+
context "Tracking" do
|
15
|
+
|
16
|
+
should "return data" do
|
17
|
+
result = Postmaster::Tracking.track('1ZW470V80310800043')
|
18
|
+
|
19
|
+
assert_instance_of(Postmaster::Tracking, result);
|
20
|
+
assert(result.keys.include?(:status))
|
21
|
+
assert(result.keys.include?(:history))
|
22
|
+
assert(!result.history.empty?)
|
23
|
+
assert_instance_of(Postmaster::TrackingHistory, result.history[0])
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'test/unit'
|
3
|
+
require 'postmaster'
|
4
|
+
require 'rubygems'
|
5
|
+
require 'shoulda'
|
6
|
+
require 'mocha'
|
7
|
+
require 'rest-client'
|
8
|
+
require 'date'
|
9
|
+
require 'cgi'
|
10
|
+
require 'uri'
|
11
|
+
|
12
|
+
class TestTransitTimesRuby < Test::Unit::TestCase
|
13
|
+
include Mocha
|
14
|
+
|
15
|
+
context "Transit times" do
|
16
|
+
|
17
|
+
should "be able to get" do
|
18
|
+
result = Postmaster::TransitTimes.get(
|
19
|
+
:from_zip => "78701",
|
20
|
+
:to_zip => "78704",
|
21
|
+
:weight => 1.5,
|
22
|
+
:carrier => "fedex"
|
23
|
+
)
|
24
|
+
|
25
|
+
assert_kind_of(Array, result)
|
26
|
+
assert(!result.empty?)
|
27
|
+
assert_instance_of(Postmaster::TransitTime, result[0])
|
28
|
+
assert(result[0].keys.include?(:delivery_timestamp))
|
29
|
+
assert(result[0].keys.include?(:service))
|
30
|
+
assert_instance_of(DateTime, result[0][:delivery_timestamp])
|
31
|
+
|
32
|
+
possible_values = ['GROUND', '3DAY', '2DAY', '2DAY_EARLY', '1DAY', '1DAY_EARLY', '1DAY_MORNING']
|
33
|
+
assert(possible_values.include?(result[0][:service]))
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: postmaster
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
-
- 0
|
9
8
|
- 1
|
10
|
-
|
9
|
+
- 0
|
10
|
+
version: 1.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Postmaster
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2013-
|
18
|
+
date: 2013-05-14 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: rest-client
|
@@ -136,15 +136,20 @@ files:
|
|
136
136
|
- lib/postmaster/json.rb
|
137
137
|
- lib/postmaster/package.rb
|
138
138
|
- lib/postmaster/postmaster_object.rb
|
139
|
+
- lib/postmaster/rates.rb
|
139
140
|
- lib/postmaster/shipment.rb
|
140
141
|
- lib/postmaster/tracking.rb
|
142
|
+
- lib/postmaster/transit_times.rb
|
141
143
|
- lib/postmaster/util.rb
|
142
144
|
- lib/postmaster/version.rb
|
143
145
|
- postmaster.gemspec
|
144
146
|
- test/test_address.rb
|
145
147
|
- test/test_helper.rb
|
146
148
|
- test/test_postmaster.rb
|
149
|
+
- test/test_rates.rb
|
147
150
|
- test/test_shipment.rb
|
151
|
+
- test/test_tracking.rb
|
152
|
+
- test/test_transit_times.rb
|
148
153
|
homepage: https://www.postmaster.io
|
149
154
|
licenses: []
|
150
155
|
|
@@ -182,4 +187,7 @@ test_files:
|
|
182
187
|
- test/test_address.rb
|
183
188
|
- test/test_helper.rb
|
184
189
|
- test/test_postmaster.rb
|
190
|
+
- test/test_rates.rb
|
185
191
|
- test/test_shipment.rb
|
192
|
+
- test/test_tracking.rb
|
193
|
+
- test/test_transit_times.rb
|