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 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