Skip to content

Instantly share code, notes, and snippets.

@iamricks
Last active November 22, 2021 12:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save iamricks/0d00dbc8b736974fb250d92d101247a9 to your computer and use it in GitHub Desktop.
Save iamricks/0d00dbc8b736974fb250d92d101247a9 to your computer and use it in GitHub Desktop.
Simple tracking number class in ruby
# Simple tracking number class just to streamline scraped numbers and user created tracking
class Tracking
include ActiveModel::Model
validates :carrier, presence: true
validates :tracking_number, presence: true
validates :ship_date, presence: true
attr_accessor :carrier
attr_accessor :tracking_number
attr_accessor :ship_date
# @param carrier [String]
# @param tracking_number [String]
# @param ship_date [Date]
def initialize(carrier, tracking_number, ship_date)
@carrier = carrier
@tracking_number = tracking_number
@ship_date = ship_date
end
# Create a Tracking obj from a tracking number
# @param tracking_number [String]
def self.create_from_tn(tracking_number)
carrier = self.get_carrier_from_tn(tracking_number)
# Could scrape the ship date here and set it, that would be ideal
if carrier
return Tracking.new(carrier, tracking_number, Time.now)
else
return Err.new("Invalid tracking number entered")
end
end
#Some regex to figure out the main carriers people use
# @param tracking_number [String]
def self.get_carrier_from_tn(tracking_number)
# UPS regex
return "UPS" if tracking_number[/\b(1Z ?[0-9A-Z]{3} ?[0-9A-Z]{3} ?[0-9A-Z]{2} ?[0-9A-Z]{4} ?[0-9A-Z]{3} ?[0-9A-Z]|[\dT]\d\d\d ?\d\d\d\d ?\d\d\d)\b/]
# USPS regex
return "USPS" if tracking_number[/\b([A-Z]{2}\d{9}[A-Z]{2}|(420\d{9}(9[2345])?)?\d{20}|(420\d{5})?(9[12345])?(\d{24}|\d{20})|82\d{8})\b/]
# Fedex regex
return "FedEx" if tracking_number[/(\b96\d{20}\b)|(\b\d{15}\b)|(\b\d{12}\b)/]
return "FedEx" if tracking_number[/\b((98\d\d\d\d\d?\d\d\d\d|98\d\d) ?\d\d\d\d ?\d\d\d\d( ?\d\d\d)?)\b/]
return "FedEx" if tracking_number[/^[0-9]{15}$/]
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment