easypost 2.1.0 → 2.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- ZDRiZmUzZDYxMmEzNmNlNWRhNjMxNzZkYjdhMzQ4MGZjZTMxOTM5Mw==
5
- data.tar.gz: !binary |-
6
- ZTcxNzNjN2ZhMzYxODA3NmFhMGY5NzQ4NTg2ZTk5NmNjOTAwODI5ZA==
2
+ SHA1:
3
+ metadata.gz: 1d1cc5a734e2706f3cbeba923df0240405b0e0df
4
+ data.tar.gz: fe44d1b81b62583f286e045e385cbdeab0818581
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- MzlmYzQ1YjZkMjQ0YWMzYTVjMzU5ZDI4NzJhYzAzODcxYmQ0MDBiMDVjYTAw
10
- OTQ2NjE0YjQwMzcyZmY4ZTkyMzcwYjMxODBjM2I3Y2ZhMmQ0NzAzMThhOWNm
11
- OTEzYjVkNzMzNmFmZTMyNmMyODBjNjJiYzRkZmM3N2Q0NDcxNjU=
12
- data.tar.gz: !binary |-
13
- NjNlMmY0ZmI5MDdjNWI1ODM0MDBkZTBhMjQ0OTk3NDhkMjIxNTNlMTZhOWQ0
14
- OGVlYjVlYjRkMjhkMThiMDZlMmRhZmM4NTIxMWJmMWI4NTc1ODRmMDNjMzk1
15
- ODExMzE1MmE0OWMxOTY4ZWRmMTg3YThiOWE4NGE2NWY1Mzk5ZGU=
6
+ metadata.gz: 4afc2b2702cf588aed58d28413cd6b31ea74ce1ca08a8e1527f1ebc71f7299ca596af96bdc2020542c625fd1809d99d144becff5d26c80a1688d73374ea8c9fc
7
+ data.tar.gz: d5f90684e2740529028f2e32431c882f939db7ea788849d6e0054865078a2dfb4d9dcdeb74010ad99a1576ca068a64bf797bb0fa5d4387c029c8095634d39156
data/.gitignore CHANGED
@@ -25,4 +25,5 @@ doc/
25
25
  Icon
26
26
  ._*
27
27
  .Spotlight-V100
28
- .Trashes
28
+ .Trashes
29
+ vendor/
data/CHANGELOG CHANGED
@@ -1,3 +1,27 @@
1
+ === 2.1.1 2015-04-15
2
+
3
+ * CarrierAccount will now correctly save in-place modifications to credentials
4
+ * Nested variables should now be saved correctly across all models
5
+ * Fixed version numbering confusion (the previous version was 2.0.15, not 2.1.0)
6
+
7
+
8
+ === 2.0.15 2015-04-15
9
+
10
+ * Added tracker to shipment buy response
11
+ * Updated tracker tests
12
+
13
+
14
+ === 2.0.14 2015-04-15
15
+
16
+ * Added User and CarrierAccount models with CRUD functionality
17
+
18
+
19
+ === 2.0.13 2014-10-30
20
+
21
+ * Added Pickup, PickupRate resources.
22
+ * Added ability to pass api_key to a few resources that were missing it.
23
+
24
+
1
25
  === 2.0.12 2014-07-07
2
26
 
3
27
  * Added Item, Container, and Order resources.
data/README.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # EasyPost Ruby Client Library
2
2
 
3
+ [<img src="https://circleci.com/gh/EasyPost/easypost-ruby.png?circle-token=80adb5236ed1fdce20810b055af79c63c3d5796b">](https://circleci.com/gh/EasyPost/easypost-ruby)
4
+
5
+
3
6
  EasyPost is a simple shipping API. You can sign up for an account at https://easypost.com
4
7
 
5
8
  Installation
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.1.0
1
+ 2.1.1
@@ -26,6 +26,8 @@ require 'easypost/container'
26
26
  require 'easypost/order'
27
27
  require 'easypost/pickup'
28
28
  require 'easypost/pickup_rate'
29
+ require 'easypost/carrier_account'
30
+ require 'easypost/user'
29
31
 
30
32
  require 'easypost/error'
31
33
 
@@ -68,7 +70,8 @@ module EasyPost
68
70
  @@http_config ||= {
69
71
  timeout: 60,
70
72
  open_timeout: 30,
71
- verify_ssl: false
73
+ verify_ssl: false,
74
+ ssl_version: "TLSv1",
72
75
  }
73
76
  end
74
77
 
@@ -14,12 +14,16 @@ module EasyPost
14
14
  verified_address = EasyPost::Util::convert_to_easypost_object(response[:address], api_key)
15
15
  return verified_address
16
16
  else
17
- raise Error.new("Unable to verify address.")
17
+ raise_verification_failure
18
18
  end
19
19
  end
20
20
 
21
21
  def verify(params={}, carrier=nil)
22
- response, api_key = EasyPost.request(:get, url + '/verify?carrier=' + String(carrier), @api_key, params)
22
+ begin
23
+ response, api_key = EasyPost.request(:get, url + '/verify?carrier=' + String(carrier), @api_key, params)
24
+ rescue
25
+ raise_verification_failure
26
+ end
23
27
 
24
28
  if response.has_key?(:address)
25
29
  if response.has_key?(:message)
@@ -28,11 +32,14 @@ module EasyPost
28
32
  verified_address = EasyPost::Util::convert_to_easypost_object(response[:address], api_key)
29
33
  return verified_address
30
34
  else
31
- raise Error.new("Unable to verify address.")
35
+ raise_verification_failure
32
36
  end
33
37
 
34
38
  return self
35
39
  end
36
40
 
41
+ def raise_verification_failure
42
+ raise Error.new("Unable to verify address.")
43
+ end
37
44
  end
38
45
  end
@@ -0,0 +1,8 @@
1
+ module EasyPost
2
+ class CarrierAccount < Resource
3
+ def self.types
4
+ response, api_key = EasyPost.request(:get, "/carrier_types", @api_key)
5
+ return Util.convert_to_easypost_object(response, api_key)
6
+ end
7
+ end
8
+ end
@@ -2,19 +2,21 @@ module EasyPost
2
2
  class EasyPostObject
3
3
  include Enumerable
4
4
 
5
- attr_accessor :api_key
5
+ attr_accessor :parent, :name, :api_key, :unsaved_values
6
6
  @@immutable_values = Set.new([:api_key, :id])
7
7
 
8
- def initialize(id=nil, api_key=nil)
8
+ def initialize(id=nil, api_key=nil, parent=nil, name=nil)
9
9
  @api_key = api_key
10
10
  @values = {}
11
11
  @unsaved_values = Set.new
12
12
  @transient_values = Set.new
13
+ @parent = parent
14
+ @name = name
13
15
  self.id = id if id
14
16
  end
15
17
 
16
- def self.construct_from(values, api_key=nil)
17
- obj = self.new(values[:id], api_key)
18
+ def self.construct_from(values, api_key=nil, parent=nil, name=nil)
19
+ obj = self.new(values[:id], api_key, parent, name)
18
20
  obj.refresh_from(values, api_key)
19
21
  obj
20
22
  end
@@ -32,13 +34,13 @@ module EasyPost
32
34
  @api_key = api_key
33
35
 
34
36
  added = Set.new(values.keys - @values.keys)
35
-
37
+
36
38
  instance_eval do
37
39
  add_accessors(added)
38
40
  end
39
-
41
+
40
42
  values.each do |k, v|
41
- @values[k] = Util.convert_to_easypost_object(v, api_key)
43
+ @values[k] = Util.convert_to_easypost_object(v, api_key, self, k)
42
44
  @transient_values.delete(k)
43
45
  @unsaved_values.delete(k)
44
46
  end
@@ -87,6 +89,21 @@ module EasyPost
87
89
 
88
90
  protected
89
91
 
92
+ def flatten_unsaved
93
+ values = {}
94
+ for key in @unsaved_values
95
+ value = @values[key]
96
+
97
+ values[key] = value
98
+
99
+ if value.is_a?(EasyPost::EasyPostObject)
100
+ values[key] = flatten_unsaved(value)
101
+ end
102
+ end
103
+
104
+ return values
105
+ end
106
+
90
107
  def metaclass
91
108
  class << self; self; end
92
109
  end
@@ -111,6 +128,18 @@ module EasyPost
111
128
  define_method(k_eq) do |v|
112
129
  @values[k] = v
113
130
  @unsaved_values.add(k)
131
+
132
+ cur = self
133
+ cur_parent = self.parent
134
+ param = {}
135
+ while cur_parent
136
+ if cur.name
137
+ cur_parent.unsaved_values.add(cur.name)
138
+ end
139
+
140
+ cur = cur_parent
141
+ cur_parent = cur.parent
142
+ end
114
143
  end
115
144
  end
116
145
  end
@@ -58,7 +58,17 @@ module EasyPost
58
58
  if @unsaved_values.length > 0
59
59
  values = {}
60
60
  @unsaved_values.each { |k| values[k] = @values[k] }
61
- response, api_key = EasyPost.request(:post, url, @api_key, values)
61
+
62
+ for key in @unsaved_values
63
+ value = values[key]
64
+ if value.is_a?(EasyPost::EasyPostObject)
65
+ values[key] = value.flatten_unsaved
66
+ end
67
+ end
68
+
69
+ wrapped_params = {self.class.class_name => values}
70
+
71
+ response, api_key = EasyPost.request(:put, url, @api_key, wrapped_params)
62
72
  refresh_from(response, api_key)
63
73
  end
64
74
  return self
@@ -0,0 +1,42 @@
1
+ module EasyPost
2
+ class User < Resource
3
+ def save
4
+ if @unsaved_values.length > 0
5
+ values = {}
6
+ @unsaved_values.each { |k| values[k] = @values[k] }
7
+
8
+ wrapped_params = {user: values}
9
+
10
+ response, api_key = EasyPost.request(:put, url, @api_key, wrapped_params)
11
+ refresh_from(response, api_key)
12
+ end
13
+ return self
14
+ end
15
+
16
+ def self.retrieve_me
17
+ self.all
18
+ end
19
+
20
+ def self.all_api_keys
21
+ response, api_key = EasyPost.request(:get, "/api_keys", @api_key)
22
+ return Util.convert_to_easypost_object(response, api_key)
23
+ end
24
+
25
+ def api_keys
26
+ api_keys = EasyPost::User.all_api_keys
27
+
28
+ if api_keys.id == self.id
29
+ my_api_keys = api_keys.keys
30
+ else
31
+ for child in api_keys.children
32
+ if child.id == self.id
33
+ my_api_keys = child.keys
34
+ break
35
+ end
36
+ end
37
+ end
38
+
39
+ my_api_keys
40
+ end
41
+ end
42
+ end
@@ -15,7 +15,7 @@ module EasyPost
15
15
  end
16
16
  end
17
17
 
18
- def self.convert_to_easypost_object(response, api_key)
18
+ def self.convert_to_easypost_object(response, api_key, parent=nil, name=nil)
19
19
  types = { 'Address' => Address,
20
20
  'ScanForm' => ScanForm,
21
21
  'CustomsItem' => CustomsItem,
@@ -32,7 +32,9 @@ module EasyPost
32
32
  'Order' => Order,
33
33
  'Pickup' => Pickup,
34
34
  'PickupRate' => PickupRate,
35
- 'PostageLabel' => PostageLabel }
35
+ 'PostageLabel' => PostageLabel,
36
+ 'CarrierAccount' => CarrierAccount,
37
+ 'User' => User }
36
38
 
37
39
  prefixes = { 'adr' => Address,
38
40
  'sf' => ScanForm,
@@ -50,11 +52,13 @@ module EasyPost
50
52
  'order' => Order,
51
53
  'pickup' => Pickup,
52
54
  'pickuprate' => PickupRate,
53
- 'pl' => PostageLabel }
55
+ 'pl' => PostageLabel,
56
+ 'ca' => CarrierAccount,
57
+ 'user' => User }
54
58
 
55
59
  case response
56
60
  when Array
57
- return response.map { |i| convert_to_easypost_object(i, api_key) }
61
+ return response.map { |i| convert_to_easypost_object(i, api_key, parent) }
58
62
  when Hash
59
63
  if cls_name = response[:object]
60
64
  cls = types[cls_name]
@@ -65,7 +69,7 @@ module EasyPost
65
69
  end
66
70
 
67
71
  cls ||= EasyPostObject
68
- return cls.construct_from(response, api_key)
72
+ return cls.construct_from(response, api_key, parent, name)
69
73
  else
70
74
  return response
71
75
  end
@@ -55,15 +55,15 @@ describe EasyPost::Address do
55
55
 
56
56
  it 'is not able to verify address' do
57
57
  address = EasyPost::Address.create(
58
- :company => 'Simpler Postage Inc',
59
- :street1 => '388 Junk Teerts',
60
- :street2 => 'Apt 20',
61
- :city => 'San Francisco',
62
- :state => 'CA',
63
- :zip => '941abc07'
58
+ company: 'Simpler Postage Inc',
59
+ street1: '388 Junk Teerts',
60
+ street2: 'Apt 20',
61
+ city: 'San Francisco',
62
+ state: 'CA',
63
+ zip: '941abc07'
64
64
  )
65
65
 
66
- expect { verified_address = address.verify() }.to raise_error(EasyPost::Error, /Unable to verify address./)
66
+ expect { verified_address = address.verify() }.to raise_error(EasyPost::Error, /Unable to verify addres/)
67
67
  end
68
68
  end
69
69
  end
@@ -1,61 +1,48 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe EasyPost::Batch do
4
-
5
4
  describe '#create' do
6
5
  it 'creates a batch object' do
7
6
  batch = EasyPost::Batch.create({
8
- :shipment => [{
9
- :from_address => ADDRESS[:california],
10
- :to_address => ADDRESS[:missouri],
11
- :parcel => PARCEL[:dimensions]
7
+ shipment: [{
8
+ from_address: ADDRESS[:california],
9
+ to_address: EasyPost::Address.create(ADDRESS[:missouri]),
10
+ parcel: EasyPost::Parcel.create(PARCEL[:dimensions])
12
11
  }, {
13
- :from_address => ADDRESS[:california],
14
- :to_address => ADDRESS[:canada],
15
- :parcel => PARCEL[:dimensions],
12
+ from_address: ADDRESS[:california],
13
+ to_address: EasyPost::Address.create(ADDRESS[:canada]),
14
+ parcel: EasyPost::Parcel.create(PARCEL[:dimensions]),
16
15
  }],
17
- :reference => "batch123456789"
16
+ reference: "batch123456789"
18
17
  })
19
18
  expect(batch).to be_an_instance_of(EasyPost::Batch)
20
19
  expect(batch.num_shipments).to eq(2)
21
20
  expect(batch.reference).to eq("batch123456789")
22
21
  expect(batch.state).to eq("creating")
23
-
24
- # sleeps_left = 10
25
- # while (batch.state == "creating" && sleeps_left > 0) do
26
- # sleep(3)
27
- # batch.refresh
28
- # sleeps_left -= 1
29
- # end
30
-
31
- # expect(batch.state).to equal("created")
32
- # expect(batch.status[:created]).to equal(2)
33
-
34
22
  end
35
23
  end
36
24
 
37
25
  describe '#create_and_buy' do
38
26
  it 'creates a batch object and delayed jobs for purchasing the postage_labels' do
39
27
  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"
28
+ shipment: [{
29
+ from_address: ADDRESS[:california],
30
+ to_address: EasyPost::Address.create(ADDRESS[:missouri]),
31
+ parcel: EasyPost::Parcel.create(PARCEL[:dimensions]),
32
+ carrier: "usps",
33
+ service: "priority"
46
34
  }, {
47
- :from_address => ADDRESS[:california],
48
- :to_address => ADDRESS[:canada],
49
- :parcel => PARCEL[:dimensions],
50
- :carrier => "usps",
51
- :service => "prioritymailinternational"
35
+ from_address: ADDRESS[:california],
36
+ to_address: EasyPost::Address.create(ADDRESS[:canada]),
37
+ parcel: EasyPost::Parcel.create(PARCEL[:dimensions]),
38
+ carrier: "usps",
39
+ service: "prioritymailinternational"
52
40
  }],
53
- :reference => "batch123456789"
41
+ reference: "batch123456789"
54
42
  })
55
43
  expect(batch).to be_an_instance_of(EasyPost::Batch)
56
44
  expect(batch.state).to eq("creating")
57
45
  expect(batch.num_shipments).to eq(2)
58
46
  end
59
47
  end
60
-
61
48
  end
@@ -0,0 +1,116 @@
1
+ require 'spec_helper'
2
+
3
+ describe EasyPost::CarrierAccount do
4
+ it 'performs retrieve on a carrier account' do
5
+ id = 'ca_r8hLl9jS'
6
+ ca = EasyPost::CarrierAccount.retrieve(id)
7
+
8
+ expect(ca.id).to eq(id)
9
+ end
10
+
11
+ context 'perform CRUD functions' do
12
+ it 'performs all basic CRUD actions on a CarrierAccount' do
13
+ original_num_cas = EasyPost::CarrierAccount.all.count
14
+
15
+ description = "A test Ups Account"
16
+ reference = "RubyClientUpsTestAccount"
17
+
18
+ created_ca = EasyPost::CarrierAccount.create(
19
+ type: "UpsAccount",
20
+ description: description,
21
+ reference: reference,
22
+ credentials: {
23
+ account_number: "A1A1A1",
24
+ user_id: "UPSDOTCOM_USERNAME",
25
+ password: "UPSDOTCOM_PASSWORD",
26
+ access_license_number: "UPS_ACCESS_LICENSE_NUMBER"
27
+ }
28
+ )
29
+
30
+ id = created_ca["id"]
31
+
32
+ interm_num_cas = EasyPost::CarrierAccount.all.count
33
+ expect(interm_num_cas).to eq(original_num_cas + 1)
34
+
35
+ retrieved_ca = EasyPost::CarrierAccount.retrieve(id)
36
+
37
+ expect(retrieved_ca["id"]).to eq(created_ca["id"])
38
+ expect(retrieved_ca["description"]).to eq(description)
39
+ expect(retrieved_ca["reference"]).to eq(reference)
40
+
41
+ updated_description = "An updated description for a test Ups Account"
42
+ updated_account_number = "B2B2B2B2"
43
+ retrieved_ca.description = updated_description
44
+ retrieved_ca.credentials = {
45
+ account_number: updated_account_number,
46
+ user_id: "UPSDOTCOM_USERNAME",
47
+ password: "UPSDOTCOM_PASSWORD",
48
+ access_license_number: "UPS_ACCESS_LICENSE_NUMBER"
49
+ }
50
+ retrieved_ca.save
51
+
52
+ updated_ca = EasyPost::CarrierAccount.retrieve(id)
53
+ expect(updated_ca["id"]).to eq(created_ca["id"])
54
+ expect(updated_ca["description"]).to eq(updated_description)
55
+ expect(updated_ca["credentials"]["account_number"]).to eq(updated_account_number)
56
+
57
+ reupdated_account_number = "C3C3C3C3C3"
58
+ updated_user_id = "A_NEW_UPS_USERNAME"
59
+ updated_ca.credentials[:account_number] = reupdated_account_number
60
+ updated_ca.credentials[:user_id] = updated_user_id
61
+ updated_ca.save
62
+
63
+ reupdated_ca = EasyPost::CarrierAccount.retrieve(id)
64
+ expect(reupdated_ca["id"]).to eq(created_ca["id"])
65
+ expect(reupdated_ca["credentials"]["account_number"]).to eq(reupdated_account_number)
66
+ expect(reupdated_ca["credentials"]["user_id"]).to eq(updated_user_id)
67
+
68
+ final_ca = reupdated_ca.save
69
+ expect(final_ca["id"]).to eq(created_ca["id"])
70
+ expect(final_ca["credentials"]["account_number"]).to eq(reupdated_account_number)
71
+ expect(final_ca["credentials"]["user_id"]).to eq(updated_user_id)
72
+
73
+ final_ca.delete
74
+
75
+ final_num_cas = EasyPost::CarrierAccount.all.count
76
+ expect(final_num_cas).to eq(original_num_cas)
77
+ end
78
+ end
79
+
80
+ describe '#types' do
81
+ let(:carrier_account_types) { [
82
+ "AsendiaAccount",
83
+ "AustraliaPostAccount",
84
+ "CanadaPostAccount",
85
+ "CanparAccount",
86
+ "ColisPriveAccount",
87
+ "DhlExpressAccount",
88
+ "DhlGlobalMailAccount",
89
+ "FastwayAccount",
90
+ "FedexAccount",
91
+ "FedexSmartpostAccount",
92
+ "GsoAccount",
93
+ "LasershipAccount",
94
+ "LsoAccount",
95
+ "NorcoAccount",
96
+ "NzpostAccount",
97
+ "OntracAccount",
98
+ "PurolatorAccount",
99
+ "RoyalMailAccount",
100
+ "SpeedeeAccount",
101
+ "TntExpressAccount",
102
+ "UpsAccount",
103
+ "UpsMailInnovationsAccount",
104
+ "UpsSurepostAccount"
105
+ ] }
106
+
107
+ it 'returns the expected list of types' do
108
+ types = EasyPost::CarrierAccount.types
109
+ account_types = types.map(&:type)
110
+
111
+ for account_type in carrier_account_types
112
+ expect(account_types).to include(account_type)
113
+ end
114
+ end
115
+ end
116
+ end