Class: AfterShip

Inherits:
Object
  • Object
show all
Defined in:
lib/after_ship.rb,
lib/after_ship/courier.rb,
lib/after_ship/tracking.rb,
lib/after_ship/checkpoint.rb,
lib/after_ship/core/error.rb,
lib/after_ship/core/request.rb,
lib/after_ship/core/version.rb,
lib/after_ship/core/attributes.rb,
lib/after_ship/core/date_utils.rb,
lib/after_ship/core/error_handler.rb

Overview

Quick rundown, check individual methods for more info:

client = AfterShip.new(api_key: 'your-aftership-api-key')
client.trackings
client.tracking('tracking-number', 'ups')
client.create_tracking('tracking-number', 'ups', order_id: 'external-id')
client.update_tracking('tracking-number', 'ups', order_id: 'external-id')
client.couriers

To debug:

AfterShip.debug = true

Some test trackings:

client.tracking('1ZA2207X0444990982', 'ups')

Defined Under Namespace

Modules: Attributes, DateUtils, ErrorHandler Classes: Checkpoint, Courier, Error, Request, Tracking

Constant Summary collapse

DEFAULT_API_ADDRESS =

The API root URL.

'https://api.aftership.com/v4'
TRACKINGS_ENDPOINT =

The trackings endpoint URL.

"#{DEFAULT_API_ADDRESS}/trackings"
COURIERS_ENDPOINT =

The activated couriers endpoint URL.

"#{DEFAULT_API_ADDRESS}/couriers"
JSON_OPTIONS =

Common JSON loading/dumping options.

{
  symbolize_keys: true # Symbol keys to string keys
}
TAG_STATUS =

Tag to human-friendly status conversion

{
  'Pending'        => 'Pending',
  'InfoReceived'   => 'Info Received',
  'InTransit'      => 'In Transit',
  'OutForDelivery' => 'Out for Delivery',
  'AttemptFail'    => 'Attempt Failed',
  'Delivered'      => 'Delivered',
  'Exception'      => 'Exception',
  'Expired'        => 'Expired'
}
VERSION =

Version number, happy now?

'0.0.8'

Class Attribute Summary collapse

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options) ⇒ AfterShip

Init the client:

client = AfterShip.new(api_key: 'your-aftership-api-key')

Parameters:

  • options (Hash)

Options Hash (options):

  • :api_key (String)


80
81
82
# File 'lib/after_ship.rb', line 80

def initialize(options)
  @api_key = options.fetch(:api_key)
end

Class Attribute Details

.debugBool

If debugging is turned on, it is passed to Typhoeus as “verbose” options, which is passed down to Ethon and displays request/response in STDERR.

Returns:

  • (Bool)


66
67
68
# File 'lib/after_ship.rb', line 66

def debug
  @debug
end

Instance Attribute Details

#api_keyString (readonly)

The API key required for the AfterShip service.

Returns:

  • (String)


72
73
74
# File 'lib/after_ship.rb', line 72

def api_key
  @api_key
end

Instance Method Details

#couriersHash

Get a list of activated couriers. www.aftership.com/docs/api/4/couriers/get-couriers

client.couriers

# Will return list of Courier objects:

[
  #<AfterShip::Courier:0x007fa2771d4bf8
    @name="USPS",
    @other_name="United States Postal Service",
    @phone="+1 800-275-8777",
    @required_fields=[],
    @slug="usps",
    @web_url="https://www.usps.com">,
  #<AfterShip::Courier ...>
  ...
]

Returns:

  • (Hash)


262
263
264
265
266
267
268
# File 'lib/after_ship.rb', line 262

def couriers
  data = Request.get(url: COURIERS_ENDPOINT, api_key: api_key) do |response|
    response.fetch(:data).fetch(:couriers)
  end

  data.map { |datum| Courier.new(datum) }
end

#create_tracking(tracking_number, courier, options = {}) ⇒ Hash

Create a new tracking. www.aftership.com/docs/api/4/trackings/post-trackings

client.create_tracking('tracking-number', 'ups', order_id: 'external-id')

# Will return Tracking object or raise
# AfterShip::Error::TrackingAlreadyExists:

#<AfterShip::Tracking ...>

rubocop:disable Metrics/MethodLength

Parameters:

  • tracking_number (String)
  • courier (String)
  • options (Hash) (defaults to: {})

Returns:

  • (Hash)


198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
# File 'lib/after_ship.rb', line 198

def create_tracking(tracking_number, courier, options = {})
  body = {
    tracking: {
      tracking_number: tracking_number,
      slug:            courier
    }.merge(options)
  }

  data = Request.post(url: TRACKINGS_ENDPOINT, api_key: api_key,
                      body: body) do |response|
    response.fetch(:data).fetch(:tracking)
  end

  Tracking.new(data)
end

#tracking(tracking_number, courier) ⇒ Hash

Get a single tracking. Raises an error if not found. www.aftership.com/docs/api/4/trackings/get-trackings-slug-tracking_number

client.tracking('tracking-number', 'ups')

# Will return Tracking object or raise AfterShip::Error::NotFound:

#<AfterShip::Tracking:0x007f838ef44e58
  @active=false,
  @android=[],
  @courier="UPS",
  @created_at=#<DateTime: 2014-11-19T15:16:17+00:00 ...>,
  @custom_fields={},
  @customer_name=nil,
  @delivery_time=8,
  @destination_country_iso3="USA",
  @emails=[],
  @expected_delivery=nil,
  @id="546cb4414a1a2097122ae7b1",
  @ios=[],
  @order_id="PL-66448782",
  @order_id_path=nil,
  @origin_country_iso3="IND",
  @shipment_package_count=1,
  @shipment_type="UPS SAVER",
  @shipment_weight=0.5,
  @shipment_weight_unit="kg",
  @signed_by="MET CUSTOM",
  @slug="ups",
  @smses=[],
  @source="api",
  @status="Delivered",
  @tag="Delivered",
  @title="1ZA2207X0490715335",
  @tracked_count=6,
  @tracking_account_number=nil,
  @tracking_number="1ZA2207X0490715335",
  @tracking_postal_code=nil,
  @tracking_ship_date=nil,
  @unique_token="-y6ziF438",
  @updated_at=#<DateTime: 2014-11-19T22:12:32+00:00 ...>,
  @checkpoints=[
    #<AfterShip::Checkpoint:0x007f838ef57d50
      @checkpoint_time=
      #<DateTime: 2014-11-11T19:12:00+00:00 ...>,
      @city="MUMBAI",
      @country_iso3=nil,
      @country_name="IN",
      @courier="UPS",
      @created_at=
      #<DateTime: 2014-11-19T15:16:17+00:00 ...>,
      @message="PICKUP SCAN",
      @slug="ups",
      @state=nil,
      @status="In Transit",
      @tag="InTransit",
      @zip=nil>,
    #<AfterShip::Checkpoint ...>,
    ...
  ]
>

Parameters:

  • tracking_number (String)
  • courier (String)

Returns:

  • (Hash)


172
173
174
175
176
177
178
179
# File 'lib/after_ship.rb', line 172

def tracking(tracking_number, courier)
  url  = "#{TRACKINGS_ENDPOINT}/#{courier}/#{tracking_number}"
  data = Request.get(url: url, api_key: api_key) do |response|
    response.fetch(:data).fetch(:tracking)
  end

  Tracking.new(data)
end

#trackingsHash

Get a list of trackings. www.aftership.com/docs/api/4/trackings/get-trackings

client.trackings

# Will return list of Tracking objects:

[
  #<AfterShip::Tracking ...>,
  #<AfterShip::Tracking ...>,
  ...
]

Returns:

  • (Hash)


98
99
100
101
102
103
104
# File 'lib/after_ship.rb', line 98

def trackings
  data = Request.get(url: TRACKINGS_ENDPOINT, api_key: api_key) do |response|
    response.fetch(:data).fetch(:trackings)
  end

  data.map { |datum| Tracking.new(datum) }
end

#update_tracking(tracking_number, courier, options = {}) ⇒ Hash

Update a tracking. www.aftership.com/docs/api/4/trackings/put-trackings-slug-tracking_number

client.update_tracking('tracking-number', 'ups', order_id: 'external-id')

# Will return Tracking object or raise
# AfterShip::Error::TrackingAlreadyExists:

#<AfterShip::Tracking ...>

Parameters:

  • tracking_number (String)
  • courier (String)
  • options (Hash) (defaults to: {})

Returns:

  • (Hash)


229
230
231
232
233
234
235
236
237
238
239
240
# File 'lib/after_ship.rb', line 229

def update_tracking(tracking_number, courier, options = {})
  url  = "#{TRACKINGS_ENDPOINT}/#{courier}/#{tracking_number}"
  body = {
    tracking: options
  }

  data = Request.put(url: url, api_key: api_key, body: body) do |response|
    response.fetch(:data).fetch(:tracking)
  end

  Tracking.new(data)
end