after_ship 0.0.2 → 0.0.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 43ff39d94f11902c3bfc5a7acfc36fc4092d5c5a
4
- data.tar.gz: bab1423202559d88d3341bf209a002a85e9df8d4
3
+ metadata.gz: 3060bd34a3212af9a3fc8d11f6639218eb721a21
4
+ data.tar.gz: 6cc52a30fd7414efb6cfe67a91dd1823191bda4d
5
5
  SHA512:
6
- metadata.gz: 3aff898828a87d686b144230382a77f21b68f0a324830be48dfe1ba87ef1b919aa97a9e420bd3e23501cefc00e0701637b49f416dcf9a0ebcc194db25a31e686
7
- data.tar.gz: ecc0ca8bcd619d082eb59fa7ec8a52f927fd1d1c30c4a007999a57e27fab92c9bbb783f56b3ee4140e66ce43a8e8b14374371ba57e57fd7609175fe73f9df9f2
6
+ metadata.gz: a40b8f5a968c21b2c61fbe139c729ced7fd0d4ea66930fb1d8fbece394bdf0504d009e20b1d0090fe1cb7083119220230c57d607ac24eeaef0bfbd19efa1054d
7
+ data.tar.gz: 3bf32a786e3dcd6846363fa46035b67855aa312b46ff804c81570e73b4e07737bc11f6fe8aa9bc5cb59d559424f438e6d7f93a515cc4fd74faa899318b284684
data/.travis.yml CHANGED
@@ -1,7 +1,7 @@
1
1
  language: ruby
2
2
 
3
3
  rvm:
4
- - 2.1.2
4
+ - 2.1.5
5
5
  - 1.9.3
6
6
  - jruby-19mode
7
7
 
data/README.md CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  [![Build Status](https://travis-ci.org/ollie/after_ship.svg?branch=master)](https://travis-ci.org/ollie/after_ship)
4
4
 
5
- A smallish library to talking to AfterShip via v3 API.
5
+ A smallish library to talking to AfterShip via v4 API.
6
6
 
7
- You will need an AfterShip API key, see here https://www.aftership.com/docs/api/3.0.
7
+ You will need an AfterShip API key, see here https://www.aftership.com/docs/api/4.
8
8
  The JSON is parsed by MultiJson (https://github.com/intridea/multi_json) so
9
9
  you may want to drop in your favorite JSON engine.
10
10
 
@@ -29,7 +29,7 @@ client = AfterShip.new(api_key: 'your-aftership-api-key')
29
29
  ```
30
30
 
31
31
  Get a list of trackings
32
- https://www.aftership.com/docs/api/3.0/tracking/get-trackings
32
+ https://www.aftership.com/docs/api/4/trackings/get-trackings
33
33
 
34
34
  ```ruby
35
35
  client.trackings
@@ -44,75 +44,112 @@ client.trackings
44
44
  ```
45
45
 
46
46
  Get a tracking
47
- https://www.aftership.com/docs/api/3.0/tracking/get-trackings-slug-tracking_number
47
+ https://www.aftership.com/docs/api/4/trackings/get-trackings-slug-tracking_number
48
48
 
49
49
  ```ruby
50
50
  client.tracking('tracking-number', 'ups')
51
51
 
52
- # Will return Tracking object or raise AfterShip::ResourceNotFoundError
53
- # if not exists:
52
+ # Will return Tracking object or raise AfterShip::Error::NotFound:
54
53
 
55
- #<AfterShip::Tracking:0x007fe555bd9560
54
+ #<AfterShip::Tracking:0x007f838ef44e58
56
55
  @active=false,
56
+ @android=[],
57
57
  @courier="UPS",
58
- @created_at=#<DateTime: 2014-05-08T15:25:01+00:00 ((2456786j,55501s,0n),+0s,2299161j)>,
59
- @updated_at=#<DateTime: 2014-07-18T09:00:47+00:00 ((2456857j,32447s,0n),+0s,2299161j)>>
58
+ @created_at=#<DateTime: 2014-11-19T15:16:17+00:00 ...>,
60
59
  @custom_fields={},
61
60
  @customer_name=nil,
61
+ @delivery_time=8,
62
62
  @destination_country_iso3="USA",
63
63
  @emails=[],
64
64
  @expected_delivery=nil,
65
- @order_id="PL-12480166",
65
+ @id="546cb4414a1a2097122ae7b1",
66
+ @ios=[],
67
+ @order_id="PL-66448782",
66
68
  @order_id_path=nil,
67
69
  @origin_country_iso3="IND",
68
- @shipment_package_count=0,
69
- @shipment_type="EXPEDITED",
70
- @signed_by="FRONT DOOR",
70
+ @shipment_package_count=1,
71
+ @shipment_type="UPS SAVER",
72
+ @shipment_weight=0.5,
73
+ @shipment_weight_unit="kg",
74
+ @signed_by="MET CUSTOM",
71
75
  @slug="ups",
72
76
  @smses=[],
73
77
  @source="api",
74
78
  @status="Delivered",
75
79
  @tag="Delivered",
76
- @title="1ZA2207X6790326683",
77
- @tracked_count=47,
78
- @tracking_number="1ZA2207X6790326683",
79
- @unique_token="ly9ueXUJC",
80
+ @title="1ZA2207X0490715335",
81
+ @tracked_count=6,
82
+ @tracking_account_number=nil,
83
+ @tracking_number="1ZA2207X0490715335",
84
+ @tracking_postal_code=nil,
85
+ @tracking_ship_date=nil,
86
+ @unique_token="-y6ziF438",
87
+ @updated_at=#<DateTime: 2014-11-19T22:12:32+00:00 ...>,
80
88
  @checkpoints=[
81
- #<AfterShip::Checkpoint:0x007fe555bb0340
82
- @checkpoint_time=#<DateTime: 2014-05-12T14:07:00+00:00 ((2456790j,50820s,0n),+0s,2299161j)>,
83
- @city="NEW YORK",
89
+ #<AfterShip::Checkpoint:0x007f838ef57d50
90
+ @checkpoint_time=
91
+ #<DateTime: 2014-11-11T19:12:00+00:00 ...>,
92
+ @city="MUMBAI",
84
93
  @country_iso3=nil,
85
- @country_name="US",
94
+ @country_name="IN",
86
95
  @courier="UPS",
87
- @created_at=#<DateTime: 2014-05-12T18:34:32+00:00 ((2456790j,66872s,0n),+0s,2299161j)>,
88
- @message="DELIVERED",
96
+ @created_at=
97
+ #<DateTime: 2014-11-19T15:16:17+00:00 ...>,
98
+ @message="PICKUP SCAN",
89
99
  @slug="ups",
90
- @state="NY",
91
- @status="Delivered",
92
- @tag="Delivered",
93
- @zip="10075">
100
+ @state=nil,
101
+ @status="In Transit",
102
+ @tag="InTransit",
103
+ @zip=nil>,
94
104
  #<AfterShip::Checkpoint ...>,
95
105
  ...
96
- ]>
106
+ ]
107
+ >
97
108
  ```
98
109
 
99
110
  Create a new tracking
100
- https://www.aftership.com/docs/api/3.0/tracking/post-trackings
111
+ https://www.aftership.com/docs/api/4/trackings/post-trackings
101
112
 
102
113
  ```ruby
103
114
  client.create_tracking('tracking-number', 'ups', order_id: 'external-id')
104
115
 
105
- # Will return Tracking object or raise AfterShip::InvalidArgumentError
106
- # if it exists:
116
+ # Will return Tracking object or raise
117
+ # AfterShip::Error::TrackingAlreadyExists:
107
118
 
108
119
  #<AfterShip::Tracking ...>
109
120
  ```
110
121
 
111
122
  Update a tracking
112
- https://www.aftership.com/docs/api/3.0/tracking/put-trackings-slug-tracking_number
123
+ https://www.aftership.com/docs/api/4/trackings/put-trackings-slug-tracking_number
113
124
 
114
125
  ```ruby
115
126
  client.update_tracking('tracking-number', 'ups', order_id: 'external-id')
127
+
128
+ # Will return Tracking object or raise
129
+ # AfterShip::Error::TrackingAlreadyExists:
130
+
131
+ #<AfterShip::Tracking ...>
132
+ ```
133
+
134
+ Get activated couriers
135
+ https://www.aftership.com/docs/api/4/couriers/get-couriers
136
+
137
+ ```ruby
138
+ client.couriers
139
+
140
+ # Will return list of Courier objects:
141
+
142
+ [
143
+ #<AfterShip::Courier:0x007fa2771d4bf8
144
+ @name="USPS",
145
+ @other_name="United States Postal Service",
146
+ @phone="+1 800-275-8777",
147
+ @required_fields=[],
148
+ @slug="usps",
149
+ @web_url="https://www.usps.com">,
150
+ #<AfterShip::Courier ...>
151
+ ...
152
+ ]
116
153
  ```
117
154
 
118
155
  ## Contributing
data/after_ship.gemspec CHANGED
@@ -1,14 +1,14 @@
1
1
  # coding: utf-8
2
2
  lib = File.expand_path('../lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'after_ship/version'
4
+ require 'after_ship/core/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = 'after_ship'
8
8
  spec.version = AfterShip::VERSION
9
9
  spec.authors = ['Oldrich Vetesnik']
10
10
  spec.email = ['oldrich.vetesnik@gmail.com']
11
- spec.summary = 'A smallish library to talking to AfterShip via v3 API.'
11
+ spec.summary = 'A smallish library to talking to AfterShip via v4 API.'
12
12
  spec.homepage = 'https://github.com/ollie/after_ship'
13
13
  spec.license = 'MIT'
14
14
 
@@ -22,11 +22,11 @@ Gem::Specification.new do |spec|
22
22
 
23
23
  # Test
24
24
  spec.add_development_dependency 'rspec', '~> 3.1'
25
- spec.add_development_dependency 'webmock', '~> 1.19'
25
+ spec.add_development_dependency 'webmock', '~> 1.20'
26
26
  spec.add_development_dependency 'simplecov', '~> 0.9'
27
27
 
28
28
  # Code style, debugging, docs
29
- spec.add_development_dependency 'rubocop', '~> 0.26'
29
+ spec.add_development_dependency 'rubocop', '~> 0.27'
30
30
  spec.add_development_dependency 'pry', '~> 0.10'
31
31
  spec.add_development_dependency 'yard', '~> 0.8'
32
32
  spec.add_development_dependency 'rake', '~> 10.3'
@@ -1,42 +1,48 @@
1
1
  class AfterShip
2
2
  # Wrapper object for AfterShip tracking checkpoint:
3
- # https://www.aftership.com/docs/api/3.0/tracking/get-trackings-slug-tracking_number
3
+ # https://www.aftership.com/docs/api/4/trackings/get-trackings-slug-tracking_number
4
4
  class Checkpoint
5
5
  include Attributes
6
6
 
7
- # Tracking number, e.g. +1ZA2207X6794165804+.
7
+ # Date and time of the tracking created.
8
8
  #
9
9
  # Should always be available.
10
10
  #
11
- # @return [String]
12
- attr_reader :slug
11
+ # @return [DateTime]
12
+ attr_reader :created_at
13
13
 
14
- # Location info (if any)
14
+ # The unique code of courier for this checkpoint message.
15
15
  #
16
- # May be empty.
16
+ # Should always be available.
17
17
  #
18
18
  # @return [String]
19
- attr_accessor :city
19
+ attr_reader :slug
20
20
 
21
- # Courier name
21
+ # Courier name.
22
+ #
23
+ # Custom method!
22
24
  #
23
25
  # @return [String]
24
26
  attr_accessor :courier
25
27
 
26
- # Date and time of the tracking created.
28
+ # Date and time of the checkpoint, provided by courier.
29
+ #
30
+ # Empty String,
31
+ # YYYY-MM-DD,
32
+ # YYYY-MM-DDTHH:MM:SS, or
33
+ # YYYY-MM-DDTHH:MM:SS+TIMEZONE.
27
34
  #
28
35
  # Should always be available.
29
36
  #
30
37
  # @return [DateTime]
31
- attr_reader :created_at
38
+ attr_reader :checkpoint_time
32
39
 
33
- # Country name of the checkpoint, may also contain other location info.
34
- # Seems to be Alpha-2 code, e.g. +IN+, +DE+.
40
+ # Location info (if any).
35
41
  #
36
42
  # May be empty.
37
43
  #
38
44
  # @return [String]
39
- attr_accessor :country_name
45
+ attr_accessor :city
40
46
 
41
47
  # Country ISO Alpha-3 (three letters) of the checkpoint.
42
48
  #
@@ -45,6 +51,14 @@ class AfterShip
45
51
  # @return [String]
46
52
  attr_accessor :country_iso3
47
53
 
54
+ # Country name of the checkpoint, may also contain other location info.
55
+ # Seems to be Alpha-2 code, e.g. +IN+, +DE+.
56
+ #
57
+ # May be empty.
58
+ #
59
+ # @return [String]
60
+ attr_accessor :country_name
61
+
48
62
  # Checkpoint message
49
63
  #
50
64
  # Should always be available.
@@ -52,6 +66,13 @@ class AfterShip
52
66
  # @return [String]
53
67
  attr_accessor :message
54
68
 
69
+ # Location info (if any).
70
+ #
71
+ # May be empty.
72
+ #
73
+ # @return [String]
74
+ attr_accessor :state
75
+
55
76
  # Status of the checkpoint.
56
77
  #
57
78
  # Should always be available.
@@ -73,20 +94,6 @@ class AfterShip
73
94
  # @return [String]
74
95
  attr_accessor :status
75
96
 
76
- # Date and time of the checkpoint, provided by courier.
77
- #
78
- # Should always be available.
79
- #
80
- # @return [DateTime]
81
- attr_reader :checkpoint_time
82
-
83
- # Location info (if any).
84
- #
85
- # May be empty.
86
- #
87
- # @return [String]
88
- attr_accessor :state
89
-
90
97
  # Location info (if any).
91
98
  #
92
99
  # May be empty.
@@ -101,7 +108,7 @@ class AfterShip
101
108
  load_attributes(data)
102
109
  end
103
110
 
104
- # Tracking number, e.g. +1ZA2207X6794165804+.
111
+ # The unique code of courier for this checkpoint message.
105
112
  #
106
113
  # Should always be available.
107
114
  #
@@ -0,0 +1,14 @@
1
+ class AfterShip
2
+ # Extracted attributes loading.
3
+ module Attributes
4
+ # Loop through the data hash and for each key call a setter with the value.
5
+ #
6
+ # @param data [Hash]
7
+ def load_attributes(data)
8
+ data.each do |attribute, value|
9
+ setter = "#{ attribute }="
10
+ send(setter, value) if respond_to?(setter)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,76 @@
1
+ class AfterShip
2
+ # Simple utility class for parsing dates and datetimes.
3
+ module DateUtils
4
+ module_function
5
+
6
+ # Date:
7
+ #
8
+ # +YYYYMMDD+
9
+ DATE_PLAIN_REGEX = /
10
+ \A
11
+ \d{4}\d{2}\d{2}
12
+ \z
13
+ /x
14
+
15
+ # Date:
16
+ #
17
+ # +YYYY-MM-DD+
18
+ DATE_REGEX = /
19
+ \A
20
+ \d{4}-\d{2}-\d{2}
21
+ \z
22
+ /x
23
+
24
+ # Datetime without zone:
25
+ #
26
+ # +YYYY-MM-DDTHH:MM:SS+
27
+ DATETIME_REGEX = /
28
+ \A
29
+ \d{4}-\d{2}-\d{2}
30
+ T
31
+ \d{2}:\d{2}:\d{2}
32
+ \z
33
+ /x
34
+
35
+ # Datetime with zone:
36
+ #
37
+ # +YYYY-MM-DDTHH:MM:SSZ+
38
+ # +YYYY-MM-DDTHH:MM:SS+HH:MM+
39
+ # +YYYY-MM-DDTHH:MM:SS-HH:MM+
40
+ DATETIME_WITH_ZONE_REGEX = /
41
+ \A
42
+ \d{4}-\d{2}-\d{2}
43
+ T
44
+ \d{2}:\d{2}:\d{2}
45
+ (Z|[+-]\d{2}:\d{2})
46
+ \z
47
+ /x
48
+
49
+ # Try to parse a date or datetime from a string.
50
+ #
51
+ # @param value [String]
52
+ # Empty String,
53
+ # YYYY-MM-DD,
54
+ # YYYY-MM-DDTHH:MM:SS,
55
+ # YYYY-MM-DDTHH:MM:SSZ,
56
+ # YYYY-MM-DDTHH:MM:SS+HH:MM or
57
+ # YYYY-MM-DDTHH:MM:SS-HH:MM.
58
+ #
59
+ def parse(value)
60
+ case value
61
+ when ''
62
+ nil
63
+ when nil
64
+ nil
65
+ when DATE_PLAIN_REGEX
66
+ Date.parse(value)
67
+ when DATE_REGEX
68
+ Date.parse(value)
69
+ when DATETIME_REGEX, DATETIME_WITH_ZONE_REGEX
70
+ DateTime.parse(value)
71
+ else
72
+ fail ArgumentError, "Invalid expected_delivery date #{ value.inspect }"
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,29 @@
1
+ class AfterShip
2
+ # Error classes.
3
+ # https://www.aftership.com/docs/api/4/errors
4
+ class Error < StandardError
5
+ class BadRequest < Error; end # 400
6
+ class InvalidJsonData < BadRequest; end # 4001, 4002
7
+ class TrackingAlreadyExists < BadRequest; end # 4003
8
+ class TrackingDoesNotExist < BadRequest; end # 4004
9
+ class TrackingNumberInvalid < BadRequest; end # 4005
10
+ class TrackingObjectRequired < BadRequest; end # 4006
11
+ class TrackingNumberRequired < BadRequest; end # 4007
12
+ class FieldInvalid < BadRequest; end # 4008
13
+ class FieldRequired < BadRequest; end # 4009
14
+ class SlugInvalid < BadRequest; end # 4010
15
+ class CourierFieldInvalid < BadRequest; end # 4011
16
+ class CourierNotDetected < BadRequest; end # 4012
17
+ class RetrackNotAllowed < BadRequest; end # 4013, 4016
18
+ class NotificationRequired < BadRequest; end # 4014
19
+ class IdInvalid < BadRequest; end # 4015
20
+ class Unauthorized < Error; end # 401
21
+ class Forbidden < Error; end # 403
22
+ class NotFound < Error; end # 404
23
+ class TooManyRequests < Error; end # 429
24
+ class InternalError < Error; end # 500, 502, 503, 504
25
+
26
+ class UnknownError < Error; end # Huh?
27
+ class Timeout < Error; end # Uh oh.
28
+ end
29
+ end
@@ -0,0 +1,67 @@
1
+ class AfterShip
2
+ # Response handling logic.
3
+ module ErrorHandler
4
+ module_function
5
+
6
+ # These mean that the response is good.
7
+ SUCCESS_CODES = [200, 201]
8
+
9
+ # Map meta codes to error classes.
10
+ CODE_TO_ERROR_MAP = {
11
+ 400 => Error::BadRequest,
12
+ 4001 => Error::InvalidJsonData,
13
+ 4002 => Error::InvalidJsonData,
14
+ 4003 => Error::TrackingAlreadyExists,
15
+ 4004 => Error::TrackingDoesNotExist,
16
+ 4005 => Error::TrackingNumberInvalid,
17
+ 4006 => Error::TrackingObjectRequired,
18
+ 4007 => Error::TrackingNumberRequired,
19
+ 4008 => Error::FieldInvalid,
20
+ 4009 => Error::FieldRequired,
21
+ 4010 => Error::SlugInvalid,
22
+ 4011 => Error::CourierFieldInvalid,
23
+ 4012 => Error::CourierNotDetected,
24
+ 4013 => Error::RetrackNotAllowed,
25
+ 4016 => Error::RetrackNotAllowed,
26
+ 4014 => Error::NotificationRequired,
27
+ 4015 => Error::IdInvalid,
28
+ 401 => Error::Unauthorized,
29
+ 403 => Error::Forbidden,
30
+ 404 => Error::NotFound,
31
+ 429 => Error::TooManyRequests,
32
+ 500 => Error::InternalError,
33
+ 502 => Error::InternalError,
34
+ 503 => Error::InternalError,
35
+ 504 => Error::InternalError
36
+ }
37
+
38
+ # Did it timeout? If the body empty?
39
+ #
40
+ # @param response [Typhoeus::Response]
41
+ def precheck(response)
42
+ fail Error::Timeout, "#{ response.effective_url } cannot be reached" if
43
+ response.timed_out?
44
+ end
45
+
46
+ # Check the meta code of the response. If it isn't 200 or 201, raise an
47
+ # error.
48
+ #
49
+ # @param meta [Hash]
50
+ # @option meta code [Fixnum]
51
+ # @option meta message [String, nil]
52
+ # @option meta type [String, nil]
53
+ def check(meta)
54
+ code = meta.fetch(:code)
55
+
56
+ return if SUCCESS_CODES.include?(code)
57
+
58
+ error_class = error_class_for(code)
59
+ fail error_class, meta[:message]
60
+ end
61
+
62
+ # Pick the corresponding error class for the code.
63
+ def error_class_for(code)
64
+ CODE_TO_ERROR_MAP[code] || Error::UnknownError
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,131 @@
1
+ class AfterShip
2
+ # Gather necessary pieces, assemble a `Typhoeus::Request`, run that,
3
+ # get a `Typhoeus::Response`, parse that, check for errors, return the
4
+ # parse JSON.
5
+ class Request
6
+ # Shorthand for GET request:
7
+ #
8
+ # request = Request.new(url: '...', api_key: '...', method: :get)
9
+ # response = request.response
10
+ #
11
+ # @param options [Hash]
12
+ # @option options api_key [String] Your API key.
13
+ # @option options url [String] The full endpoint URL.
14
+ # @option options body [Hash, nil] Body for the request as a hash.
15
+ #
16
+ # @return [Hash]
17
+ def self.get(options, &block)
18
+ options[:method] = :get
19
+ new(options, &block).response
20
+ end
21
+
22
+ # Shorthand for POST request:
23
+ #
24
+ # request = Request.new(url: '...', api_key: '...', method: :post)
25
+ # response = request.response
26
+ #
27
+ # @param options [Hash]
28
+ # @option options api_key [String] Your API key.
29
+ # @option options url [String] The full endpoint URL.
30
+ # @option options body [Hash, nil] Body for the request as a hash.
31
+ #
32
+ # @return [Hash]
33
+ def self.post(options, &block)
34
+ options[:method] = :post
35
+ new(options, &block).response
36
+ end
37
+
38
+ # Shorthand for PUT request:
39
+ #
40
+ # request = Request.new(url: '...', api_key: '...', method: :put)
41
+ # response = request.response
42
+ #
43
+ # @param options [Hash]
44
+ # @option options api_key [String] Your API key.
45
+ # @option options url [String] The full endpoint URL.
46
+ # @option options body [Hash, nil] Body for the request as a hash.
47
+ #
48
+ # @return [Hash]
49
+ def self.put(options, &block)
50
+ options[:method] = :put
51
+ new(options, &block).response
52
+ end
53
+
54
+ # Prepare the request to be run later.
55
+ #
56
+ # @param options [Hash]
57
+ # @option options api_key [String] Your API key.
58
+ # @option options url [String] The full endpoint URL.
59
+ # @option options method [Symbol] The HTTP method.
60
+ # @option options body [Hash, nil] Body for the request as a hash.
61
+ # @param block [Proc] Response modifier callback.
62
+ def initialize(options = {}, &block)
63
+ @api_key = options.fetch(:api_key)
64
+ @url = options.fetch(:url)
65
+ @method = options.fetch(:method)
66
+ @body = options[:body]
67
+ @request = typhoeus_request
68
+ @block = block
69
+ end
70
+
71
+ # Do the request to the server and handle the response.
72
+ def response
73
+ response = typhoeus_response
74
+ ErrorHandler.precheck(response)
75
+ parsed_body = MultiJson.load(response.body, JSON_OPTIONS)
76
+ ErrorHandler.check(parsed_body.fetch(:meta))
77
+
78
+ if @block
79
+ @block.call(parsed_body)
80
+ else
81
+ parsed_body
82
+ end
83
+ end
84
+
85
+ protected
86
+
87
+ # Run the `Typhoeus::Request` and return the response.
88
+ #
89
+ # @return [Typhoeus::Request]
90
+ def typhoeus_response
91
+ @request.run
92
+ end
93
+
94
+ # Make the `Typhoeus::Request` to be run later.
95
+ #
96
+ # @return [Typhoeus::Request]
97
+ def typhoeus_request
98
+ request = Typhoeus::Request.new(
99
+ @url,
100
+ method: @method,
101
+ headers: {
102
+ 'aftership-api-key' => @api_key,
103
+ 'Content-Type' => 'application/json'
104
+ }
105
+ )
106
+
107
+ request.options[:body] = MultiJson.dump(@body) if @body
108
+ make_verbose(request) if AfterShip.debug
109
+
110
+ request
111
+ end
112
+
113
+ # Print the low level cURL internals in the console as well as the
114
+ # request body and response body when it's available.
115
+ #
116
+ # @param request [Typhoeus::Request]
117
+ def make_verbose(request)
118
+ request.options[:verbose] = true
119
+
120
+ request.on_complete do |response|
121
+ puts
122
+ puts 'Request body:'
123
+ puts request.options[:body]
124
+ puts
125
+ puts 'Response body:'
126
+ puts response.body
127
+ puts
128
+ end
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,4 @@
1
+ class AfterShip
2
+ # Version number, happy now?
3
+ VERSION = '0.0.4'
4
+ end