easypost 2.0.11 → 2.0.12

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/CHANGELOG CHANGED
@@ -1,3 +1,9 @@
1
+ === 2.0.12 2014-07-07
2
+
3
+ * Added Item, Container, and Order resources.
4
+ * Fixed and added a lot of tests.
5
+
6
+
1
7
  === 2.0.11 2013-12-16
2
8
 
3
9
  * Added Event.receive method for parsing events sent by webhook.
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- easypost (2.0.10)
4
+ easypost (2.0.11)
5
5
  multi_json (>= 1.0.4, < 2)
6
6
  rest-client (~> 1.4)
7
7
 
@@ -9,8 +9,8 @@ GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
11
  diff-lcs (1.2.4)
12
- mime-types (1.23)
13
- multi_json (1.7.7)
12
+ mime-types (1.25.1)
13
+ multi_json (1.8.4)
14
14
  rest-client (1.6.7)
15
15
  mime-types (>= 1.16)
16
16
  rspec (2.13.0)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.0.11
1
+ 2.0.12
@@ -21,6 +21,9 @@ require 'easypost/refund'
21
21
  require 'easypost/event'
22
22
  require 'easypost/batch'
23
23
  require 'easypost/tracker'
24
+ require 'easypost/item'
25
+ require 'easypost/container'
26
+ require 'easypost/order'
24
27
 
25
28
  require 'easypost/error'
26
29
 
@@ -0,0 +1,4 @@
1
+ module EasyPost
2
+ class Container < Resource
3
+ end
4
+ end
@@ -0,0 +1,10 @@
1
+ module EasyPost
2
+ class Item < Resource
3
+
4
+ def self.retrieve_reference(params={})
5
+ response, api_key = EasyPost.request(:get, url + '/retrieve_reference', @api_key, params)
6
+ return EasyPost::Util::convert_to_easypost_object(response, api_key) if response
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1,19 @@
1
+ module EasyPost
2
+ class Order < Resource
3
+
4
+ def buy(params={})
5
+ if params.instance_of?(EasyPost::Rate)
6
+ temp = params.clone
7
+ params = {}
8
+ params[:carrier] = temp.carrier
9
+ params[:service] = temp.service
10
+ end
11
+
12
+ response, api_key = EasyPost.request(:post, url + '/buy', @api_key, params)
13
+ self.refresh_from(response, @api_key, true)
14
+
15
+ return self
16
+ end
17
+
18
+ end
19
+ end
@@ -1,12 +1,6 @@
1
1
  module EasyPost
2
2
  class Shipment < Resource
3
3
 
4
- def self.track_with_code(params={})
5
- response, api_key = EasyPost.request(:get, url + '/track', @api_key, params)
6
-
7
- return response
8
- end
9
-
10
4
  def get_rates(params={})
11
5
  response, api_key = EasyPost.request(:get, url + '/rates', @api_key, params)
12
6
  self.refresh_from(response, @api_key, true)
@@ -76,7 +70,7 @@ module EasyPost
76
70
  lowest = nil
77
71
 
78
72
  self.get_rates unless self.rates
79
-
73
+
80
74
  if !carriers.is_a?(Array)
81
75
  carriers = carriers.split(',')
82
76
  end
@@ -125,13 +119,13 @@ module EasyPost
125
119
  next
126
120
  end
127
121
 
128
- if lowest == nil || k.rate.to_f < lowest.rate.to_f
122
+ if lowest == nil || k.rate.to_f < lowest.rate.to_f
129
123
  lowest = k
130
124
  end
131
125
  end
132
126
 
133
127
  raise Error.new('No rates found.') if lowest == nil
134
-
128
+
135
129
  return lowest
136
130
  end
137
131
 
@@ -27,6 +27,9 @@ module EasyPost
27
27
  'Event' => Event,
28
28
  'Batch' => Batch,
29
29
  'Tracker' => Tracker,
30
+ 'Item' => Item,
31
+ 'Container' => Container,
32
+ 'Order' => Order,
30
33
  'PostageLabel' => PostageLabel }
31
34
 
32
35
  prefixes = { 'adr' => Address,
@@ -40,6 +43,9 @@ module EasyPost
40
43
  'evt' => Event,
41
44
  'batch' => Batch,
42
45
  'trk' => Tracker,
46
+ 'item' => Item,
47
+ 'container' => Container,
48
+ 'order' => Order,
43
49
  'pl' => PostageLabel }
44
50
 
45
51
  case response
@@ -1,36 +1,26 @@
1
- require 'easypost'
2
- EasyPost.api_key = 'cueqNZUb3ldeWTNX7MU3Mel8UXtaAMUi'
1
+ require 'spec_helper'
3
2
 
4
3
  describe EasyPost::Address do
5
4
  describe '#create' do
6
5
  it 'creates an address object' do
7
- address = EasyPost::Address.create(
8
- :name => 'Sawyer Bateman',
9
- :street1 => '1A Larkspur Cres.',
10
- :city => 'St. Albert',
11
- :state => 'AB',
12
- :zip => 't8n2m4',
13
- :country => 'CA'
14
- )
6
+ address = EasyPost::Address.create(ADDRESS[:california])
7
+
15
8
  expect(address).to be_an_instance_of(EasyPost::Address)
16
- expect(address.name).to eq('Sawyer Bateman')
9
+ expect(address.company).to eq('EasyPost')
17
10
  end
18
11
  end
12
+
19
13
  describe '#verify' do
20
14
  it 'verifies an address with message' do
21
- address = EasyPost::Address.create(
22
- :company => 'Simpler Postage Inc',
23
- :street1 => '388 Townsend Street',
24
- :city => 'San Francisco',
25
- :state => 'CA',
26
- :zip => '94107'
27
- )
28
- expect(address.company).to eq('Simpler Postage Inc')
29
- expect(address.street1).to eq('388 Townsend Street')
15
+ address = EasyPost::Address.create(ADDRESS[:california].reject {|k,v| k == :street2})
16
+
17
+ expect(address.company).to eq('EasyPost')
18
+ expect(address.street1).to eq('164 Townsend Street')
30
19
  expect(address.city).to eq('San Francisco')
31
20
  expect(address.state).to eq('CA')
32
21
  expect(address.zip).to eq('94107')
33
22
  expect(address.country).to eq('US')
23
+ expect(address.street2).to be_nil
34
24
 
35
25
  verified_address = address.verify()
36
26
  expect(verified_address).to be_an_instance_of(EasyPost::Address)
@@ -38,21 +28,9 @@ describe EasyPost::Address do
38
28
  end
39
29
 
40
30
  it 'verifies an address without message' do
41
- address = EasyPost::Address.create(
42
- :company => 'Simpler Postage Inc',
43
- :street1 => '388 Townsend Street',
44
- :street2 => 'Apt 20',
45
- :city => 'San Francisco',
46
- :state => 'CA',
47
- :zip => '94107'
48
- )
49
- expect(address.company).to eq('Simpler Postage Inc')
50
- expect(address.street1).to eq('388 Townsend Street')
51
- expect(address.street2).to eq('Apt 20')
52
- expect(address.city).to eq('San Francisco')
53
- expect(address.state).to eq('CA')
54
- expect(address.zip).to eq('94107')
55
- expect(address.country).to eq('US')
31
+ address = EasyPost::Address.create(ADDRESS[:california])
32
+
33
+ expect(address.street2).to be
56
34
 
57
35
  verified_address = address.verify()
58
36
  expect(verified_address).to be_an_instance_of(EasyPost::Address)
@@ -64,9 +42,9 @@ describe EasyPost::Address do
64
42
  :company => 'Simpler Postage Inc',
65
43
  :street1 => '388 Junk Teerts',
66
44
  :street2 => 'Apt 20',
67
- :city => 'San Francisco',
68
- :state => 'CA',
69
- :zip => '941abc07'
45
+ :city => 'San Francisco',
46
+ :state => 'CA',
47
+ :zip => '941abc07'
70
48
  )
71
49
 
72
50
  expect { verified_address = address.verify() }.to raise_error(EasyPost::Error, /Address Not Found./)
@@ -4,42 +4,21 @@ describe EasyPost::Batch do
4
4
 
5
5
  describe '#create' do
6
6
  it 'creates a batch object' do
7
- from_address = EasyPost::Address.create(
8
- :name => "Benchmark Merchandising",
9
- :street1 => "329 W 18th Street",
10
- :city => "Chicago",
11
- :state => "IL",
12
- :zip => "60616"
13
- )
14
- to_address = EasyPost::Address.create(
15
- :street1 => "902 Broadway 4th Floor",
16
- :city => "New York",
17
- :state => "NY",
18
- :zip => "10010"
19
- )
20
- parcel = EasyPost::Parcel.create(
21
- :weight => 7.2,
22
- :height => 2,
23
- :width => 7.5,
24
- :length => 10.5
25
- )
26
-
27
7
  batch = EasyPost::Batch.create({
28
8
  :shipment => [{
29
- :from_address => from_address,
30
- :to_address => to_address,
31
- :parcel => parcel
9
+ :from_address => ADDRESS[:california],
10
+ :to_address => ADDRESS[:missouri],
11
+ :parcel => PARCEL[:dimensions]
32
12
  }, {
33
- :from_address => from_address,
34
- :to_address => to_address,
35
- :parcel => parcel,
36
- :reference => 'refnum9173'
13
+ :from_address => ADDRESS[:california],
14
+ :to_address => ADDRESS[:canada],
15
+ :parcel => PARCEL[:dimensions],
37
16
  }],
38
- :reference => "abc-123"
39
- })
17
+ :reference => "batch123456789"
18
+ })
40
19
  expect(batch).to be_an_instance_of(EasyPost::Batch)
41
20
  expect(batch.num_shipments).to eq(2)
42
- expect(batch.reference).to eq("abc-123")
21
+ expect(batch.reference).to eq("batch123456789")
43
22
  expect(batch.state).to eq("creating")
44
23
 
45
24
  # sleeps_left = 10
@@ -57,46 +36,21 @@ describe EasyPost::Batch do
57
36
 
58
37
  describe '#create_and_buy' do
59
38
  it 'creates a batch object and delayed jobs for purchasing the postage_labels' do
60
- from_address = EasyPost::Address.create(
61
- :name => "Benchmark Merchandising",
62
- :street1 => "329 W 18th Street",
63
- :city => "Chicago",
64
- :state => "IL",
65
- :zip => "60616"
66
- )
67
- to_address = EasyPost::Address.create(
68
- :name => "Don Juan",
69
- :street1 => "902 Broadway 4th Floor",
70
- :city => "New York",
71
- :state => "NY",
72
- :zip => "10010"
73
-
74
- )
75
- parcel = EasyPost::Parcel.create(
76
- :weight => 7.2,
77
- :height => 2,
78
- :width => 7.5,
79
- :length => 10.5
80
- )
81
-
82
- batch = EasyPost::Batch.create_and_buy({:shipment =>
83
- [
84
- {
85
- :from_address => from_address,
86
- :to_address => to_address,
87
- :parcel => parcel,
88
- :carrier => 'USPS',
89
- :service => 'Priority'
90
- },
91
- {
92
- :from_address => from_address,
93
- :to_address => to_address,
94
- :parcel => parcel,
95
- :reference => 'refnum9173',
96
- :carrier => 'UPS',
97
- :service => '2ndDayAir'
98
- }
99
- ]
39
+ batch = EasyPost::Batch.create({
40
+ :shipment => [{
41
+ :from_address => ADDRESS[:california],
42
+ :to_address => ADDRESS[:missouri],
43
+ :parcel => PARCEL[:dimensions],
44
+ :carrier => "usps",
45
+ :service => "priority"
46
+ }, {
47
+ :from_address => ADDRESS[:california],
48
+ :to_address => ADDRESS[:canada],
49
+ :parcel => PARCEL[:dimensions],
50
+ :carrier => "usps",
51
+ :service => "prioritymailinternational"
52
+ }],
53
+ :reference => "batch123456789"
100
54
  })
101
55
  expect(batch).to be_an_instance_of(EasyPost::Batch)
102
56
  expect(batch.state).to eq("creating")
@@ -0,0 +1,87 @@
1
+ require 'spec_helper'
2
+
3
+ describe EasyPost::Container do
4
+
5
+ describe '#create' do
6
+ it 'creates a container object' do
7
+ container = EasyPost::Container.create(
8
+ name: "Spec Box 1",
9
+ length: 6.2,
10
+ width: 12.8,
11
+ height: 13.5,
12
+ max_weight: 40.55,
13
+ reference: "SPECBOX",
14
+ )
15
+ expect(container).to be_an_instance_of(EasyPost::Container)
16
+ expect(container.max_weight).to eq(40.55)
17
+ end
18
+
19
+ it 'fails to create a container object' do
20
+ expect { EasyPost::Container.create(
21
+ name: "Missing dimension",
22
+ length: 6,
23
+ width: 12,
24
+ max_weight: 40
25
+ ) }.to raise_exception(EasyPost::Error, /Invalid request, if one dimension is provided all three are required./)
26
+ end
27
+
28
+ it 'creates a container object with default values' do
29
+ container = EasyPost::Container.create(name: "Defaults Box")
30
+ expect(container).to be_an_instance_of(EasyPost::Container)
31
+ expect(container.id).to be
32
+ expect(container.name).to eq("Defaults Box")
33
+ expect(container.length).to eq(0.0)
34
+ expect(container.width).to eq(0.0)
35
+ expect(container.height).to eq(0.0)
36
+ expect(container.max_weight).to eq(0.0)
37
+ expect(container.type).to eq("BOX")
38
+ end
39
+ end
40
+
41
+ describe '#retrieve' do
42
+ it 'retrieves a user created container by public_id' do
43
+ container_1 = EasyPost::Container.create(
44
+ name: "My Box",
45
+ length: 6.2,
46
+ width: 12.8,
47
+ height: 13.5,
48
+ max_weight: 40.55,
49
+ reference: "SPECBOX",
50
+ type: "BAG",
51
+ )
52
+ container_2 = EasyPost::Container.retrieve(container_1.id)
53
+
54
+ expect(container_1).to be_an_instance_of(EasyPost::Container)
55
+ expect(container_2).to be_an_instance_of(EasyPost::Container)
56
+ expect(container_2.id).to eq(container_1.id)
57
+ expect(container_1.type).to eq("BAG")
58
+ end
59
+
60
+ it 'retrieves a user created container by reference' do
61
+ container_1 = EasyPost::Container.create(
62
+ name: "Spec Box 2",
63
+ length: 6.2,
64
+ width: 12.8,
65
+ height: 133.94,
66
+ max_weight: 40.55,
67
+ reference: "SPECBOX4",
68
+ )
69
+ container_2 = EasyPost::Container.retrieve("SPECBOX4")
70
+
71
+ expect(container_1).to be_an_instance_of(EasyPost::Container)
72
+ expect(container_2).to be_an_instance_of(EasyPost::Container)
73
+ expect(container_2.height).to eq(container_1.height)
74
+ expect(container_1.type).to eq("BOX")
75
+ end
76
+
77
+ it 'retrieves global containers' do
78
+ container_1 = EasyPost::Container.retrieve("container_USPSFR03")
79
+ container_2 = EasyPost::Container.retrieve("container_USPSFR02")
80
+
81
+ expect(container_1).to be_an_instance_of(EasyPost::Container)
82
+ expect(container_2).to be_an_instance_of(EasyPost::Container)
83
+ expect(container_1.reference).to eq(container_2.reference)
84
+ end
85
+ end
86
+
87
+ end
@@ -0,0 +1,170 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'fedex domestic' do
4
+ before(:all) do
5
+ @rates = {}
6
+ end
7
+
8
+ it 'buys a commercial ground label' do
9
+ shipment = EasyPost::Shipment.create(
10
+ :to_address => ADDRESS[:california],
11
+ :from_address => ADDRESS[:missouri],
12
+ :parcel => PARCEL[:dimensions]
13
+ )
14
+ shipment.buy(:rate => shipment.lowest_rate("fedex", "FEDEX_GROUND"))
15
+ label = open(shipment.postage_label.label_url)
16
+
17
+ expect(shipment).to be_an_instance_of(EasyPost::Shipment)
18
+ expect(shipment.selected_rate).to be_an_instance_of(EasyPost::Rate)
19
+ expect(shipment.selected_rate.service).to eq("FEDEX_GROUND")
20
+ expect(shipment.postage_label.label_url).to end_with(".png")
21
+ expect(shipment.tracking_code).to start_with("8000")
22
+ expect(label.size).to be > 5000
23
+
24
+ @rates[:commercial] = shipment.selected_rate
25
+ end
26
+
27
+ it 'buys a residential ground label' do
28
+ shipment = EasyPost::Shipment.create(
29
+ :to_address => ADDRESS[:california],
30
+ :from_address => ADDRESS[:missouri],
31
+ :parcel => PARCEL[:dimensions],
32
+ :options => {:residential_to_address => true}
33
+ )
34
+ shipment.buy(:rate => shipment.lowest_rate("fedex", "GROUND_HOME_DELIVERY"))
35
+ label = open(shipment.postage_label.label_url)
36
+
37
+ expect(shipment.selected_rate.service).to eq("GROUND_HOME_DELIVERY")
38
+ expect(shipment.tracking_code).to start_with("8000")
39
+ expect(label.size).to be > 5000
40
+
41
+ @rates[:residential] = shipment.selected_rate
42
+ end
43
+
44
+ it 'buys a ground evening delivery label' do
45
+ shipment = EasyPost::Shipment.create(
46
+ :to_address => ADDRESS[:california],
47
+ :from_address => ADDRESS[:missouri],
48
+ :parcel => PARCEL[:dimensions],
49
+ :options => {:residential_to_address => true,
50
+ :delivery_time_preference => "evening"}
51
+ )
52
+ shipment.buy(:rate => shipment.lowest_rate("fedex", "GROUND_HOME_DELIVERY"))
53
+
54
+ expect(shipment.postage_label.label_url).to end_with(".png")
55
+
56
+ @rates[:residential_evening] = shipment.selected_rate
57
+ end
58
+
59
+ it 'raises error without recipient phone number' do
60
+ shipment = EasyPost::Shipment.create(
61
+ :to_address => ADDRESS[:california_no_phone],
62
+ :from_address => ADDRESS[:missouri],
63
+ :parcel => PARCEL[:dimensions]
64
+ )
65
+
66
+ expect { shipment.buy(rate: shipment.lowest_rate("fedex")) }.to raise_error(EasyPost::Error, /Unable to buy FedEx shipment without recipient phone number./)
67
+ end
68
+
69
+ it 'buys a label for an alcoholic shipment with epl2 label' do
70
+ shipment = EasyPost::Shipment.create(
71
+ :to_address => ADDRESS[:california],
72
+ :from_address => ADDRESS[:missouri],
73
+ :parcel => PARCEL[:dimensions],
74
+ :options => {
75
+ :alcohol => 1,
76
+ :label_format => "epl2"
77
+ }
78
+ )
79
+ shipment.buy(:rate => shipment.lowest_rate("fedex", "PRIORITY_OVERNIGHT"))
80
+
81
+ expect(shipment.postage_label.label_url).to end_with(".epl2")
82
+ end
83
+
84
+ it 'buys a label for a ground cod shipment' do
85
+ shipment = EasyPost::Shipment.create(
86
+ :to_address => ADDRESS[:california],
87
+ :from_address => ADDRESS[:missouri],
88
+ :parcel => PARCEL[:dimensions]
89
+ )
90
+ shipment_cod = EasyPost::Shipment.create(
91
+ :to_address => ADDRESS[:california],
92
+ :from_address => ADDRESS[:missouri],
93
+ :parcel => PARCEL[:dimensions],
94
+ :options => {cod_amount: 19.99}
95
+ )
96
+ shipment_cod.buy(rate: shipment_cod.lowest_rate("fedex", "FEDEX_GROUND"))
97
+
98
+ expect(shipment.lowest_rate("fedex", "FEDEX_GROUND").rate.to_f).to be < (shipment_cod.lowest_rate("fedex", "FEDEX_GROUND").rate.to_f)
99
+ expect(shipment.lowest_rate("fedex", "PRIORITY_OVERNIGHT").rate.to_f).to be < (shipment_cod.lowest_rate("fedex", "PRIORITY_OVERNIGHT").rate.to_f)
100
+ expect(shipment_cod.postage_label.label_url).to be
101
+ end
102
+
103
+ it 'buys a label for a ground multi-parcel cod shipment' do
104
+ order = EasyPost::Order.create(
105
+ to_address: ADDRESS[:california],
106
+ from_address: ADDRESS[:missouri],
107
+ shipments: [{
108
+ parcel: {length: 8, width: 6, height: 4, weight: 12},
109
+ options: {cod_amount: 14.99}
110
+ },{
111
+ parcel: {length: 8, width: 6, height: 4, weight: 12},
112
+ options: {cod_amount: 18.75}
113
+ }]
114
+ )
115
+ order.buy(carrier: "fedex", service: "FEDEX_GROUND")
116
+
117
+ expect(order).to be_an_instance_of(EasyPost::Order)
118
+ expect(order.shipments.first).to be_an_instance_of(EasyPost::Shipment)
119
+ expect(order.shipments[0].postage_label.label_url).to be
120
+ expect(order.shipments[1].postage_label.label_url).to be
121
+ end
122
+
123
+ it 'buys a label for an express cod shipment' do
124
+ shipment = EasyPost::Shipment.create(
125
+ :to_address => ADDRESS[:california],
126
+ :from_address => ADDRESS[:missouri],
127
+ :parcel => PARCEL[:dimensions]
128
+ )
129
+ shipment_cod = EasyPost::Shipment.create(
130
+ :to_address => ADDRESS[:california],
131
+ :from_address => ADDRESS[:missouri],
132
+ :parcel => PARCEL[:dimensions],
133
+ :options => {cod_amount: 19.99}
134
+ )
135
+ shipment_cod.buy(rate: shipment_cod.lowest_rate("fedex", "PRIORITY_OVERNIGHT"))
136
+
137
+ expect(shipment.lowest_rate("fedex", "FEDEX_GROUND").rate.to_f).to be < (shipment_cod.lowest_rate("fedex", "FEDEX_GROUND").rate.to_f)
138
+ expect(shipment.lowest_rate("fedex", "PRIORITY_OVERNIGHT").rate.to_f).to be < (shipment_cod.lowest_rate("fedex", "PRIORITY_OVERNIGHT").rate.to_f)
139
+ expect(shipment_cod.postage_label.label_url).to be
140
+ end
141
+
142
+ it 'buys a label for an express multi-parcel cod shipment' do
143
+ order = EasyPost::Order.create(
144
+ to_address: ADDRESS[:california],
145
+ from_address: ADDRESS[:missouri],
146
+ shipments: [{
147
+ parcel: {length: 8, width: 6, height: 4, weight: 12},
148
+ options: {cod_amount: 14.99}
149
+ },{
150
+ parcel: {length: 8, width: 6, height: 4, weight: 12},
151
+ options: {cod_amount: 18.75}
152
+ }]
153
+ )
154
+ order.buy(carrier: "fedex", service: "PRIORITY_OVERNIGHT")
155
+
156
+ expect(order).to be_an_instance_of(EasyPost::Order)
157
+ expect(order.shipments.first).to be_an_instance_of(EasyPost::Shipment)
158
+ expect(order.shipments[0].postage_label.label_url).to be
159
+ expect(order.shipments[1].postage_label.label_url).to be
160
+ end
161
+
162
+ after(:all) do
163
+ begin
164
+ expect(@rates[:residential_evening].rate.to_i).to be > @rates[:residential].rate.to_i
165
+ expect(@rates[:residential].rate.to_i).to be > @rates[:commercial].rate.to_i
166
+ rescue
167
+ end
168
+ end
169
+
170
+ end