postmaster 1.0.1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|