freight_kit 0.1.19 → 0.1.21
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 +4 -4
- data/Gemfile +0 -2
- data/Gemfile.lock +51 -52
- data/README.md +37 -2
- data/Rakefile +6 -0
- data/VERSION +1 -1
- data/configuration/locations/amazon_warehouses.yml +3330 -0
- data/freight_kit.gemspec +21 -18
- data/lib/freight_kit/address_normalizer.rb +26 -0
- data/lib/freight_kit/amazon_warehouse.rb +33 -0
- data/lib/freight_kit/api_clients/soap_client.rb +7 -9
- data/lib/freight_kit/carrier.rb +250 -303
- data/lib/freight_kit/carriers/a1_express.rb +25 -0
- data/lib/freight_kit/carriers/a_duie_pyle.rb +30 -0
- data/lib/freight_kit/carriers/aaa_cooper.rb +11 -0
- data/lib/freight_kit/carriers/aaa_expedited_services.rb +10 -0
- data/lib/freight_kit/carriers/ab_brothers_usa_inc.rb +12 -0
- data/lib/freight_kit/carriers/aberdeen_express_inc.rb +28 -0
- data/lib/freight_kit/carriers/abf_freight_system.rb +492 -0
- data/lib/freight_kit/carriers/access_transport.rb +10 -0
- data/lib/freight_kit/carriers/action_express.rb +10 -0
- data/lib/freight_kit/carriers/adams_and_companies.rb +10 -0
- data/lib/freight_kit/carriers/advance_distribution.rb +28 -0
- data/lib/freight_kit/carriers/alcon_transport.rb +10 -0
- data/lib/freight_kit/carriers/all_freight.rb +10 -0
- data/lib/freight_kit/carriers/alliance_transportation_group.rb +10 -0
- data/lib/freight_kit/carriers/allstate_transport.rb +10 -0
- data/lib/freight_kit/carriers/aloha_freight_forwarders.rb +35 -0
- data/lib/freight_kit/carriers/amado_trucking.rb +35 -0
- data/lib/freight_kit/carriers/american_fast_freight.rb +28 -0
- data/lib/freight_kit/carriers/amigos_service_transportation.rb +10 -0
- data/lib/freight_kit/carriers/anderson_towing_and_transport.rb +10 -0
- data/lib/freight_kit/carriers/apex_transporting.rb +10 -0
- data/lib/freight_kit/carriers/archer_cargo.rb +35 -0
- data/lib/freight_kit/carriers/armstrong_transport_group.rb +10 -0
- data/lib/freight_kit/carriers/autobahn_logistics.rb +10 -0
- data/lib/freight_kit/carriers/averitt_express.rb +30 -0
- data/lib/freight_kit/carriers/ba_transportation.rb +10 -0
- data/lib/freight_kit/carriers/balkin_express.rb +10 -0
- data/lib/freight_kit/carriers/bay_area_express.rb +10 -0
- data/lib/freight_kit/carriers/bc_freightways.rb +11 -0
- data/lib/freight_kit/carriers/benjamin_best_freight_inc.rb +37 -0
- data/lib/freight_kit/carriers/bennett_trucking.rb +10 -0
- data/lib/freight_kit/carriers/best_overnite_express.rb +78 -0
- data/lib/freight_kit/carriers/best_trucking.rb +10 -0
- data/lib/freight_kit/carriers/bestway_transport.rb +10 -0
- data/lib/freight_kit/carriers/bryan_systems.rb +10 -0
- data/lib/freight_kit/carriers/c_and_w_express.rb +10 -0
- data/lib/freight_kit/carriers/campbell_trucking.rb +10 -0
- data/lib/freight_kit/carriers/carde_transportation.rb +10 -0
- data/lib/freight_kit/carriers/cardinal_logistics.rb +28 -0
- data/lib/freight_kit/carriers/cdc_transport.rb +10 -0
- data/lib/freight_kit/carriers/cdo_express_diversified.rb +10 -0
- data/lib/freight_kit/carriers/cedar_supply_trucking.rb +10 -0
- data/lib/freight_kit/carriers/central_freight_lines.rb +12 -0
- data/lib/freight_kit/carriers/central_transport.rb +12 -0
- data/lib/freight_kit/carriers/chicago_suburban_express.rb +28 -0
- data/lib/freight_kit/carriers/city_logistics.rb +11 -0
- data/lib/freight_kit/carriers/clear_lane_freight_systems.rb +483 -0
- data/lib/freight_kit/carriers/cleopatra_trucking.rb +10 -0
- data/lib/freight_kit/carriers/clifford_transportation.rb +10 -0
- data/lib/freight_kit/carriers/cms_domestic.rb +25 -0
- data/lib/freight_kit/carriers/cnd_logistics.rb +10 -0
- data/lib/freight_kit/carriers/coast_to_coast_transport.rb +27 -0
- data/lib/freight_kit/carriers/countrywide_carriers.rb +10 -0
- data/lib/freight_kit/carriers/cpl_express.rb +35 -0
- data/lib/freight_kit/carriers/crosby_trucking_service.rb +29 -0
- data/lib/freight_kit/carriers/cross_country_freight_solutions.rb +419 -0
- data/lib/freight_kit/carriers/crowley.rb +10 -0
- data/lib/freight_kit/carriers/csa_transportation.rb +40 -0
- data/lib/freight_kit/carriers/csx_transportation.rb +40 -0
- data/lib/freight_kit/carriers/custom_global_logistics.rb +14 -0
- data/lib/freight_kit/carriers/d_and_a_transport.rb +10 -0
- data/lib/freight_kit/carriers/dak_transport.rb +10 -0
- data/lib/freight_kit/carriers/dash_courier_and_logistics_north_carolina.rb +10 -0
- data/lib/freight_kit/carriers/daylight_transport.rb +29 -0
- data/lib/freight_kit/carriers/dayton_freight_lines.rb +30 -0
- data/lib/freight_kit/carriers/dbr_logistics.rb +10 -0
- data/lib/freight_kit/carriers/deep_south_freight.rb +27 -0
- data/lib/freight_kit/carriers/delta_express.rb +10 -0
- data/lib/freight_kit/carriers/delta_transport.rb +10 -0
- data/lib/freight_kit/carriers/delta_trucking_logistics.rb +10 -0
- data/lib/freight_kit/carriers/demco_express.rb +10 -0
- data/lib/freight_kit/carriers/dependable_global_express.rb +10 -0
- data/lib/freight_kit/carriers/dependable_hawaiian_express.rb +24 -0
- data/lib/freight_kit/carriers/dependable_highway_express.rb +585 -0
- data/lib/freight_kit/carriers/desert_coastal_transport.rb +10 -0
- data/lib/freight_kit/carriers/dhl.rb +11 -0
- data/lib/freight_kit/carriers/diamond_line_delivery.rb +174 -0
- data/lib/freight_kit/carriers/ding_tai_trucking.rb +10 -0
- data/lib/freight_kit/carriers/diversified_transfer_and_storage.rb +29 -0
- data/lib/freight_kit/carriers/dohrn_transfer_company.rb +30 -0
- data/lib/freight_kit/carriers/dot_line_transportation.rb +29 -0
- data/lib/freight_kit/carriers/drt_transportation.rb +13 -0
- data/lib/freight_kit/carriers/dugan_truck_line.rb +29 -0
- data/lib/freight_kit/carriers/dupont.rb +10 -0
- data/lib/freight_kit/carriers/e_transport_carriers.rb +29 -0
- data/lib/freight_kit/carriers/echo_global_logistics.rb +13 -0
- data/lib/freight_kit/carriers/ecklund_logistics.rb +10 -0
- data/lib/freight_kit/carriers/el_emplumado_transport.rb +10 -0
- data/lib/freight_kit/carriers/elite_carriers.rb +28 -0
- data/lib/freight_kit/carriers/emerald_express.rb +10 -0
- data/lib/freight_kit/carriers/era_transport.rb +10 -0
- data/lib/freight_kit/carriers/estes_express_lines.rb +25 -0
- data/lib/freight_kit/carriers/euro_kam.rb +28 -0
- data/lib/freight_kit/carriers/ew_riverside_trucking.rb +10 -0
- data/lib/freight_kit/carriers/express_2000_inc.rb +12 -0
- data/lib/freight_kit/carriers/express_services_international.rb +10 -0
- data/lib/freight_kit/carriers/f_and_a_express.rb +27 -0
- data/lib/freight_kit/carriers/fairmont_logistics.rb +13 -0
- data/lib/freight_kit/carriers/fargo_cargo.rb +10 -0
- data/lib/freight_kit/carriers/fast_freight_transportation.rb +10 -0
- data/lib/freight_kit/carriers/fast_load_transport.rb +10 -0
- data/lib/freight_kit/carriers/fed_ex_express.rb +30 -0
- data/lib/freight_kit/carriers/fed_ex_ground.rb +24 -0
- data/lib/freight_kit/carriers/fed_ex_ltl_economy.rb +11 -0
- data/lib/freight_kit/carriers/fed_ex_ltl_priority.rb +11 -0
- data/lib/freight_kit/carriers/first_trucking_express.rb +10 -0
- data/lib/freight_kit/carriers/flash_trucking.rb +10 -0
- data/lib/freight_kit/carriers/fort_transportation_and_service_company_inc.rb +37 -0
- data/lib/freight_kit/carriers/forward_air.rb +789 -0
- data/lib/freight_kit/carriers/frahtex.rb +10 -0
- data/lib/freight_kit/carriers/frozen_food_express.rb +10 -0
- data/lib/freight_kit/carriers/gholia_bros_trucking.rb +36 -0
- data/lib/freight_kit/carriers/global_cargo.rb +10 -0
- data/lib/freight_kit/carriers/global_logistics_and_transportation.rb +10 -0
- data/lib/freight_kit/carriers/gls_freight.rb +32 -0
- data/lib/freight_kit/carriers/go_trucking_services.rb +10 -0
- data/lib/freight_kit/carriers/gold_eagle_transportation.rb +11 -0
- data/lib/freight_kit/carriers/golden_drop_trucking.rb +10 -0
- data/lib/freight_kit/carriers/gonzalez_transportation.rb +10 -0
- data/lib/freight_kit/carriers/gps_transport.rb +10 -0
- data/lib/freight_kit/carriers/greene_enterprise.rb +10 -0
- data/lib/freight_kit/carriers/gsa_international.rb +10 -0
- data/lib/freight_kit/carriers/gsp_express.rb +24 -0
- data/lib/freight_kit/carriers/gsv_transportation.rb +10 -0
- data/lib/freight_kit/carriers/gta_transportation.rb +10 -0
- data/lib/freight_kit/carriers/guam_freight_services.rb +10 -0
- data/lib/freight_kit/carriers/harrah_transportation.rb +23 -0
- data/lib/freight_kit/carriers/her_trucking.rb +10 -0
- data/lib/freight_kit/carriers/hercules_freight.rb +20 -0
- data/lib/freight_kit/carriers/highlander_xpress.rb +36 -0
- data/lib/freight_kit/carriers/hn_transport.rb +10 -0
- data/lib/freight_kit/carriers/honolulu_freight_service.rb +10 -0
- data/lib/freight_kit/carriers/hot_line_freight_system_inc.rb +12 -0
- data/lib/freight_kit/carriers/hotshot_freight_of_texas.rb +13 -0
- data/lib/freight_kit/carriers/houser_transport.rb +27 -0
- data/lib/freight_kit/carriers/infiniti_freight_logistics.rb +28 -0
- data/lib/freight_kit/carriers/infinity_trucking.rb +10 -0
- data/lib/freight_kit/carriers/interstate_tma.rb +10 -0
- data/lib/freight_kit/carriers/intrade_industries.rb +10 -0
- data/lib/freight_kit/carriers/jasper_trucking.rb +28 -0
- data/lib/freight_kit/carriers/jb_hunt.rb +11 -0
- data/lib/freight_kit/carriers/jfj_transportation.rb +8 -8
- data/lib/freight_kit/carriers/jkb_express.rb +10 -0
- data/lib/freight_kit/carriers/jlm_transport.rb +10 -0
- data/lib/freight_kit/carriers/johansson_transport.rb +10 -0
- data/lib/freight_kit/carriers/jones_express.rb +10 -0
- data/lib/freight_kit/carriers/jp_logistics.rb +41 -0
- data/lib/freight_kit/carriers/just_in_time_cargo.rb +29 -0
- data/lib/freight_kit/carriers/kengkok_times.rb +10 -0
- data/lib/freight_kit/carriers/kings_express.rb +10 -0
- data/lib/freight_kit/carriers/klc_transportation.rb +10 -0
- data/lib/freight_kit/carriers/km_trucking.rb +10 -0
- data/lib/freight_kit/carriers/kma_logistics.rb +10 -0
- data/lib/freight_kit/carriers/krc_logistics.rb +10 -0
- data/lib/freight_kit/carriers/ktx.rb +10 -0
- data/lib/freight_kit/carriers/landstar.rb +25 -0
- data/lib/freight_kit/carriers/lanter_distributing_llc.rb +30 -0
- data/lib/freight_kit/carriers/ld_trucking.rb +10 -0
- data/lib/freight_kit/carriers/legacy_logistics_solutions.rb +10 -0
- data/lib/freight_kit/carriers/leonards_express.rb +10 -0
- data/lib/freight_kit/carriers/liberty_linehaul_west.rb +28 -0
- data/lib/freight_kit/carriers/liberty_transport.rb +10 -0
- data/lib/freight_kit/carriers/lightning_express.rb +10 -0
- data/lib/freight_kit/carriers/lj_express.rb +24 -0
- data/lib/freight_kit/carriers/lkp_enterprises.rb +10 -0
- data/lib/freight_kit/carriers/ltl_pros.rb +28 -0
- data/lib/freight_kit/carriers/m_and_m_and_sons.rb +10 -0
- data/lib/freight_kit/carriers/mag_lines_transport.rb +10 -0
- data/lib/freight_kit/carriers/magic_messenger.rb +24 -0
- data/lib/freight_kit/carriers/majors_transit.rb +10 -0
- data/lib/freight_kit/carriers/map_global_logistics.rb +10 -0
- data/lib/freight_kit/carriers/matths_trucking.rb +11 -0
- data/lib/freight_kit/carriers/mav_canadian_transport.rb +13 -0
- data/lib/freight_kit/carriers/mc_systems.rb +35 -0
- data/lib/freight_kit/carriers/mega_fleet.rb +10 -0
- data/lib/freight_kit/carriers/mega_trans_group.rb +28 -0
- data/lib/freight_kit/carriers/meta_express.rb +10 -0
- data/lib/freight_kit/carriers/mia_transportation.rb +10 -0
- data/lib/freight_kit/carriers/midwest_motor_express.rb +14 -0
- data/lib/freight_kit/carriers/midwest_transport_and_trucking.rb +10 -0
- data/lib/freight_kit/carriers/mikade_delivery_service.rb +10 -0
- data/lib/freight_kit/carriers/mohoff_freight_lines.rb +23 -0
- data/lib/freight_kit/carriers/montata_travelers_express.rb +10 -0
- data/lib/freight_kit/carriers/morgan_van_lines.rb +29 -0
- data/lib/freight_kit/carriers/moto_transportation.rb +24 -0
- data/lib/freight_kit/carriers/mountain_valley_express.rb +197 -0
- data/lib/freight_kit/carriers/ms_freight.rb +27 -0
- data/lib/freight_kit/carriers/mvg_transport.rb +10 -0
- data/lib/freight_kit/carriers/n_and_m_transfer_co_inc.rb +29 -0
- data/lib/freight_kit/carriers/nabot_transport_solutions.rb +10 -0
- data/lib/freight_kit/carriers/national_freight_xpress.rb +10 -0
- data/lib/freight_kit/carriers/navigation_group.rb +10 -0
- data/lib/freight_kit/carriers/nelson_trucking.rb +10 -0
- data/lib/freight_kit/carriers/network_1_transportation.rb +10 -0
- data/lib/freight_kit/carriers/new_century_transport.rb +28 -0
- data/lib/freight_kit/carriers/new_penn_motor_express.rb +11 -0
- data/lib/freight_kit/carriers/nieves_transportation.rb +10 -0
- data/lib/freight_kit/carriers/nolan_transportation_group.rb +26 -0
- data/lib/freight_kit/carriers/northland_trucking.rb +10 -0
- data/lib/freight_kit/carriers/northwest_carrier_logistics.rb +27 -0
- data/lib/freight_kit/carriers/nt_usa.rb +10 -0
- data/lib/freight_kit/carriers/nu_line_transportation.rb +10 -0
- data/lib/freight_kit/carriers/numark_transportation.rb +80 -0
- data/lib/freight_kit/carriers/nvk_transport.rb +10 -0
- data/lib/freight_kit/carriers/ny_transport.rb +10 -0
- data/lib/freight_kit/carriers/oak_harbor.rb +28 -0
- data/lib/freight_kit/carriers/oakline_transportation.rb +10 -0
- data/lib/freight_kit/carriers/old_dominion_freight_line.rb +30 -0
- data/lib/freight_kit/carriers/on_trac.rb +573 -0
- data/lib/freight_kit/carriers/one_hundred_one_transport.rb +10 -0
- data/lib/freight_kit/carriers/one_way_delivery.rb +10 -0
- data/lib/freight_kit/carriers/oracle_transportation_solutions.rb +10 -0
- data/lib/freight_kit/carriers/orange_courier.rb +27 -0
- data/lib/freight_kit/carriers/ortas_trucking.rb +10 -0
- data/lib/freight_kit/carriers/pac_trux_transportation.rb +10 -0
- data/lib/freight_kit/carriers/pacer.rb +10 -0
- data/lib/freight_kit/carriers/pacific_logistics.rb +10 -0
- data/lib/freight_kit/carriers/pacific_states_truck_lines.rb +10 -0
- data/lib/freight_kit/carriers/paradise_distributing.rb +10 -0
- data/lib/freight_kit/carriers/paramount_freight_systems.rb +10 -0
- data/lib/freight_kit/carriers/peninsula_truck_lines.rb +222 -0
- data/lib/freight_kit/carriers/pg_transport.rb +10 -0
- data/lib/freight_kit/carriers/pgs_360.rb +10 -0
- data/lib/freight_kit/carriers/pilot_freight_services.rb +10 -0
- data/lib/freight_kit/carriers/pious_trans.rb +27 -0
- data/lib/freight_kit/carriers/pitt_ohio_express.rb +30 -0
- data/lib/freight_kit/carriers/pki_logistics.rb +12 -0
- data/lib/freight_kit/carriers/plana_transportation.rb +28 -0
- data/lib/freight_kit/carriers/prestige.rb +10 -0
- data/lib/freight_kit/carriers/pro_trans_solutions.rb +28 -0
- data/lib/freight_kit/carriers/puma_logistics.rb +10 -0
- data/lib/freight_kit/carriers/pwc_international.rb +10 -0
- data/lib/freight_kit/carriers/quality_logistics.rb +10 -0
- data/lib/freight_kit/carriers/queen_star_trucking.rb +27 -0
- data/lib/freight_kit/carriers/r_and_l_carriers.rb +11 -0
- data/lib/freight_kit/carriers/rac_transport.rb +10 -0
- data/lib/freight_kit/carriers/re_logistics.rb +23 -0
- data/lib/freight_kit/carriers/reddaway.rb +11 -0
- data/lib/freight_kit/carriers/reefer_van_network.rb +13 -0
- data/lib/freight_kit/carriers/refrigerated_trucking_and_ltl_transportation_services.rb +10 -0
- data/lib/freight_kit/carriers/ridgeline_express.rb +10 -0
- data/lib/freight_kit/carriers/rist_transport.rb +29 -0
- data/lib/freight_kit/carriers/river_city_transport.rb +10 -0
- data/lib/freight_kit/carriers/roadrunner_transportation_services.rb +675 -0
- data/lib/freight_kit/carriers/roadtex.rb +13 -0
- data/lib/freight_kit/carriers/ronald_transport_services.rb +10 -0
- data/lib/freight_kit/carriers/rose_trucking.rb +24 -0
- data/lib/freight_kit/carriers/rp_and_j_transport.rb +24 -0
- data/lib/freight_kit/carriers/rpm_transportation.rb +11 -0
- data/lib/freight_kit/carriers/rude_transportation.rb +30 -0
- data/lib/freight_kit/carriers/s_and_s_logistics.rb +10 -0
- data/lib/freight_kit/carriers/saia.rb +470 -363
- data/lib/freight_kit/carriers/sb_transportation.rb +27 -0
- data/lib/freight_kit/carriers/schneider_national.rb +29 -0
- data/lib/freight_kit/carriers/schwarz_trucking.rb +10 -0
- data/lib/freight_kit/carriers/sewell_motor_express.rb +29 -0
- data/lib/freight_kit/carriers/shawnee_trucking.rb +28 -0
- data/lib/freight_kit/carriers/shi_logistics.rb +10 -0
- data/lib/freight_kit/carriers/sinbad_transport.rb +10 -0
- data/lib/freight_kit/carriers/skyway.rb +10 -0
- data/lib/freight_kit/carriers/smith_cargo_transportation_services.rb +23 -0
- data/lib/freight_kit/carriers/sna_transportation.rb +10 -0
- data/lib/freight_kit/carriers/solid_group.rb +10 -0
- data/lib/freight_kit/carriers/solution_carrier_express.rb +10 -0
- data/lib/freight_kit/carriers/southeastern_freight_lines.rb +450 -0
- data/lib/freight_kit/carriers/southwestern_motor_transport.rb +30 -0
- data/lib/freight_kit/carriers/span_alaska.rb +10 -0
- data/lib/freight_kit/carriers/specialize_transportation.rb +27 -0
- data/lib/freight_kit/carriers/ssi_refrigerated_express.rb +10 -0
- data/lib/freight_kit/carriers/standard_forwarding_llc.rb +28 -0
- data/lib/freight_kit/carriers/star_american_enterprise.rb +10 -0
- data/lib/freight_kit/carriers/sterling_transportation.rb +10 -0
- data/lib/freight_kit/carriers/stg.rb +163 -0
- data/lib/freight_kit/carriers/supervan_service.rb +10 -0
- data/lib/freight_kit/carriers/sutton_transport_inc.rb +12 -0
- data/lib/freight_kit/carriers/swift_transportation.rb +28 -0
- data/lib/freight_kit/carriers/t_force_worldwide.rb +617 -0
- data/lib/freight_kit/carriers/tax_airfreight_inc.rb +35 -0
- data/lib/freight_kit/carriers/tforce_freight_inc.rb +30 -0
- data/lib/freight_kit/carriers/the_custom_companies.rb +162 -0
- data/lib/freight_kit/carriers/thk_trucking.rb +28 -0
- data/lib/freight_kit/carriers/tiger_cool_express.rb +11 -0
- data/lib/freight_kit/carriers/tili_logistics.rb +10 -0
- data/lib/freight_kit/carriers/tmt_industries.rb +10 -0
- data/lib/freight_kit/carriers/top_ten_express.rb +28 -0
- data/lib/freight_kit/carriers/total_quality_logistics.rb +338 -0
- data/lib/freight_kit/carriers/total_transportation.rb +258 -0
- data/lib/freight_kit/carriers/trans_international_trucking.rb +29 -0
- data/lib/freight_kit/carriers/treasure_transportation.rb +10 -0
- data/lib/freight_kit/carriers/tri_state_services.rb +10 -0
- data/lib/freight_kit/carriers/tritex_freighters.rb +10 -0
- data/lib/freight_kit/carriers/triways.rb +10 -0
- data/lib/freight_kit/carriers/tsi_kansas.rb +29 -0
- data/lib/freight_kit/carriers/u_and_r_transportation.rb +23 -0
- data/lib/freight_kit/carriers/union_pacific.rb +11 -0
- data/lib/freight_kit/carriers/united_freight_logistics.rb +10 -0
- data/lib/freight_kit/carriers/unlimited_distance_transportation.rb +10 -0
- data/lib/freight_kit/carriers/up_streamline.rb +10 -0
- data/lib/freight_kit/carriers/ups_freight.rb +12 -0
- data/lib/freight_kit/carriers/us_freightways.rb +10 -0
- data/lib/freight_kit/carriers/usa_truck.rb +28 -0
- data/lib/freight_kit/carriers/usf_holland.rb +11 -0
- data/lib/freight_kit/carriers/valley_cartage.rb +11 -0
- data/lib/freight_kit/carriers/vc_transport.rb +10 -0
- data/lib/freight_kit/carriers/vision_express.rb +11 -0
- data/lib/freight_kit/carriers/vision_logistics_group.rb +10 -0
- data/lib/freight_kit/carriers/vmg_transportation_group.rb +10 -0
- data/lib/freight_kit/carriers/volpe_express.rb +10 -0
- data/lib/freight_kit/carriers/ward_trucking.rb +29 -0
- data/lib/freight_kit/carriers/wdwb.rb +10 -0
- data/lib/freight_kit/carriers/western_flyer_express.rb +28 -0
- data/lib/freight_kit/carriers/western_regional_delivery_service.rb +271 -0
- data/lib/freight_kit/carriers/western_specialized_trucking.rb +22 -0
- data/lib/freight_kit/carriers/win_distribution.rb +28 -0
- data/lib/freight_kit/carriers/wlb_transport.rb +10 -0
- data/lib/freight_kit/carriers/x_trux.rb +29 -0
- data/lib/freight_kit/carriers/xpo_logistics.rb +427 -0
- data/lib/freight_kit/carriers/xpress_global_systems.rb +30 -0
- data/lib/freight_kit/carriers/xylo_trucking.rb +10 -0
- data/lib/freight_kit/carriers/yrc_freight.rb +24 -0
- data/lib/freight_kit/carriers/zentner_transportation.rb +28 -0
- data/lib/freight_kit/carriers.rb +332 -36
- data/lib/freight_kit/countries.rb +22 -0
- data/lib/freight_kit/error.rb +0 -2
- data/lib/freight_kit/errors/document_not_found_error.rb +0 -2
- data/lib/freight_kit/errors/expired_credentials_error.rb +0 -2
- data/lib/freight_kit/errors/http_error.rb +0 -2
- data/lib/freight_kit/errors/invalid_credentials_error.rb +0 -2
- data/lib/freight_kit/errors/response_error.rb +1 -3
- data/lib/freight_kit/errors/shipment_not_found_error.rb +0 -2
- data/lib/freight_kit/errors/unserviceable_accessorials_error.rb +2 -4
- data/lib/freight_kit/errors/unserviceable_error.rb +0 -2
- data/lib/freight_kit/helpers/documentable.rb +0 -2
- data/lib/freight_kit/helpers/pickupable.rb +3 -5
- data/lib/freight_kit/helpers/rateable.rb +0 -2
- data/lib/freight_kit/helpers/trackable.rb +0 -2
- data/lib/freight_kit/http_client/cache_store.rb +59 -0
- data/lib/freight_kit/http_client/log_device.rb +13 -0
- data/lib/freight_kit/http_client/response.rb +38 -0
- data/lib/freight_kit/http_client/revalidation.rb +25 -0
- data/lib/freight_kit/http_client/safe_retries.rb +23 -0
- data/lib/freight_kit/http_client/zstd.rb +28 -0
- data/lib/freight_kit/http_client.rb +76 -0
- data/lib/freight_kit/model.rb +1 -3
- data/lib/freight_kit/models/address.rb +15 -0
- data/lib/freight_kit/models/contact.rb +3 -4
- data/lib/freight_kit/models/country.rb +20 -0
- data/lib/freight_kit/models/credential.rb +14 -16
- data/lib/freight_kit/models/date_time.rb +0 -2
- data/lib/freight_kit/models/document_response.rb +0 -2
- data/lib/freight_kit/models/label.rb +0 -2
- data/lib/freight_kit/models/location.rb +10 -25
- data/lib/freight_kit/models/pickup_response.rb +0 -2
- data/lib/freight_kit/models/price.rb +0 -2
- data/lib/freight_kit/models/rate.rb +0 -2
- data/lib/freight_kit/models/rate_response.rb +0 -2
- data/lib/freight_kit/models/region.rb +19 -0
- data/lib/freight_kit/models/response.rb +0 -2
- data/lib/freight_kit/models/shipment.rb +4 -6
- data/lib/freight_kit/models/shipment_event.rb +0 -2
- data/lib/freight_kit/models/terminal.rb +10 -0
- data/lib/freight_kit/models/tracking_response.rb +0 -2
- data/lib/freight_kit/package.rb +52 -54
- data/lib/freight_kit/package_item.rb +15 -15
- data/lib/freight_kit/packaging.rb +21 -26
- data/lib/freight_kit/platform.rb +0 -32
- data/lib/freight_kit/platforms/carrier_logistics.rb +331 -345
- data/lib/freight_kit/platforms/next_tms.rb +93 -0
- data/lib/freight_kit/platforms/the_great_information_factory.rb +500 -426
- data/lib/freight_kit/regions.rb +27 -0
- data/lib/freight_kit/shipment_packer.rb +36 -38
- data/lib/freight_kit/tariff/overlength_rule.rb +1 -5
- data/lib/freight_kit/tariff.rb +0 -2
- data/lib/freight_kit.rb +89 -25
- metadata +454 -84
- data/configuration/carriers/abfs.yml +0 -124
- data/configuration/carriers/btvp.yml +0 -84
- data/configuration/carriers/ccyq.yml +0 -121
- data/configuration/carriers/clni.yml +0 -113
- data/configuration/carriers/cnwy.yml +0 -113
- data/configuration/carriers/ctbv.yml +0 -117
- data/configuration/carriers/dcha.yml +0 -105
- data/configuration/carriers/dlds.yml +0 -111
- data/configuration/carriers/dphe.yml +0 -130
- data/configuration/carriers/drrq.yml +0 -131
- data/configuration/carriers/fcsy.yml +0 -102
- data/configuration/carriers/fwda.yml +0 -137
- data/configuration/carriers/jfj_transportation.yml +0 -2
- data/configuration/carriers/mtvl.yml +0 -12
- data/configuration/carriers/numk.yml +0 -14
- data/configuration/carriers/otcl.yml +0 -124
- data/configuration/carriers/pens.yml +0 -22
- data/configuration/carriers/rdfs.yml +0 -142
- data/configuration/carriers/saia.yml +0 -129
- data/configuration/carriers/sefl.yml +0 -115
- data/configuration/carriers/totl.yml +0 -111
- data/configuration/carriers/tqyl.yml +0 -28
- data/configuration/carriers/wrds.yml +0 -20
- data/configuration/platforms/carrier_logistics.yml +0 -25
- data/configuration/platforms/next.yml +0 -12
- data/configuration/platforms/the_great_information_factory.yml +0 -122
- data/freight_kit-0.1.18.gem +0 -0
- data/lib/freight_kit/api_clients.rb +0 -3
- data/lib/freight_kit/carriers/abfs.rb +0 -421
- data/lib/freight_kit/carriers/btvp.rb +0 -29
- data/lib/freight_kit/carriers/ccyq.rb +0 -317
- data/lib/freight_kit/carriers/clni.rb +0 -396
- data/lib/freight_kit/carriers/cnwy.rb +0 -327
- data/lib/freight_kit/carriers/ctbv.rb +0 -53
- data/lib/freight_kit/carriers/dcha.rb +0 -76
- data/lib/freight_kit/carriers/dlds.rb +0 -49
- data/lib/freight_kit/carriers/dphe.rb +0 -474
- data/lib/freight_kit/carriers/drrq.rb +0 -580
- data/lib/freight_kit/carriers/fcsy.rb +0 -57
- data/lib/freight_kit/carriers/fwda.rb +0 -744
- data/lib/freight_kit/carriers/mtvl.rb +0 -34
- data/lib/freight_kit/carriers/numk.rb +0 -58
- data/lib/freight_kit/carriers/otcl.rb +0 -528
- data/lib/freight_kit/carriers/pens.rb +0 -204
- data/lib/freight_kit/carriers/rdfs.rb +0 -521
- data/lib/freight_kit/carriers/sefl.rb +0 -342
- data/lib/freight_kit/carriers/totl.rb +0 -172
- data/lib/freight_kit/carriers/tqyl.rb +0 -339
- data/lib/freight_kit/carriers/wrds.rb +0 -246
- data/lib/freight_kit/helpers.rb +0 -6
- data/lib/freight_kit/platforms/next.rb +0 -101
- data/lib/freight_kit/platforms.rb +0 -5
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module FreightKit
|
|
2
|
+
class HTTPClient
|
|
3
|
+
# HTTPX plugin keeping connections open (HTTPX's persistent plugin) without risking duplicate
|
|
4
|
+
# rates, pickups or tenders.
|
|
5
|
+
#
|
|
6
|
+
# The persistent plugin retries any request failing with a connection error, but a POST may
|
|
7
|
+
# already have been processed by then, so only idempotent requests are retried.
|
|
8
|
+
# Streams refused by an HTTP/2 GOAWAY are resent by HTTPX itself, independently of retries.
|
|
9
|
+
module SafeRetries
|
|
10
|
+
IDEMPOTENT_METHODS = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'PUT'].freeze
|
|
11
|
+
|
|
12
|
+
module InstanceMethods
|
|
13
|
+
private
|
|
14
|
+
|
|
15
|
+
def retryable_request?(request, *) = super && IDEMPOTENT_METHODS.include?(request.verb)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
class << self
|
|
19
|
+
def load_dependencies(klass) = klass.plugin(:persistent)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module FreightKit
|
|
2
|
+
class HTTPClient
|
|
3
|
+
# HTTPX plugin decoding Zstandard ("zstd") response bodies, modeled on HTTPX's brotli plugin.
|
|
4
|
+
module Zstd
|
|
5
|
+
class Inflater
|
|
6
|
+
def initialize = @inflater = ::Zstd::StreamingDecompress.new
|
|
7
|
+
|
|
8
|
+
def call(chunk) = @inflater.decompress(chunk)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
module ResponseBodyClassMethods
|
|
12
|
+
def initialize_inflater_by_encoding(encoding, response, **) = encoding == 'zstd' ? Inflater.new : super
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
class << self
|
|
16
|
+
def extra_options(options)
|
|
17
|
+
supported_compression_formats = (['zstd'] + options.supported_compression_formats).freeze
|
|
18
|
+
|
|
19
|
+
headers = options.headers.merge('accept-encoding' => supported_compression_formats)
|
|
20
|
+
|
|
21
|
+
options.merge(headers: options.headers_class.new(headers), supported_compression_formats:)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def load_dependencies(*) = require('zstd-ruby')
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
module FreightKit
|
|
2
|
+
# Thin wrapper around HTTPX that negotiates Brotli/Zstandard compression, keeps connections
|
|
3
|
+
# open between requests and revalidates cached responses with conditional requests (ETag/Last-Modified).
|
|
4
|
+
#
|
|
5
|
+
# The cache and logger are hookable; they default to the host Rails/Hanami app's logger:
|
|
6
|
+
#
|
|
7
|
+
# FreightKit::HTTPClient.cache = Rails.cache
|
|
8
|
+
# FreightKit::HTTPClient.logger = Rails.logger
|
|
9
|
+
class HTTPClient
|
|
10
|
+
USER_AGENT = "freight_kit/#{VERSION} #{HTTPX::Options::USER_AGENT}".freeze
|
|
11
|
+
|
|
12
|
+
@sessions = Concurrent::Map.new
|
|
13
|
+
|
|
14
|
+
class << self
|
|
15
|
+
def cache = @cache ||= ActiveSupport::Cache::MemoryStore.new
|
|
16
|
+
|
|
17
|
+
def cache=(store)
|
|
18
|
+
@cache = store
|
|
19
|
+
@sessions.clear
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def get(url, **) = request(:get, url, **)
|
|
23
|
+
def logger = @logger || framework_logger || ::Logger.new($stdout, level: ENV.fetch('LOG_LEVEL', 'info'))
|
|
24
|
+
|
|
25
|
+
def logger=(logger)
|
|
26
|
+
@logger = logger
|
|
27
|
+
@sessions.clear
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def post(url, **) = request(:post, url, **)
|
|
31
|
+
|
|
32
|
+
def request(verb, url, body: nil, headers: {}, proxy: nil, query: nil)
|
|
33
|
+
options = { headers: }
|
|
34
|
+
options[:params] = query if query.present?
|
|
35
|
+
|
|
36
|
+
# Like HTTParty, hashes are form-encoded regardless of the Content-Type header
|
|
37
|
+
if body.is_a?(Hash)
|
|
38
|
+
options[:form] = body if body.present?
|
|
39
|
+
elsif body.present?
|
|
40
|
+
options[:body] = body
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
response = session(proxy.presence).request(verb.to_s.upcase, url, **options)
|
|
44
|
+
raise response.error if response.is_a?(HTTPX::ErrorResponse)
|
|
45
|
+
|
|
46
|
+
Response.new(response)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
private
|
|
50
|
+
|
|
51
|
+
def framework_logger
|
|
52
|
+
if defined?(::Rails) && ::Rails.respond_to?(:logger)
|
|
53
|
+
::Rails.logger
|
|
54
|
+
elsif defined?(::Hanami) && ::Hanami.respond_to?(:app?) && ::Hanami.app?
|
|
55
|
+
::Hanami.app['logger']
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Sessions own their connection pool, so they are built once (per proxy) and reused
|
|
60
|
+
def session(proxy)
|
|
61
|
+
@sessions.compute_if_absent(proxy) do
|
|
62
|
+
session = HTTPX.plugin(:brotli).plugin(Zstd).plugin(:follow_redirects)
|
|
63
|
+
.plugin(:response_cache, response_cache_store: CacheStore.new(cache))
|
|
64
|
+
.plugin(Revalidation)
|
|
65
|
+
.plugin(SafeRetries)
|
|
66
|
+
.with(close_on_fork: true, headers: { 'user-agent' => USER_AGENT })
|
|
67
|
+
|
|
68
|
+
logger = self.logger
|
|
69
|
+
session = session.with(debug: LogDevice.new(logger), debug_level: 2) if logger.level <= ::Logger::DEBUG
|
|
70
|
+
|
|
71
|
+
proxy ? session.plugin(:proxy).with(proxy: { uri: proxy }) : session
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
data/lib/freight_kit/model.rb
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
1
|
module FreightKit
|
|
4
2
|
class Model
|
|
5
3
|
include ActiveModel::AttributeAssignment
|
|
@@ -12,6 +10,6 @@ module FreightKit
|
|
|
12
10
|
def attributes
|
|
13
11
|
instance_values.with_indifferent_access
|
|
14
12
|
end
|
|
15
|
-
|
|
13
|
+
alias to_hash attributes
|
|
16
14
|
end
|
|
17
15
|
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module FreightKit
|
|
2
|
+
# Class representing a real, deliverable mailing address.
|
|
3
|
+
#
|
|
4
|
+
# @!attribute id [String, nil] Permanent UUID of a carrier's address. Applications store it, so never change it.
|
|
5
|
+
class Address < Model
|
|
6
|
+
attr_accessor :city, :id, :postal_code, :region_abbreviation, :street, :street2
|
|
7
|
+
attr_reader :country
|
|
8
|
+
|
|
9
|
+
def country=(country)
|
|
10
|
+
raise ArgumentError, 'country must be a FreightKit::Country' unless country.blank? || country.is_a?(Country)
|
|
11
|
+
|
|
12
|
+
@country = country.presence
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
1
|
module FreightKit
|
|
4
2
|
# Contact is the abstract base class for all contacts.
|
|
5
3
|
#
|
|
@@ -7,11 +5,12 @@ module FreightKit
|
|
|
7
5
|
# @!attribute department_name [String] Department name (like "Shipping Dept").
|
|
8
6
|
# @!attribute email [String] Email.
|
|
9
7
|
# @!attribute fax [String] E164 formatted fax number.
|
|
8
|
+
# @!attribute id [String, nil] Permanent UUID of a carrier's contact. Applications store it, so never change it.
|
|
10
9
|
# @!attribute name [String] Name of person.
|
|
11
10
|
# @!attribute phone [String] E164 formatted phone number.
|
|
12
11
|
class Contact < Model
|
|
13
|
-
attr_accessor :company_name, :department, :email, :fax, :name, :phone
|
|
12
|
+
attr_accessor :company_name, :department, :email, :fax, :id, :name, :phone
|
|
14
13
|
|
|
15
|
-
|
|
14
|
+
alias company company_name
|
|
16
15
|
end
|
|
17
16
|
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module FreightKit
|
|
2
|
+
class Country
|
|
3
|
+
attr_reader :iso31661_alpha2, :iso31661_alpha3, :name, :un_code
|
|
4
|
+
|
|
5
|
+
def initialize(iso31661_alpha2:, iso31661_alpha3:, name:, un_code: nil)
|
|
6
|
+
@iso31661_alpha2 = iso31661_alpha2
|
|
7
|
+
@iso31661_alpha3 = iso31661_alpha3
|
|
8
|
+
@name = name
|
|
9
|
+
@un_code = un_code
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def ==(other) = other.is_a?(Country) && other.id == id
|
|
13
|
+
alias eql? ==
|
|
14
|
+
|
|
15
|
+
def hash = [self.class, id].hash
|
|
16
|
+
def id = iso31661_alpha2
|
|
17
|
+
def inspect = "#<#{self.class.name} #{iso31661_alpha2}>"
|
|
18
|
+
def regions = FreightKit::Regions.all.select { |region| region.country == self }
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
1
|
module FreightKit
|
|
4
2
|
# Class representing credentials.
|
|
5
3
|
#
|
|
@@ -70,7 +68,7 @@ module FreightKit
|
|
|
70
68
|
end
|
|
71
69
|
end
|
|
72
70
|
|
|
73
|
-
hash.
|
|
71
|
+
hash.each_key do |k|
|
|
74
72
|
next if k == :type
|
|
75
73
|
|
|
76
74
|
singleton_class.class_eval { attr_accessor(k.to_s) } unless singleton_class.respond_to?(k)
|
|
@@ -99,19 +97,19 @@ module FreightKit
|
|
|
99
97
|
url = url.to_s
|
|
100
98
|
|
|
101
99
|
@watir_args = [
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
100
|
+
browser,
|
|
101
|
+
{
|
|
102
|
+
options: {
|
|
103
|
+
prefs: {
|
|
104
|
+
download: {
|
|
105
|
+
directory_upgrade: true,
|
|
106
|
+
prompt_for_download: false
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
url:
|
|
111
|
+
}
|
|
112
|
+
]
|
|
115
113
|
end
|
|
116
114
|
end
|
|
117
115
|
end
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
1
|
module FreightKit
|
|
4
2
|
# Class representing a location.
|
|
5
3
|
#
|
|
@@ -57,38 +55,27 @@ module FreightKit
|
|
|
57
55
|
attr_reader :contact, :country, :lat, :lng, :type
|
|
58
56
|
|
|
59
57
|
def contact=(contact)
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
raise ArgumentError, 'contact must be a Contact' unless contact.is_a?(FreightKit::Contact)
|
|
58
|
+
raise ArgumentError, 'contact must be a Contact' unless contact.blank? || contact.is_a?(FreightKit::Contact)
|
|
63
59
|
|
|
64
|
-
@contact = contact
|
|
60
|
+
@contact = contact.presence
|
|
65
61
|
end
|
|
66
62
|
|
|
67
63
|
def country=(country)
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
if country.is_a?(ActiveUtils::Country)
|
|
71
|
-
@country = country
|
|
72
|
-
return country
|
|
73
|
-
end
|
|
64
|
+
raise ArgumentError, 'country must be an ActiveUtils::Country' unless country.blank? || country.is_a?(ActiveUtils::Country)
|
|
74
65
|
|
|
75
|
-
|
|
66
|
+
@country = country.presence
|
|
76
67
|
end
|
|
77
68
|
|
|
78
69
|
def lat=(num)
|
|
79
|
-
|
|
70
|
+
raise ArgumentError, 'lat must be a BigNum' unless num.blank? || num.is_a?(BigNum)
|
|
80
71
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
raise ArgumentError, 'lat must be a BigNum'
|
|
72
|
+
@lat = num.presence
|
|
84
73
|
end
|
|
85
74
|
|
|
86
75
|
def lng=(num)
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
return @lng = num if num.is_a?(BigNum)
|
|
76
|
+
raise ArgumentError, 'lng must be a BigNum' unless num.blank? || num.is_a?(BigNum)
|
|
90
77
|
|
|
91
|
-
|
|
78
|
+
@lng = num.presence
|
|
92
79
|
end
|
|
93
80
|
|
|
94
81
|
def time_zone
|
|
@@ -98,11 +85,9 @@ module FreightKit
|
|
|
98
85
|
end
|
|
99
86
|
|
|
100
87
|
def type=(value)
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
raise ArgumentError, "type must be one of :#{TYPES.join(", :")}" if TYPES.exclude?(value)
|
|
88
|
+
raise ArgumentError, "type must be one of :#{TYPES.join(', :')}" unless value.blank? || TYPES.include?(value)
|
|
104
89
|
|
|
105
|
-
@type = value
|
|
90
|
+
@type = value.presence
|
|
106
91
|
end
|
|
107
92
|
end
|
|
108
93
|
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module FreightKit
|
|
2
|
+
class Region
|
|
3
|
+
attr_reader :abbreviation, :country, :iso31662, :name
|
|
4
|
+
|
|
5
|
+
def initialize(abbreviation:, country:, iso31662:, name:)
|
|
6
|
+
@abbreviation = abbreviation
|
|
7
|
+
@country = country
|
|
8
|
+
@iso31662 = iso31662
|
|
9
|
+
@name = name
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def ==(other) = other.is_a?(Region) && other.id == id
|
|
13
|
+
alias eql? ==
|
|
14
|
+
|
|
15
|
+
def hash = [self.class, id].hash
|
|
16
|
+
def id = iso31662
|
|
17
|
+
def inspect = "#<#{self.class.name} #{iso31662}>"
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
1
|
module FreightKit
|
|
4
2
|
# Shipment is the abstract base class for all rate requests.
|
|
5
3
|
#
|
|
@@ -23,16 +21,16 @@ module FreightKit
|
|
|
23
21
|
:pro
|
|
24
22
|
attr_reader :pickup_at
|
|
25
23
|
|
|
24
|
+
def hazmat?
|
|
25
|
+
packages.map(&:hazmat?).any?(true)
|
|
26
|
+
end
|
|
27
|
+
|
|
26
28
|
def loose?
|
|
27
29
|
return false if @packages.blank?
|
|
28
30
|
|
|
29
31
|
packages.map(&:packaging).map(&:pallet?).none?(true)
|
|
30
32
|
end
|
|
31
33
|
|
|
32
|
-
def hazmat?
|
|
33
|
-
packages.map(&:hazmat?).any?(true)
|
|
34
|
-
end
|
|
35
|
-
|
|
36
34
|
def loose_and_palletized?
|
|
37
35
|
!loose? && !palletized?
|
|
38
36
|
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
module FreightKit
|
|
2
|
+
# Class representing a carrier's terminal.
|
|
3
|
+
#
|
|
4
|
+
# @!attribute address [FreightKit::Address] Address.
|
|
5
|
+
# @!attribute id [String] Permanent UUID. Applications store it, so never change it.
|
|
6
|
+
# @!attribute phone [String] E164 formatted phone number.
|
|
7
|
+
class Terminal < Model
|
|
8
|
+
attr_accessor :address, :id, :phone
|
|
9
|
+
end
|
|
10
|
+
end
|
data/lib/freight_kit/package.rb
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
1
|
module FreightKit # :nodoc:
|
|
4
2
|
class Package
|
|
5
3
|
class << self
|
|
@@ -43,7 +41,7 @@ module FreightKit # :nodoc:
|
|
|
43
41
|
[
|
|
44
42
|
dimensions[:height].presence,
|
|
45
43
|
dimensions[:width].presence,
|
|
46
|
-
dimensions[:length].presence
|
|
44
|
+
dimensions[:length].presence
|
|
47
45
|
]
|
|
48
46
|
else
|
|
49
47
|
dimensions
|
|
@@ -71,7 +69,7 @@ module FreightKit # :nodoc:
|
|
|
71
69
|
Measured::Weight,
|
|
72
70
|
@weight_unit_system,
|
|
73
71
|
:grams,
|
|
74
|
-
:ounces
|
|
72
|
+
:ounces
|
|
75
73
|
)
|
|
76
74
|
|
|
77
75
|
@each_weight = attribute_from_metric_or_imperial(
|
|
@@ -79,7 +77,7 @@ module FreightKit # :nodoc:
|
|
|
79
77
|
Measured::Weight,
|
|
80
78
|
@weight_unit_system,
|
|
81
79
|
:grams,
|
|
82
|
-
:ounces
|
|
80
|
+
:ounces
|
|
83
81
|
)
|
|
84
82
|
|
|
85
83
|
if @dimensions.blank?
|
|
@@ -107,6 +105,10 @@ module FreightKit # :nodoc:
|
|
|
107
105
|
@packaging = Packaging.new(packaging_type)
|
|
108
106
|
end
|
|
109
107
|
|
|
108
|
+
def calculated_freight_class
|
|
109
|
+
sanitized_freight_class(density_to_freight_class(density))
|
|
110
|
+
end
|
|
111
|
+
|
|
110
112
|
def cubic_ft(each_or_total)
|
|
111
113
|
q = case each_or_total
|
|
112
114
|
when :each then 1
|
|
@@ -123,39 +125,31 @@ module FreightKit # :nodoc:
|
|
|
123
125
|
format('%0.2f', cubic_ft).to_f
|
|
124
126
|
end
|
|
125
127
|
|
|
126
|
-
def
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
density = pounds(:each).to_f / cubic_ft(:each)
|
|
130
|
-
format('%0.2f', density).to_f
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
def calculated_freight_class
|
|
134
|
-
sanitized_freight_class(density_to_freight_class(density))
|
|
128
|
+
def cylinder?
|
|
129
|
+
@cylinder
|
|
135
130
|
end
|
|
136
131
|
|
|
137
132
|
def declared_freight_class
|
|
138
133
|
@declared_freight_class || @options[:declared_freight_class]
|
|
139
134
|
end
|
|
140
135
|
|
|
141
|
-
def
|
|
142
|
-
|
|
143
|
-
end
|
|
136
|
+
def density
|
|
137
|
+
return unless inches[..2].all?(&:present?) && pounds(:each)
|
|
144
138
|
|
|
145
|
-
|
|
146
|
-
|
|
139
|
+
density = pounds(:each).to_f / cubic_ft(:each)
|
|
140
|
+
format('%0.2f', density).to_f
|
|
147
141
|
end
|
|
148
142
|
|
|
149
|
-
def
|
|
150
|
-
|
|
143
|
+
def freight_class
|
|
144
|
+
declared_freight_class.presence || calculated_freight_class
|
|
151
145
|
end
|
|
152
146
|
|
|
153
147
|
def height(unit)
|
|
154
148
|
@dimensions[0].convert_to(unit).value.to_f
|
|
155
149
|
end
|
|
156
150
|
|
|
157
|
-
def
|
|
158
|
-
@
|
|
151
|
+
def length(unit)
|
|
152
|
+
@dimensions[2].convert_to(unit).value.to_f
|
|
159
153
|
end
|
|
160
154
|
|
|
161
155
|
def oversized?
|
|
@@ -166,7 +160,11 @@ module FreightKit # :nodoc:
|
|
|
166
160
|
@unpackaged
|
|
167
161
|
end
|
|
168
162
|
|
|
169
|
-
|
|
163
|
+
def width(unit)
|
|
164
|
+
@dimensions[1].convert_to(unit).value.to_f
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
alias tube? cylinder?
|
|
170
168
|
|
|
171
169
|
def gift?
|
|
172
170
|
@gift
|
|
@@ -179,36 +177,36 @@ module FreightKit # :nodoc:
|
|
|
179
177
|
def ounces(options = {})
|
|
180
178
|
weight(options).convert_to(:oz).value.to_f
|
|
181
179
|
end
|
|
182
|
-
|
|
180
|
+
alias oz ounces
|
|
183
181
|
|
|
184
182
|
def grams(options = {})
|
|
185
183
|
weight(options).convert_to(:g).value.to_f
|
|
186
184
|
end
|
|
187
|
-
|
|
185
|
+
alias g grams
|
|
188
186
|
|
|
189
187
|
def pounds(args)
|
|
190
188
|
weight(*args).convert_to(:lb).value.to_f
|
|
191
189
|
end
|
|
192
|
-
|
|
193
|
-
|
|
190
|
+
alias lb pounds
|
|
191
|
+
alias lbs pounds
|
|
194
192
|
|
|
195
193
|
def kilograms(options = {})
|
|
196
194
|
weight(options).convert_to(:kg).value.to_f
|
|
197
195
|
end
|
|
198
|
-
|
|
199
|
-
|
|
196
|
+
alias kg kilograms
|
|
197
|
+
alias kgs kilograms
|
|
200
198
|
|
|
201
199
|
def inches(measurement = nil)
|
|
202
200
|
@inches ||= @dimensions.map { |m| m.convert_to(:in).value.to_f }
|
|
203
201
|
measurement.nil? ? @inches : measure(measurement, @inches)
|
|
204
202
|
end
|
|
205
|
-
|
|
203
|
+
alias in inches
|
|
206
204
|
|
|
207
205
|
def centimetres(measurement = nil)
|
|
208
206
|
@centimetres ||= @dimensions.map { |m| m.convert_to(:cm).value.to_f }
|
|
209
207
|
measurement.nil? ? @centimetres : measure(measurement, @centimetres)
|
|
210
208
|
end
|
|
211
|
-
|
|
209
|
+
alias cm centimetres
|
|
212
210
|
|
|
213
211
|
def dim_weight
|
|
214
212
|
return if inches(:length).blank? || inches(:width).blank? || inches(:height).blank? || pounds(:each).blank?
|
|
@@ -240,32 +238,22 @@ module FreightKit # :nodoc:
|
|
|
240
238
|
return 60 if density > 30
|
|
241
239
|
|
|
242
240
|
density_table = [
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
241
|
+
[1, 2, 300],
|
|
242
|
+
[2, 4, 250],
|
|
243
|
+
[4, 6, 175],
|
|
244
|
+
[6, 8, 125],
|
|
245
|
+
[8, 10, 100],
|
|
246
|
+
[10, 12, 92.5],
|
|
247
|
+
[12, 15, 85],
|
|
248
|
+
[15, 22.5, 70],
|
|
249
|
+
[22.5, 30, 65],
|
|
250
|
+
[30, 35, 60]
|
|
251
|
+
]
|
|
254
252
|
density_table.each do |density_row|
|
|
255
253
|
return density_row[2] if (density >= density_row[0]) && (density < density_row[1])
|
|
256
254
|
end
|
|
257
255
|
end
|
|
258
256
|
|
|
259
|
-
def sanitized_freight_class(freight_class)
|
|
260
|
-
return if freight_class.blank?
|
|
261
|
-
|
|
262
|
-
if VALID_FREIGHT_CLASSES.include?(freight_class)
|
|
263
|
-
return freight_class.to_i == freight_class ? freight_class.to_i : freight_class
|
|
264
|
-
end
|
|
265
|
-
|
|
266
|
-
nil
|
|
267
|
-
end
|
|
268
|
-
|
|
269
257
|
def measure(measurement, ary)
|
|
270
258
|
case measurement
|
|
271
259
|
when Integer then ary[measurement]
|
|
@@ -291,6 +279,16 @@ module FreightKit # :nodoc:
|
|
|
291
279
|
end
|
|
292
280
|
end
|
|
293
281
|
|
|
282
|
+
def sanitized_freight_class(freight_class)
|
|
283
|
+
return if freight_class.blank?
|
|
284
|
+
|
|
285
|
+
if VALID_FREIGHT_CLASSES.include?(freight_class)
|
|
286
|
+
return freight_class.to_i == freight_class ? freight_class.to_i : freight_class
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
nil
|
|
290
|
+
end
|
|
291
|
+
|
|
294
292
|
def weight(which_weight, options = {})
|
|
295
293
|
weight = case which_weight
|
|
296
294
|
when :each then @each_weight
|
|
@@ -304,7 +302,7 @@ module FreightKit # :nodoc:
|
|
|
304
302
|
weight
|
|
305
303
|
when :volumetric, :dimensional
|
|
306
304
|
@volumetric_weight ||= begin
|
|
307
|
-
m = Measured::Weight.new(
|
|
305
|
+
m = Measured::Weight.new(centimetres(:box_volume) / 6.0, :grams)
|
|
308
306
|
@weight_unit_system == :imperial ? m.convert_to(:oz) : m
|
|
309
307
|
end
|
|
310
308
|
when :billable
|