aftership 4.2.0 → 4.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 816eea3c35b379b4e3cd340278f68a0dcc2ae22d
4
- data.tar.gz: 1dfdcd5fd8dc6f96dc8f882c61f0431369cbce52
3
+ metadata.gz: 33d125b2602fb4ff8ed57a35cabd4b17b0e9dcfd
4
+ data.tar.gz: f7ecbfeb91774048f79a1b6b9bed8b18267081bb
5
5
  SHA512:
6
- metadata.gz: 5011017ab482f439d9a7aee133435186d0f162968d7d402326e56c3e8f94b82f2da049c8b4a3f8af72be57e6017f09ba641f466f8fda55877176fa56c6258d73
7
- data.tar.gz: 71e62ff576f7f1b0d813bc80381be1da891ad1a9878918c3b57eb795389c8575952e300327847d20475acf3f01c59f93d3cf70a8f9760bcd2ee976f8b99b5de7
6
+ metadata.gz: 837f6d803d6d1e82a7245871ffaecb0f7c1e01cf67d117f980bb9bfe7237359e373438662984486cfeed9f09284e64cc56279518137578fcdd4c454789c1ecad
7
+ data.tar.gz: ba8d921f5ef3cc54662d10afa5c230ce8e5aaafd36bb954f70ecafd4310c25c6d4a2ee3f5e5dbd945fd8d953e60ff0034e7ab851daf61e30c3358b4c92cd2505
data/README.md CHANGED
@@ -9,6 +9,11 @@ This extension helps developers to integrate with AfterShip easily.
9
9
  AfterShip provides an automated way for online merchants to track packages and send their customers delivery status notifications. Customers no longer need to deal with tracking numbers and track packages on their own. With AfterShip, online merchants extend their customer service after the point of purchase by keeping their customers actively informed, while saving time and money by reducing customers’ questions about the status of their purchase delivery.
10
10
 
11
11
  ### Changes
12
+ * 2015-12-14 4.3.0
13
+ - Added rescue methods for parsing JSON, and try to retrieve error codes from cloudflare
14
+ - Added /trackings/exports method
15
+ - Added auto-retry mechanism if invalid JSON response retrieved
16
+
12
17
  * 2015-11-11 Pump version to 4.2.0
13
18
  - Removed v3 code, support ENV variable AFTERSHIP_API_ENDPOINT for testing
14
19
 
@@ -2,46 +2,91 @@ require 'httpclient'
2
2
  require 'json'
3
3
 
4
4
  module AfterShip
5
- module V4
6
- class Base
7
- class AfterShipError < StandardError;
8
- end
9
- attr_reader :http_verb_method, :end_point, :query, :body
5
+ module V4
6
+ class Base
7
+ class AfterShipError < StandardError;
8
+ end
9
+ attr_reader :http_verb_method, :end_point, :query, :body
10
10
 
11
- def initialize(http_verb_method, end_point, query = {}, body = {})
12
- @http_verb_method = http_verb_method
13
- @end_point = end_point
14
- @query = query
15
- @body = body
11
+ MAX_TRIAL = 3
12
+ CALL_SLEEP = 3
16
13
 
17
- @client = HTTPClient.new
18
- end
14
+ def initialize(http_verb_method, end_point, query = {}, body = {})
15
+ @http_verb_method = http_verb_method
16
+ @end_point = end_point
17
+ @query = query
18
+ @body = body
19
+ @trial = 0
19
20
 
20
- def call
21
- header = {'aftership-api-key' => AfterShip.api_key, 'Content-Type' => 'application/json'}
21
+ @client = HTTPClient.new
22
+ end
22
23
 
23
- parameters = {
24
- :query => query,
25
- :body => body.to_json,
26
- :header => header
27
- }
24
+ def call
28
25
 
29
- response = @client.send(http_verb_method, url, parameters)
26
+ header = {'aftership-api-key' => AfterShip.api_key, 'Content-Type' => 'application/json'}
30
27
 
31
- if response.body
32
- JSON.parse(response.body)
33
- else
34
- raise(AfterShipError.new('response is nil'))
35
- end
28
+ parameters = {
29
+ :query => query,
30
+ :body => body.to_json,
31
+ :header => header
32
+ }
36
33
 
37
- end
34
+ cf_ray = ''
35
+ response = nil
38
36
 
39
- private
37
+ loop do
38
+ response = @client.send(http_verb_method, url, parameters)
40
39
 
41
- def url
42
- "#{AfterShip::URL}/v4/#{end_point.to_s}"
43
- end
40
+ if response.headers
41
+ cf_ray = response.headers['CF-RAY']
42
+ end
44
43
 
45
- end
46
- end
44
+
45
+ if response.body
46
+ begin
47
+ response = JSON.parse(response.body)
48
+ @trial = MAX_TRIAL + 1
49
+ rescue
50
+ @trial += 1
51
+
52
+ sleep CALL_SLEEP
53
+
54
+ response = {
55
+ :meta => {
56
+ :code => 500,
57
+ :message => 'Something went wrong on AfterShip\'s end.',
58
+ :type => 'InternalError'
59
+ },
60
+ :data => {
61
+ :body => response.body,
62
+ :cf_ray => cf_ray
63
+ }
64
+ }
65
+ end
66
+ else
67
+ response = {
68
+ :meta => {
69
+ :code => 500,
70
+ :message => 'Something went wrong on AfterShip\'s end.',
71
+ :type => 'InternalError'
72
+ },
73
+ :data => {
74
+ }
75
+ }
76
+ end
77
+
78
+ break if @trial > MAX_TRIAL
79
+ end
80
+
81
+ response
82
+ end
83
+
84
+ private
85
+
86
+ def url
87
+ "#{AfterShip::URL}/v4/#{end_point.to_s}"
88
+ end
89
+
90
+ end
91
+ end
47
92
  end
@@ -1,30 +1,30 @@
1
1
  require File.dirname(__FILE__) + '/base'
2
2
 
3
3
  module AfterShip
4
- module V4
5
- class Courier < AfterShip::V4::Base
4
+ module V4
5
+ class Courier < AfterShip::V4::Base
6
6
 
7
- #GET /couriers
8
- #Return a list of couriers activated at your AfterShip account.
9
- def self.get
10
- new(:get, 'couriers').call
11
- end
7
+ #GET /couriers
8
+ #Return a list of couriers activated at your AfterShip account.
9
+ def self.get
10
+ new(:get, 'couriers').call
11
+ end
12
12
 
13
- #GET /couriers/all
14
- #Return a list of all couriers.
15
- def self.get_all
16
- new(:get, 'couriers/all').call
17
- end
13
+ #GET /couriers/all
14
+ #Return a list of all couriers.
15
+ def self.get_all
16
+ new(:get, 'couriers/all').call
17
+ end
18
18
 
19
- #POST /couriers/detect
20
- #Return a list of matched couriers based on tracking number format and selected couriers or a list of couriers.
21
- def self.detect(tracking = nil)
22
- if tracking == nil
23
- raise ArgumentError.new('tracking object is required.')
24
- else
25
- new(:post, 'couriers/detect', {}, {:tracking => tracking}).call
26
- end
27
- end
28
- end
29
- end
19
+ #POST /couriers/detect
20
+ #Return a list of matched couriers based on tracking number format and selected couriers or a list of couriers.
21
+ def self.detect(tracking = nil)
22
+ if tracking == nil
23
+ raise ArgumentError.new('tracking object is required.')
24
+ else
25
+ new(:post, 'couriers/detect', {}, {:tracking => tracking}).call
26
+ end
27
+ end
28
+ end
29
+ end
30
30
  end
@@ -1,17 +1,17 @@
1
1
  require File.dirname(__FILE__) + '/base'
2
2
 
3
3
  module AfterShip
4
- module V4
5
- class LastCheckpoint < AfterShip::V4::Base
4
+ module V4
5
+ class LastCheckpoint < AfterShip::V4::Base
6
6
 
7
- def self.get(slug = '', tracking_number = '')
8
- if slug.empty? || tracking_number.empty?
9
- raise ArgumentError.new('slug and tracking_number are required.')
10
- else
11
- new(:get, "last_checkpoint/#{slug}/#{tracking_number}").call
12
- end
13
- end
7
+ def self.get(slug = '', tracking_number = '')
8
+ if slug.empty? || tracking_number.empty?
9
+ raise ArgumentError.new('slug and tracking_number are required.')
10
+ else
11
+ new(:get, "last_checkpoint/#{slug}/#{tracking_number}").call
12
+ end
13
+ end
14
14
 
15
- end
16
- end
15
+ end
16
+ end
17
17
  end
@@ -1,80 +1,85 @@
1
1
  require File.dirname(__FILE__) + '/base'
2
2
 
3
3
  module AfterShip
4
- module V4
5
- class Tracking < AfterShip::V4::Base
4
+ module V4
5
+ class Tracking < AfterShip::V4::Base
6
6
 
7
- #POST /trackings
8
- def self.create(tracking_number, params = {})
9
- if tracking_number.blank?
10
- raise ArgumentError.new('tracking_number is required.')
11
- else
12
- query_hash = {:tracking_number => tracking_number}
13
- query_hash.merge!(params)
14
- body = {:tracking => query_hash}
15
- new(:post, 'trackings', {}, body).call
16
- end
17
- end
7
+ #POST /trackings
8
+ def self.create(tracking_number, params = {})
9
+ if tracking_number.empty? || tracking_number.nil?
10
+ raise ArgumentError.new('tracking_number is required.')
11
+ else
12
+ query_hash = {:tracking_number => tracking_number}
13
+ query_hash.merge!(params)
14
+ body = {:tracking => query_hash}
15
+ new(:post, 'trackings', {}, body).call
16
+ end
17
+ end
18
18
 
19
- #POST /trackings/:slug/:tracking_number/retrack
20
- def self.retrack(slug, tracking_number)
21
- if slug.blank? || tracking_number.blank?
22
- raise ArgumentError.new('slug and tracking_number are required.')
23
- end
24
- new(:post, "trackings/#{slug}/#{tracking_number}/retrack").call
25
- end
19
+ #POST /trackings/:slug/:tracking_number/retrack
20
+ def self.retrack(slug, tracking_number)
21
+ if slug.empty? || slug.nil? || tracking_number.empty? || tracking_number.nil?
22
+ raise ArgumentError.new('slug and tracking_number are required.')
23
+ end
24
+ new(:post, "trackings/#{slug}/#{tracking_number}/retrack").call
25
+ end
26
26
 
27
- #DELETE /trackings/:slug/:tracking_number
28
- def self.delete(slug, tracking_number)
29
- if slug.blank? || tracking_number.blank?
30
- raise ArgumentError.new('slug and tracking_number are required.')
31
- end
32
- new(:delete, "trackings/#{slug}/#{tracking_number}").call
33
- end
34
-
35
- #DELETE /trackings/:id
36
- def self.delete_by_id(id)
37
- if id.empty?
38
- raise ArgumentError.new('id is required.')
39
- end
40
- new(:delete, "trackings/#{id}").call
41
- end
27
+ #DELETE /trackings/:slug/:tracking_number
28
+ def self.delete(slug, tracking_number)
29
+ if slug.empty? || slug.nil? || tracking_number.empty? || tracking_number.nil?
30
+ raise ArgumentError.new('slug and tracking_number are required.')
31
+ end
32
+ new(:delete, "trackings/#{slug}/#{tracking_number}").call
33
+ end
42
34
 
43
- #GET /trackings/:slug/:tracking_number
44
- def self.get(slug, tracking_number, params = {})
45
- if slug.blank? || tracking_number.blank?
46
- raise ArgumentError.new('slug and tracking_number are required.')
47
- end
48
- new(:get, "trackings/#{slug}/#{tracking_number}", params).call
49
- end
35
+ #DELETE /trackings/:id
36
+ def self.delete_by_id(id)
37
+ if id.empty? || id.nil?
38
+ raise ArgumentError.new('id is required.')
39
+ end
40
+ new(:delete, "trackings/#{id}").call
41
+ end
50
42
 
51
- #GET /trackings/:id
52
- def self.get_by_id(id, params = {})
53
- if id.blank?
54
- raise ArgumentError.new('id is required.')
55
- end
56
- new(:get, "trackings/#{id}", params).call
57
- end
43
+ #GET /trackings/:slug/:tracking_number
44
+ def self.get(slug, tracking_number, params = {})
45
+ if slug.empty? || slug.nil? || tracking_number.empty? || tracking_number.nil?
46
+ raise ArgumentError.new('slug and tracking_number are required.')
47
+ end
48
+ new(:get, "trackings/#{slug}/#{tracking_number}", params).call
49
+ end
58
50
 
59
- #GET /trackings
60
- def self.get_all(params = {})
61
- new(:get, 'trackings', params).call
62
- end
51
+ #GET /trackings/:id
52
+ def self.get_by_id(id, params = {})
53
+ if id.empty? || id.nil?
54
+ raise ArgumentError.new('id is required.')
55
+ end
56
+ new(:get, "trackings/#{id}", params).call
57
+ end
63
58
 
64
- #PUT /trackings/:slug/:tracking_number
65
- def self.update(slug, tracking_number, params = {})
66
- if slug.blank? || tracking_number.blank?
67
- raise ArgumentError.new('slug and tracking_number are required.')
68
- end
69
- body = {:tracking => params}
70
- new(:put, "trackings/#{slug}/#{tracking_number}", {}, body).call
71
- end
59
+ #GET /trackings
60
+ def self.get_all(params = {})
61
+ new(:get, 'trackings', params).call
62
+ end
72
63
 
73
- #Deprecated
74
- #POST /trackings/:slug/:tracking_number/reactivate
75
- def self.reactivate(slug, tracking_number)
76
- raise StandardError.new('This method is deprecated, please use "retrack" instead')
77
- end
78
- end
79
- end
64
+ #GET /trackings/exports
65
+ def self.export(params = {})
66
+ new(:get, 'trackings/exports', params).call
67
+ end
68
+
69
+ #PUT /trackings/:slug/:tracking_number
70
+ def self.update(slug, tracking_number, params = {})
71
+ if slug.empty? || slug.nil? || tracking_number.empty? || tracking_number.nil?
72
+ raise ArgumentError.new('slug and tracking_number are required.')
73
+ end
74
+ body = {:tracking => params}
75
+ new(:put, "trackings/#{slug}/#{tracking_number}", {}, body).call
76
+ end
77
+
78
+ #Deprecated
79
+ #POST /trackings/:slug/:tracking_number/reactivate
80
+ def self.reactivate(slug, tracking_number)
81
+ raise StandardError.new('This method is deprecated, please use "retrack" instead')
82
+ end
83
+ end
84
+ end
80
85
  end
metadata CHANGED
@@ -1,55 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aftership
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.2.0
4
+ version: 4.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - AfterShip Limited
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-11 00:00:00.000000000 Z
11
+ date: 2015-12-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httpclient
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: 2.5.2
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 2.5.2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rspec
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: 2.14.1
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: 2.14.1
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: pry
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  description: Developed for easy integration with AfterShip
@@ -59,12 +59,12 @@ executables: []
59
59
  extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
+ - README.md
63
+ - lib/aftership.rb
62
64
  - lib/aftership/v4/base.rb
63
65
  - lib/aftership/v4/courier.rb
64
66
  - lib/aftership/v4/last_checkpoint.rb
65
67
  - lib/aftership/v4/tracking.rb
66
- - lib/aftership.rb
67
- - README.md
68
68
  homepage: https://www.aftership.com
69
69
  licenses:
70
70
  - MIT
@@ -75,18 +75,18 @@ require_paths:
75
75
  - lib
76
76
  required_ruby_version: !ruby/object:Gem::Requirement
77
77
  requirements:
78
- - - '>='
78
+ - - ">="
79
79
  - !ruby/object:Gem::Version
80
80
  version: 1.8.7
81
81
  required_rubygems_version: !ruby/object:Gem::Requirement
82
82
  requirements:
83
- - - '>='
83
+ - - ">="
84
84
  - !ruby/object:Gem::Version
85
85
  version: '0'
86
86
  requirements:
87
87
  - none
88
88
  rubyforge_project:
89
- rubygems_version: 2.0.14
89
+ rubygems_version: 2.2.2
90
90
  signing_key:
91
91
  specification_version: 4
92
92
  summary: Formerly known as aftership_ruby and a wrapper for AfterShip API. Support