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 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 => "ASLS",
8
+ :company => "Postmaster Inc.",
7
9
  :contact => "Joe Smith",
8
- :line1 => "1110 Someplace Ave.",
10
+ :line1 => "701 Brazos St. Suite 1616",
9
11
  :city => "Austin",
10
12
  :state => "TX",
11
- :zip => "78704",
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 => "1110 Someplace Ave.",
49
+ :line1 => "701 Brazos St. Suite 1616",
20
50
  :city => "Austin",
21
51
  :state => "TX",
22
- :zip_code => "78704",
23
- :phone_no => "919-720-7941",
52
+ :zip_code => "78701",
53
+ :phone_no => "512-693-4040",
24
54
  :country => "US"
25
55
  },
26
- :carrier => "ups",
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
- shipment = Postmaster::Shipment.retrieve(1)
76
+ # or check delivery status
39
77
  result = shipment.track()
78
+ #puts result.inspect
40
79
 
41
- shipment = Postmaster::Shipment.retrieve(1)
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
- error = error_obj[:error] or raise PostmasterError.new # escape from parsing
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
@@ -9,6 +9,7 @@ module Postmaster
9
9
  class AddressValidation < APIResource
10
10
 
11
11
  def self.validate(params={})
12
+ Util.normalize_address(params)
12
13
  response = Postmaster.request(:post, '/v1/validate', params)
13
14
  self.construct_from(response)
14
15
  end
@@ -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.from_' => Postmaster::Address,
38
+ 'Postmaster::Shipment.from' => Postmaster::Address,
39
39
  'Postmaster::Shipment.package' => Postmaster::Package,
40
40
  'Postmaster::AddressProposal.address' => Postmaster::Address,
41
- #'Postmaster::Tracking.last_update' => 'DateTime',
42
- #'Postmaster::TrackingHistory.timestamp' => 'DateTime'
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
- @values[k] = klass.construct_from(v)
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] = []
@@ -0,0 +1,11 @@
1
+ module Postmaster
2
+
3
+ class Rates < APIResource
4
+
5
+ def self.get(params={})
6
+ response = Postmaster.request(:post, '/v1/rates', params)
7
+ self.construct_from(response)
8
+ end
9
+ end
10
+
11
+ end
@@ -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?
@@ -1,6 +1,11 @@
1
1
  module Postmaster
2
2
 
3
3
  class Tracking < APIResource
4
+
5
+ def self.track(tracking_id)
6
+ response = Postmaster.request(:get, '/v1/track', {:tracking => tracking_id})
7
+ self.construct_from(response)
8
+ end
4
9
  end
5
10
 
6
11
  class TrackingHistory < APIResource
@@ -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
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Postmaster
2
- VERSION = '1.0.1'
2
+ VERSION = '1.1.0'
3
3
  end
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 => "Asls",
18
+ :company => "Postmaster Inc.",
21
19
  :contact => "Joe Smith",
22
- :line1 => "1110 Algarita Ave",
20
+ :line1 => "701 Brazos St. Suite 1616",
23
21
  :city => "Austin",
24
22
  :state => "TX",
25
- :zip_code => "78704",
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("78704", address[:zip_code])
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 => "Asls",
54
+ :company => "Postmaster Inc.",
43
55
  :contact => "Joe Smith",
44
- :line1 => "007 Nowhere Ave",
56
+ :address => ["701 Brazos St. Suite 1616"],
45
57
  :city => "Austin",
46
58
  :state => "TX",
47
- :zip_code => "00001",
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
- assert_equal("WRONG_ADDRESS", result[:status])
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
@@ -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
@@ -13,35 +13,31 @@ class TestShipmentRuby < Test::Unit::TestCase
13
13
 
14
14
  sample_shipment = {
15
15
  :to => {
16
- :company => "ASLS",
16
+ :company => "Postmaster Inc.",
17
17
  :contact => "Joe Smith",
18
- :line1 => "1110 Algarita Ave",
18
+ :line1 => "701 Brazos St. Suite 1616",
19
19
  :city => "Austin",
20
20
  :state => "TX",
21
- :zip_code => "78704-4429",
22
- :phone_no => "919-720-7941",
23
- :country => "US"
21
+ :zip_code => "78701",
22
+ :phone_no => "512-693-4040",
24
23
  },
25
- :from_ => {
26
- :company => "ASLS",
24
+ :from => {
25
+ :company => "Postmaster Inc.",
27
26
  :contact => "Joe Smith",
28
- :line1 => "1110 Algarita Ave",
27
+ :address => ["701 Brazos St. Suite 1616"],
29
28
  :city => "Austin",
30
29
  :state => "TX",
31
- :zip_code => "78704-4429",
32
- :phone_no => "919-720-7941",
33
- :country => "US"
30
+ :zip_code => "78701",
31
+ :phone_no => "512-693-4040",
34
32
  },
35
- :carrier => "ups",
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?(:package))
55
- assert_instance_of(Postmaster::Package, result[:package])
56
- assert(result[:package].keys.include?(:type_))
57
- assert_equal("CUSTOM", result[:package][:type_])
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[:from_])
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: 21
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
- - 0
9
8
  - 1
10
- version: 1.0.1
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-02-27 00:00:00 Z
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