shipcloud 0.7.0 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.hound.yml +1 -1
- data/.rubocop.yml +689 -2
- data/.travis.yml +9 -1
- data/CHANGELOG.md +18 -1
- data/README.md +53 -2
- data/lib/shipcloud.rb +10 -1
- data/lib/shipcloud/pickup_request.rb +12 -0
- data/lib/shipcloud/request/base.rb +1 -1
- data/lib/shipcloud/request/connection.rb +15 -10
- data/lib/shipcloud/shipcloud_error.rb +2 -0
- data/lib/shipcloud/shipment.rb +1 -1
- data/lib/shipcloud/tracker.rb +13 -0
- data/lib/shipcloud/version.rb +1 -1
- data/lib/shipcloud/webhook.rb +2 -1
- data/spec/shipcloud/pickup_request_spec.rb +123 -0
- data/spec/shipcloud/request/info_spec.rb +28 -0
- data/spec/shipcloud/shipment_spec.rb +30 -0
- data/spec/shipcloud/tracker_spec.rb +116 -0
- data/spec/shipcloud/webhooks_spec.rb +31 -0
- data/spec/shipcloud_spec.rb +38 -0
- data/spec/spec_helper.rb +2 -2
- metadata +11 -4
- data/.ruby-style.yml +0 -267
data/.travis.yml
CHANGED
@@ -5,10 +5,18 @@ rvm:
|
|
5
5
|
- 2.1.7
|
6
6
|
- 2.2.4
|
7
7
|
- 2.3.0
|
8
|
-
|
8
|
+
matrix:
|
9
|
+
allow_failures:
|
10
|
+
- rvm: rbx-2
|
11
|
+
include:
|
12
|
+
- rvm: rbx-2
|
13
|
+
script: bundle exec rake spec
|
9
14
|
notifications:
|
10
15
|
flowdock:
|
11
16
|
secure: fSZxX5z3bHWT8aCFKBFrDDt5o3Jb6EFWcm+pAcMabpfDHc4iktWuCUlSM405798TRdKdws1A2RncQGYiQyLbqNvtLz48dvj4BxgYW7P/vg0koN+I/H2MjpZeuIQ7BRSEJIq2sAYNVya+hSil+SPEBMTngJiP6VYG0dm6fFnRkyk=
|
12
17
|
addons:
|
13
18
|
code_climate:
|
14
19
|
repo_token: 704eb62133d951ce460a6047a15a58e0a521aa20ec6a533fa7a37585f8a75602
|
20
|
+
after_success:
|
21
|
+
- bundle exec codeclimate-test-reporter
|
22
|
+
|
data/CHANGELOG.md
CHANGED
@@ -1,11 +1,28 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
### Added
|
3
3
|
|
4
|
+
### Changed
|
5
|
+
|
6
|
+
### Deprecated
|
7
|
+
|
4
8
|
### Removed
|
5
9
|
|
6
|
-
###
|
10
|
+
### Fixed
|
11
|
+
|
12
|
+
### Security
|
13
|
+
|
14
|
+
## [0.8.0] - 2017-07-03
|
15
|
+
### Added
|
16
|
+
- Add attribute ```metadata``` to class ```Shipcloud::Shipment``` in order to transmit JSON data (#16).
|
17
|
+
- Add resource pickup_request in order to submit pickup request to shipcloud
|
18
|
+
- Add attribute ```pickup_address``` to class ```Shipcloud::PickupRequest``` to submit an alternative address for pickup request to shipcloud
|
19
|
+
- Add ```delete``` operation for ```webhook``` resource
|
20
|
+
- Add attribute ```deactivated``` to class ```Shipcloud::Webhook```
|
21
|
+
- Add ```affiliate_id``` to ```Shipcloud::Configuration``` and submit it (or a default affiliate id) via API headers to shipcloud
|
22
|
+
- Add class ```Shipcloud::Tracker``` with create, find, and index operations
|
7
23
|
|
8
24
|
### Fixed
|
25
|
+
- Parse response only when it is not empty
|
9
26
|
|
10
27
|
## [0.7.0] - 2016-01-21
|
11
28
|
### Added
|
data/README.md
CHANGED
@@ -55,7 +55,7 @@ You can sign up for a developer account at *[shipcloud.io](http://www.shipcloud.
|
|
55
55
|
|
56
56
|
### Create a new shipment
|
57
57
|
|
58
|
-
To create a new Shipment on the
|
58
|
+
To create a new Shipment on the shipcloud platform, you need to provide the name of the carrier, to- and from-address, and the package dimensions.
|
59
59
|
For details, see *[shipcloud API documentation on Shipments](http://developers.shipcloud.io/reference/#shipments)*
|
60
60
|
```ruby
|
61
61
|
Shipcloud::Shipment.create(
|
@@ -74,9 +74,23 @@ shipment = Shipcloud::Shipment.create(...) # parameters ommitted
|
|
74
74
|
shipment.tracking_url # -> http://track.shipcloud.io/uzdgu22z3ed12
|
75
75
|
```
|
76
76
|
|
77
|
+
### Get a list of shipments
|
78
|
+
|
79
|
+
You can get a list of all shipments from the shipcloud platform. Shipments can be filtered by providing optional parameters. For more information and a list of valid parameters see *[shipcloud API documentation on Shipments Index](https://developers.shipcloud.io/reference/#getting-a-list-of-shipments)*
|
80
|
+
|
81
|
+
```ruby
|
82
|
+
Shipcloud::Shipment.all(
|
83
|
+
carrier: 'ups',
|
84
|
+
per_page: 25,
|
85
|
+
page: 2
|
86
|
+
)
|
87
|
+
```
|
88
|
+
|
89
|
+
`Shipment#all` will return an array of `Shipcloud::Shipment` objects, matching the given parameters.
|
90
|
+
|
77
91
|
### Get a shipment quote
|
78
92
|
|
79
|
-
To get a shipment qoute from the
|
93
|
+
To get a shipment qoute from the shipcloud platform, you need to provide the name of the carrier, the service, to- and from-address, and the package dimensions.
|
80
94
|
For details, see *[shipcloud API documentation on shipment quotes](https://developers.shipcloud.io/reference/#shipment-quotes)*
|
81
95
|
|
82
96
|
```ruby
|
@@ -108,6 +122,43 @@ shipment_quote = Shipcloud::ShipmentQuote.create(
|
|
108
122
|
shipment_quote.price # => 6.2
|
109
123
|
```
|
110
124
|
|
125
|
+
### Create a pickup request
|
126
|
+
|
127
|
+
To request parcels being picked up, you need to provide the carrier name and the time (earliest and latest) your shipments shall be fetched.
|
128
|
+
|
129
|
+
```ruby
|
130
|
+
pickup_request = Shipcloud::PickupRequest.create(
|
131
|
+
carrier: 'dpd',
|
132
|
+
pickup_time: {
|
133
|
+
earliest: "2016-04-04T09:00:00+02:00",
|
134
|
+
latest: "2016-04-04T18:00:00+02:00"
|
135
|
+
}
|
136
|
+
)
|
137
|
+
|
138
|
+
pickup_request.id # => "dje892dj20d2odj20"
|
139
|
+
pickup_request.carrier_pickup_number # => "12345"
|
140
|
+
```
|
141
|
+
|
142
|
+
You may also provide a list of shipment ids to specify only certain shipments to be included in the pickup request.
|
143
|
+
|
144
|
+
```ruby
|
145
|
+
pickup_request = Shipcloud::PickupRequest.create(
|
146
|
+
carrier: 'dpd',
|
147
|
+
pickup_time: {
|
148
|
+
earliest: "2016-04-04T09:00:00+02:00",
|
149
|
+
latest: "2016-04-04T18:00:00+02:00"
|
150
|
+
},
|
151
|
+
shipments: [
|
152
|
+
{ id: "abc_123"}
|
153
|
+
]
|
154
|
+
)
|
155
|
+
|
156
|
+
pickup_request.id # => "dje892dj20d2odj20"
|
157
|
+
pickup_request.carrier_pickup_number # => "12345"
|
158
|
+
```
|
159
|
+
|
160
|
+
|
161
|
+
|
111
162
|
## Contributing
|
112
163
|
|
113
164
|
1. Fork it
|
data/lib/shipcloud.rb
CHANGED
@@ -13,11 +13,15 @@ module Shipcloud
|
|
13
13
|
"User-Agent" => "shipcloud-ruby v#{Shipcloud::VERSION}, API #{Shipcloud::API_VERSION}, #{RUBY_VERSION}, #{RUBY_PLATFORM}, #{RUBY_PATCHLEVEL}"
|
14
14
|
}
|
15
15
|
|
16
|
+
DEFAULT_AFFILIATE_ID = "integration.shipcloud-ruby-gem.v#{Shipcloud::VERSION}".freeze
|
17
|
+
|
16
18
|
autoload :Base, "shipcloud/base"
|
17
19
|
autoload :Shipment, "shipcloud/shipment"
|
18
20
|
autoload :Carrier, "shipcloud/carrier"
|
19
21
|
autoload :Address, "shipcloud/address"
|
22
|
+
autoload :PickupRequest, "shipcloud/pickup_request"
|
20
23
|
autoload :ShipmentQuote, "shipcloud/shipment_quote"
|
24
|
+
autoload :Tracker, "shipcloud/tracker"
|
21
25
|
autoload :Webhook, "shipcloud/webhook"
|
22
26
|
|
23
27
|
module Operations
|
@@ -46,9 +50,14 @@ module Shipcloud
|
|
46
50
|
yield(configuration)
|
47
51
|
end
|
48
52
|
|
53
|
+
def self.api_headers
|
54
|
+
API_HEADERS.merge(
|
55
|
+
"Affiliate-ID" => configuration.affiliate_id || DEFAULT_AFFILIATE_ID
|
56
|
+
)
|
57
|
+
end
|
49
58
|
|
50
59
|
class Configuration
|
51
|
-
attr_accessor :api_key, :api_base, :use_ssl, :debug
|
60
|
+
attr_accessor :affiliate_id, :api_key, :api_base, :use_ssl, :debug
|
52
61
|
|
53
62
|
def initialize
|
54
63
|
@api_key = nil
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Shipcloud
|
2
|
+
class PickupRequest < Base
|
3
|
+
include Shipcloud::Operations::Create
|
4
|
+
|
5
|
+
attr_accessor :carrier, :pickup_time, :shipments, :pickup_address
|
6
|
+
attr_reader :id, :carrier_pickup_number
|
7
|
+
|
8
|
+
def self.base_url
|
9
|
+
"pickup_requests"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -12,7 +12,7 @@ module Shipcloud
|
|
12
12
|
connection.setup_https
|
13
13
|
response = connection.request
|
14
14
|
validate_response(response)
|
15
|
-
JSON.parse(response.body)
|
15
|
+
JSON.parse(response.body) unless response.body.nil?
|
16
16
|
rescue JSON::ParserError
|
17
17
|
raise ShipcloudError.new(response)
|
18
18
|
end
|
@@ -28,16 +28,21 @@ module Shipcloud
|
|
28
28
|
protected
|
29
29
|
|
30
30
|
def https_request
|
31
|
-
https_request =
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
31
|
+
https_request =
|
32
|
+
case @info.http_method
|
33
|
+
when :post
|
34
|
+
Net::HTTP::Post.new(@info.url, Shipcloud.api_headers)
|
35
|
+
when :put
|
36
|
+
Net::HTTP::Put.new(@info.url, Shipcloud.api_headers)
|
37
|
+
when :delete
|
38
|
+
Net::HTTP::Delete.new(@info.url, Shipcloud.api_headers)
|
39
|
+
else
|
40
|
+
Net::HTTP::Get.new(
|
41
|
+
@info.path_with_params(@info.url, @info.data),
|
42
|
+
Shipcloud.api_headers,
|
43
|
+
)
|
44
|
+
end
|
45
|
+
|
41
46
|
https_request.basic_auth(@info.api_key, "")
|
42
47
|
https_request.body = @info.data.to_json if [:post, :put].include?(@info.http_method)
|
43
48
|
https_request
|
@@ -26,6 +26,7 @@ module Shipcloud
|
|
26
26
|
when 400, 422 then InvalidRequestError
|
27
27
|
when 401 then AuthenticationError
|
28
28
|
when 402 then TooManyRequests
|
29
|
+
when 403 then ForbiddenError
|
29
30
|
when 404 then NotFoundError
|
30
31
|
when 400..499 then ClientError
|
31
32
|
when 500..599 then ServerError
|
@@ -57,6 +58,7 @@ module Shipcloud
|
|
57
58
|
# Raised on errors in the 400-499 range
|
58
59
|
class ClientError < ShipcloudError; end
|
59
60
|
class AuthenticationError < ClientError; end
|
61
|
+
class ForbiddenError < ClientError; end
|
60
62
|
class InvalidRequestError < ClientError; end
|
61
63
|
class TooManyRequests < ClientError; end
|
62
64
|
class NotFoundError < ClientError; end
|
data/lib/shipcloud/shipment.rb
CHANGED
@@ -4,7 +4,7 @@ module Shipcloud
|
|
4
4
|
include Shipcloud::Operations::Update
|
5
5
|
include Shipcloud::Operations::All
|
6
6
|
|
7
|
-
attr_accessor :from, :to, :carrier, :package, :reference_number
|
7
|
+
attr_accessor :from, :to, :carrier, :package, :reference_number, :metadata
|
8
8
|
attr_reader :id, :created_at, :carrier_tracking_no, :tracking_url, :label_url, :packages, :price
|
9
9
|
|
10
10
|
def self.index_response_root
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Shipcloud
|
3
|
+
class Tracker < Base
|
4
|
+
include Shipcloud::Operations::All
|
5
|
+
|
6
|
+
attr_accessor :carrier, :carrier_tracking_no
|
7
|
+
attr_reader :id
|
8
|
+
|
9
|
+
def self.index_response_root
|
10
|
+
"#{class_name.downcase}s"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/shipcloud/version.rb
CHANGED
data/lib/shipcloud/webhook.rb
CHANGED
@@ -0,0 +1,123 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Shipcloud::PickupRequest do
|
4
|
+
valid_attributes = {
|
5
|
+
carrier: "dpd",
|
6
|
+
pickup_time: {
|
7
|
+
earliest: "2015-09-15T09:00:00+02:00",
|
8
|
+
latest: "2015-09-15T18:00:00+02:00"
|
9
|
+
},
|
10
|
+
shipments: [
|
11
|
+
{ id: "abc_123" }
|
12
|
+
]
|
13
|
+
}
|
14
|
+
|
15
|
+
valid_attributes_with_pickup_address = {
|
16
|
+
carrier: "dpd",
|
17
|
+
pickup_time: {
|
18
|
+
earliest: "2015-09-15T09:00:00+02:00",
|
19
|
+
latest: "2015-09-15T18:00:00+02:00"
|
20
|
+
},
|
21
|
+
pickup_address: {
|
22
|
+
company: "Muster-Company",
|
23
|
+
first_name: "Max",
|
24
|
+
last_name: "Mustermann",
|
25
|
+
street: "Musterstraße",
|
26
|
+
street_no: "42",
|
27
|
+
zip_code: "54321",
|
28
|
+
city: "Musterstadt",
|
29
|
+
country: "DE",
|
30
|
+
phone: "555-555"
|
31
|
+
},
|
32
|
+
shipments: [
|
33
|
+
{ id: "abc_123" }
|
34
|
+
]
|
35
|
+
}
|
36
|
+
|
37
|
+
describe "#initialize" do
|
38
|
+
it "initializes all attributes correctly" do
|
39
|
+
pickup_request = Shipcloud::PickupRequest.new(valid_attributes_with_pickup_address)
|
40
|
+
|
41
|
+
expect(pickup_request.carrier).to eq "dpd"
|
42
|
+
expect(pickup_request.pickup_time[:earliest]).to eq "2015-09-15T09:00:00+02:00"
|
43
|
+
expect(pickup_request.pickup_time[:latest]).to eq "2015-09-15T18:00:00+02:00"
|
44
|
+
expect(pickup_request.pickup_address[:company]).to eq "Muster-Company"
|
45
|
+
expect(pickup_request.pickup_address[:first_name]).to eq "Max"
|
46
|
+
expect(pickup_request.pickup_address[:last_name]).to eq "Mustermann"
|
47
|
+
expect(pickup_request.pickup_address[:street]).to eq "Musterstraße"
|
48
|
+
expect(pickup_request.pickup_address[:street_no]).to eq "42"
|
49
|
+
expect(pickup_request.pickup_address[:zip_code]).to eq "54321"
|
50
|
+
expect(pickup_request.pickup_address[:country]).to eq "DE"
|
51
|
+
expect(pickup_request.pickup_address[:phone]).to eq "555-555"
|
52
|
+
expect(pickup_request.shipments).to eq [{ id: "abc_123" }]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe ".create" do
|
57
|
+
it "makes a new POST request using the correct API endpoint" do
|
58
|
+
expect(Shipcloud).to receive(:request).
|
59
|
+
with(:post, "pickup_requests", valid_attributes, api_key: nil).
|
60
|
+
and_return("data" => {})
|
61
|
+
|
62
|
+
Shipcloud::PickupRequest.create(valid_attributes)
|
63
|
+
end
|
64
|
+
|
65
|
+
it "returns pickup request id" do
|
66
|
+
allow(Shipcloud).to receive(:request).
|
67
|
+
and_return(
|
68
|
+
"id" => "123456",
|
69
|
+
"carrier_pickup_number" => "abcdef",
|
70
|
+
"carrier" => "dpd",
|
71
|
+
"pickup_time" => {
|
72
|
+
"earliest" => "2015-09-15T09:00:00+02:00",
|
73
|
+
"latest" => "2015-09-15T18:00:00+02:00"
|
74
|
+
}
|
75
|
+
)
|
76
|
+
|
77
|
+
pickup_request = Shipcloud::PickupRequest.create(valid_attributes)
|
78
|
+
|
79
|
+
expect(pickup_request.id).to eq "123456"
|
80
|
+
expect(pickup_request.carrier_pickup_number).to eq "abcdef"
|
81
|
+
end
|
82
|
+
|
83
|
+
it "returns a pickup_address" do
|
84
|
+
allow(Shipcloud).to receive(:request).
|
85
|
+
and_return(
|
86
|
+
"id" => "123456",
|
87
|
+
"carrier_pickup_number" => "abcdef",
|
88
|
+
"carrier" => "dpd",
|
89
|
+
"pickup_time" => {
|
90
|
+
"earliest" => "2015-09-15T09:00:00+02:00",
|
91
|
+
"latest" => "2015-09-15T18:00:00+02:00"
|
92
|
+
},
|
93
|
+
"pickup_address" => {
|
94
|
+
"id" => "522a7cb1-d6c8-418c-ac26-011127ab5bbe",
|
95
|
+
"company" => "Muster-Company",
|
96
|
+
"first_name" => "Max",
|
97
|
+
"last_name" => "Mustermann",
|
98
|
+
"street" => "Musterstraße",
|
99
|
+
"street_no" => "42",
|
100
|
+
"zip_code" => "54321",
|
101
|
+
"city" => "Musterstadt",
|
102
|
+
"country" => "DE",
|
103
|
+
"phone" => "555-555"
|
104
|
+
}
|
105
|
+
)
|
106
|
+
|
107
|
+
pickup_request = Shipcloud::PickupRequest.create(valid_attributes_with_pickup_address)
|
108
|
+
|
109
|
+
expect(pickup_request.pickup_address).to eq(
|
110
|
+
"id" => "522a7cb1-d6c8-418c-ac26-011127ab5bbe",
|
111
|
+
"company" => "Muster-Company",
|
112
|
+
"first_name" => "Max",
|
113
|
+
"last_name" => "Mustermann",
|
114
|
+
"street" => "Musterstraße",
|
115
|
+
"street_no" => "42",
|
116
|
+
"zip_code" => "54321",
|
117
|
+
"city" => "Musterstadt",
|
118
|
+
"country" => "DE",
|
119
|
+
"phone" => "555-555"
|
120
|
+
)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
describe Shipcloud::Request::Info do
|
5
|
+
describe "#url" do
|
6
|
+
it "returns the correct url" do
|
7
|
+
info = Shipcloud::Request::Info.new(:get, "shipments", "api_key", {})
|
8
|
+
|
9
|
+
expect(info.url).to eq "/v1/shipments"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "#path_with_params" do
|
14
|
+
it "returns just the path if there aren't any params" do
|
15
|
+
info = Shipcloud::Request::Info.new(:get, "shipments", "api_key", {})
|
16
|
+
path = info.path_with_params(info.url, info.data)
|
17
|
+
|
18
|
+
expect(path).to eq "/v1/shipments"
|
19
|
+
end
|
20
|
+
|
21
|
+
it "returns the path and given params" do
|
22
|
+
info = Shipcloud::Request::Info.new(:get, "shipments", "api_key", foo: "bar")
|
23
|
+
path = info.path_with_params(info.url, info.data)
|
24
|
+
|
25
|
+
expect(path).to eq "/v1/shipments?foo=bar"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -18,6 +18,15 @@ describe Shipcloud::Shipment do
|
|
18
18
|
length: 40,
|
19
19
|
width: 20,
|
20
20
|
height: 20
|
21
|
+
},
|
22
|
+
metadata: {
|
23
|
+
product: {
|
24
|
+
name: "foo"
|
25
|
+
},
|
26
|
+
category: {
|
27
|
+
id: "123456",
|
28
|
+
name: "bar"
|
29
|
+
}
|
21
30
|
}
|
22
31
|
}
|
23
32
|
end
|
@@ -43,6 +52,20 @@ describe Shipcloud::Shipment do
|
|
43
52
|
expect(shipment.package[:width]).to eq 20
|
44
53
|
expect(shipment.package[:height]).to eq 20
|
45
54
|
end
|
55
|
+
|
56
|
+
it "initializes the metadata correctly" do
|
57
|
+
metadata = {
|
58
|
+
category: {
|
59
|
+
id: "123456",
|
60
|
+
name: "bar"
|
61
|
+
},
|
62
|
+
product: {
|
63
|
+
name: "foo"
|
64
|
+
}
|
65
|
+
}
|
66
|
+
|
67
|
+
expect(shipment.metadata).to eq metadata
|
68
|
+
end
|
46
69
|
end
|
47
70
|
|
48
71
|
describe ".create" do
|
@@ -75,6 +98,13 @@ describe Shipcloud::Shipment do
|
|
75
98
|
and_return(true)
|
76
99
|
Shipcloud::Shipment.delete("123")
|
77
100
|
end
|
101
|
+
|
102
|
+
it "doesn't raise an error" do
|
103
|
+
stub_request(:delete, "https://your-api-key:@api.shipcloud.io/v1/shipments/123").
|
104
|
+
to_return(status: 204, body: "")
|
105
|
+
expect { Shipcloud::Shipment.delete("123", api_key: "your-api-key") }.
|
106
|
+
to_not raise_error
|
107
|
+
end
|
78
108
|
end
|
79
109
|
|
80
110
|
describe ".all" do
|