freight_kit 0.1.20 → 0.1.22
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/README.md +6 -5
- data/Rakefile +4 -0
- data/VERSION +1 -1
- data/configuration/locations/amazon_warehouses.yml +3330 -0
- data/freight_kit-0.1.21.gem +0 -0
- data/freight_kit.gemspec +11 -22
- data/lib/freight_kit/address_normalizer.rb +24 -0
- data/lib/freight_kit/amazon_warehouse.rb +33 -0
- data/lib/freight_kit/api_clients/soap_client.rb +33 -10
- data/lib/freight_kit/carrier.rb +248 -302
- 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 +475 -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 +31 -0
- data/lib/freight_kit/carriers/amado_trucking.rb +31 -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 +474 -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 +31 -0
- data/lib/freight_kit/carriers/crosby_trucking_service.rb +29 -0
- data/lib/freight_kit/carriers/cross_country_freight_solutions.rb +408 -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 +573 -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 +781 -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 +555 -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 +206 -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 +669 -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 +456 -362
- 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 +441 -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 +605 -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 +339 -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 +265 -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 +415 -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 +331 -34
- 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/rate_limit_error.rb +12 -0
- data/lib/freight_kit/errors/response_error.rb +0 -2
- data/lib/freight_kit/errors/shipment_not_found_error.rb +0 -2
- data/lib/freight_kit/errors/unserviceable_accessorials_error.rb +1 -5
- 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 -14
- 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 +2 -4
- data/lib/freight_kit/http_client/httpi_adapter.rb +37 -0
- data/lib/freight_kit/http_client/log_device.rb +0 -2
- data/lib/freight_kit/http_client/response.rb +0 -2
- data/lib/freight_kit/http_client/revalidation.rb +0 -2
- data/lib/freight_kit/http_client/safe_retries.rb +17 -3
- data/lib/freight_kit/http_client/zstd.rb +2 -4
- data/lib/freight_kit/http_client.rb +21 -21
- 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 +3 -18
- 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 +5 -14
- 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 -64
- data/lib/freight_kit/package_item.rb +14 -14
- data/lib/freight_kit/packaging.rb +6 -26
- data/lib/freight_kit/platform.rb +0 -32
- data/lib/freight_kit/platforms/carrier_logistics.rb +326 -345
- data/lib/freight_kit/platforms/dsdc.rb +82 -0
- data/lib/freight_kit/platforms/next_tms/graphql_client/mutation/quote_create.rb +32 -0
- data/lib/freight_kit/platforms/next_tms/graphql_client/mutation/shipment_create.rb +29 -0
- data/lib/freight_kit/platforms/next_tms/graphql_client/query/broker_carrier.rb +37 -0
- data/lib/freight_kit/platforms/next_tms/graphql_client/query/broker_carriers.rb +45 -0
- data/lib/freight_kit/platforms/next_tms/graphql_client/query/broker_customer.rb +54 -0
- data/lib/freight_kit/platforms/next_tms/graphql_client/query/broker_customers.rb +62 -0
- data/lib/freight_kit/platforms/next_tms/graphql_client/query/carrier.rb +22 -0
- data/lib/freight_kit/platforms/next_tms/graphql_client/query/carriers.rb +30 -0
- data/lib/freight_kit/platforms/next_tms/graphql_client/query/customer.rb +20 -0
- data/lib/freight_kit/platforms/next_tms/graphql_client/query/customers.rb +28 -0
- data/lib/freight_kit/platforms/next_tms/graphql_client/query/invoice.rb +31 -0
- data/lib/freight_kit/platforms/next_tms/graphql_client/query/invoices.rb +39 -0
- data/lib/freight_kit/platforms/next_tms/graphql_client/query/shipment.rb +102 -0
- data/lib/freight_kit/platforms/next_tms/graphql_client/query/shipment_documents.rb +29 -0
- data/lib/freight_kit/platforms/next_tms/graphql_client/query/shipments.rb +110 -0
- data/lib/freight_kit/platforms/next_tms/graphql_client.rb +22 -0
- data/lib/freight_kit/platforms/next_tms/orm/address.rb +22 -0
- data/lib/freight_kit/platforms/next_tms/orm/base.rb +120 -0
- data/lib/freight_kit/platforms/next_tms/orm/broker_carrier.rb +18 -0
- data/lib/freight_kit/platforms/next_tms/orm/broker_customer.rb +22 -0
- data/lib/freight_kit/platforms/next_tms/orm/carrier.rb +14 -0
- data/lib/freight_kit/platforms/next_tms/orm/collection.rb +335 -0
- data/lib/freight_kit/platforms/next_tms/orm/customer.rb +12 -0
- data/lib/freight_kit/platforms/next_tms/orm/invoice.rb +21 -0
- data/lib/freight_kit/platforms/next_tms/orm/record_not_found_error.rb +9 -0
- data/lib/freight_kit/platforms/next_tms/orm/shipment.rb +50 -0
- data/lib/freight_kit/platforms/next_tms/orm.rb +38 -0
- data/lib/freight_kit/platforms/next_tms.rb +452 -0
- data/lib/freight_kit/platforms/the_great_information_factory.rb +492 -425
- 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 +103 -11
- data/schemas/next_tms.json +110710 -0
- metadata +443 -55
- 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/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 -310
- 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 -472
- 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 -520
- 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 -337
- data/lib/freight_kit/carriers/wrds.rb +0 -246
- data/lib/freight_kit/platforms/next.rb +0 -101
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
1
|
module FreightKit
|
|
4
2
|
class HTTPClient
|
|
5
3
|
# HTTPX plugin decoding Zstandard ("zstd") response bodies, modeled on HTTPX's brotli plugin.
|
|
@@ -15,8 +13,6 @@ module FreightKit
|
|
|
15
13
|
end
|
|
16
14
|
|
|
17
15
|
class << self
|
|
18
|
-
def load_dependencies(*) = require('zstd-ruby')
|
|
19
|
-
|
|
20
16
|
def extra_options(options)
|
|
21
17
|
supported_compression_formats = (['zstd'] + options.supported_compression_formats).freeze
|
|
22
18
|
|
|
@@ -24,6 +20,8 @@ module FreightKit
|
|
|
24
20
|
|
|
25
21
|
options.merge(headers: options.headers_class.new(headers), supported_compression_formats:)
|
|
26
22
|
end
|
|
23
|
+
|
|
24
|
+
def load_dependencies(*) = require('zstd-ruby')
|
|
27
25
|
end
|
|
28
26
|
end
|
|
29
27
|
end
|
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
1
|
module FreightKit
|
|
4
2
|
# Thin wrapper around HTTPX that negotiates Brotli/Zstandard compression, keeps connections
|
|
5
3
|
# open between requests and revalidates cached responses with conditional requests (ETag/Last-Modified).
|
|
6
4
|
#
|
|
7
|
-
# The cache
|
|
5
|
+
# The cache defaults to {FreightKit.cache}, and the logger to the host Rails/Hanami app's logger. Both are hookable:
|
|
8
6
|
#
|
|
9
7
|
# FreightKit::HTTPClient.cache = Rails.cache
|
|
10
8
|
# FreightKit::HTTPClient.logger = Rails.logger
|
|
11
9
|
class HTTPClient
|
|
10
|
+
USER_AGENT = "freight_kit/#{VERSION} #{HTTPX::Options::USER_AGENT}".freeze
|
|
11
|
+
|
|
12
12
|
@sessions = Concurrent::Map.new
|
|
13
13
|
|
|
14
14
|
class << self
|
|
15
|
-
def cache = @cache
|
|
15
|
+
def cache = @cache || FreightKit.cache
|
|
16
16
|
|
|
17
17
|
def cache=(store)
|
|
18
18
|
@cache = store
|
|
19
|
-
|
|
19
|
+
reset
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
+
def get(url, **) = request(:get, url, **)
|
|
22
23
|
def logger = @logger || framework_logger || ::Logger.new($stdout, level: ENV.fetch('LOG_LEVEL', 'info'))
|
|
23
24
|
|
|
24
25
|
def logger=(logger)
|
|
25
26
|
@logger = logger
|
|
26
|
-
|
|
27
|
+
reset
|
|
27
28
|
end
|
|
28
29
|
|
|
29
|
-
def get(url, **) = request(:get, url, **)
|
|
30
|
-
|
|
31
30
|
def post(url, **) = request(:post, url, **)
|
|
32
31
|
|
|
33
|
-
def request(verb, url, body: nil, headers: {},
|
|
32
|
+
def request(verb, url, body: nil, headers: {}, proxy_url: nil, query: nil, read_timeout: nil)
|
|
34
33
|
options = { headers: }
|
|
35
34
|
options[:params] = query if query.present?
|
|
35
|
+
options[:timeout] = { read_timeout: } if read_timeout
|
|
36
36
|
|
|
37
37
|
# Like HTTParty, hashes are form-encoded regardless of the Content-Type header
|
|
38
38
|
if body.is_a?(Hash)
|
|
@@ -41,12 +41,15 @@ module FreightKit
|
|
|
41
41
|
options[:body] = body
|
|
42
42
|
end
|
|
43
43
|
|
|
44
|
-
response = session(
|
|
44
|
+
response = session(proxy_url.presence).request(verb.to_s.upcase, url, **options)
|
|
45
45
|
raise response.error if response.is_a?(HTTPX::ErrorResponse)
|
|
46
46
|
|
|
47
47
|
Response.new(response)
|
|
48
48
|
end
|
|
49
49
|
|
|
50
|
+
# Rebuilds sessions on their next request, e.g. after the cache or logger changes.
|
|
51
|
+
def reset = @sessions.clear
|
|
52
|
+
|
|
50
53
|
private
|
|
51
54
|
|
|
52
55
|
def framework_logger
|
|
@@ -58,21 +61,18 @@ module FreightKit
|
|
|
58
61
|
end
|
|
59
62
|
|
|
60
63
|
# Sessions own their connection pool, so they are built once (per proxy) and reused
|
|
61
|
-
def session(
|
|
62
|
-
@sessions.compute_if_absent(
|
|
63
|
-
session = HTTPX
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
.plugin(Revalidation)
|
|
69
|
-
.plugin(SafeRetries)
|
|
70
|
-
.with(close_on_fork: true)
|
|
64
|
+
def session(proxy_url)
|
|
65
|
+
@sessions.compute_if_absent(proxy_url) do
|
|
66
|
+
session = HTTPX.plugin(:brotli).plugin(Zstd).plugin(:follow_redirects)
|
|
67
|
+
.plugin(:response_cache, response_cache_store: CacheStore.new(cache))
|
|
68
|
+
.plugin(Revalidation)
|
|
69
|
+
.plugin(SafeRetries)
|
|
70
|
+
.with(close_on_fork: true, headers: { 'user-agent' => USER_AGENT })
|
|
71
71
|
|
|
72
72
|
logger = self.logger
|
|
73
73
|
session = session.with(debug: LogDevice.new(logger), debug_level: 2) if logger.level <= ::Logger::DEBUG
|
|
74
74
|
|
|
75
|
-
|
|
75
|
+
proxy_url ? session.plugin(:proxy).with(proxy: { uri: proxy_url }) : session
|
|
76
76
|
end
|
|
77
77
|
end
|
|
78
78
|
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
|
#
|
|
@@ -53,7 +51,7 @@ module FreightKit
|
|
|
53
51
|
when :api, :website
|
|
54
52
|
{ password: String }
|
|
55
53
|
when :api_proxy
|
|
56
|
-
{
|
|
54
|
+
{ proxy_url: String }
|
|
57
55
|
when :oauth2
|
|
58
56
|
{ access_token: String, expires_at: ::DateTime, scope: String }
|
|
59
57
|
when :selenoid
|
|
@@ -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)
|
|
@@ -98,20 +96,7 @@ module FreightKit
|
|
|
98
96
|
url.path = '/wd/hub/'
|
|
99
97
|
url = url.to_s
|
|
100
98
|
|
|
101
|
-
@watir_args = [
|
|
102
|
-
browser,
|
|
103
|
-
{
|
|
104
|
-
options: {
|
|
105
|
-
prefs: {
|
|
106
|
-
download: {
|
|
107
|
-
directory_upgrade: true,
|
|
108
|
-
prompt_for_download: false
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
},
|
|
112
|
-
url:
|
|
113
|
-
},
|
|
114
|
-
]
|
|
99
|
+
@watir_args = [browser, { options: { prefs: { download: { directory_upgrade: true, prompt_for_download: false } } }, url: }]
|
|
115
100
|
end
|
|
116
101
|
end
|
|
117
102
|
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
|
#
|
|
@@ -13,26 +11,19 @@ module FreightKit
|
|
|
13
11
|
# @!attribute po_number [String] Purchase order number (also known as PO #).
|
|
14
12
|
# @!attribute pickup_at [FreightKit::DateTime] Pickup date/time.
|
|
15
13
|
class Shipment < Model
|
|
16
|
-
attr_accessor :accessorials,
|
|
17
|
-
:declared_value_cents,
|
|
18
|
-
:destination,
|
|
19
|
-
:origin,
|
|
20
|
-
:order_number,
|
|
21
|
-
:packages,
|
|
22
|
-
:po_number,
|
|
23
|
-
:pro
|
|
14
|
+
attr_accessor :accessorials, :declared_value_cents, :destination, :origin, :order_number, :packages, :po_number, :pro
|
|
24
15
|
attr_reader :pickup_at
|
|
25
16
|
|
|
17
|
+
def hazmat?
|
|
18
|
+
packages.map(&:hazmat?).any?(true)
|
|
19
|
+
end
|
|
20
|
+
|
|
26
21
|
def loose?
|
|
27
22
|
return false if @packages.blank?
|
|
28
23
|
|
|
29
24
|
packages.map(&:packaging).map(&:pallet?).none?(true)
|
|
30
25
|
end
|
|
31
26
|
|
|
32
|
-
def hazmat?
|
|
33
|
-
packages.map(&:hazmat?).any?(true)
|
|
34
|
-
end
|
|
35
|
-
|
|
36
27
|
def loose_and_palletized?
|
|
37
28
|
!loose? && !palletized?
|
|
38
29
|
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
|
|
@@ -66,20 +64,14 @@ module FreightKit # :nodoc:
|
|
|
66
64
|
|
|
67
65
|
@quantity = options[:quantity] || 1
|
|
68
66
|
|
|
69
|
-
@total_weight = attribute_from_metric_or_imperial(
|
|
70
|
-
total_grams_or_ounces,
|
|
71
|
-
Measured::Weight,
|
|
72
|
-
@weight_unit_system,
|
|
73
|
-
:grams,
|
|
74
|
-
:ounces,
|
|
75
|
-
)
|
|
67
|
+
@total_weight = attribute_from_metric_or_imperial(total_grams_or_ounces, Measured::Weight, @weight_unit_system, :grams, :ounces)
|
|
76
68
|
|
|
77
69
|
@each_weight = attribute_from_metric_or_imperial(
|
|
78
70
|
total_grams_or_ounces / @quantity.to_f,
|
|
79
71
|
Measured::Weight,
|
|
80
72
|
@weight_unit_system,
|
|
81
73
|
:grams,
|
|
82
|
-
:ounces
|
|
74
|
+
:ounces
|
|
83
75
|
)
|
|
84
76
|
|
|
85
77
|
if @dimensions.blank?
|
|
@@ -93,9 +85,7 @@ module FreightKit # :nodoc:
|
|
|
93
85
|
@dimensions = @dimensions.map do |l|
|
|
94
86
|
attribute_from_metric_or_imperial(l, Measured::Length, @dimensions_unit_system, :centimetres, :inches)
|
|
95
87
|
end
|
|
96
|
-
2.downto(@dimensions.length)
|
|
97
|
-
@dimensions.unshift(@dimensions[0])
|
|
98
|
-
end
|
|
88
|
+
2.downto(@dimensions.length) { |_n| @dimensions.unshift(@dimensions[0]) }
|
|
99
89
|
end
|
|
100
90
|
|
|
101
91
|
@value = Package.cents_from(options[:value])
|
|
@@ -107,6 +97,10 @@ module FreightKit # :nodoc:
|
|
|
107
97
|
@packaging = Packaging.new(packaging_type)
|
|
108
98
|
end
|
|
109
99
|
|
|
100
|
+
def calculated_freight_class
|
|
101
|
+
sanitized_freight_class(density_to_freight_class(density))
|
|
102
|
+
end
|
|
103
|
+
|
|
110
104
|
def cubic_ft(each_or_total)
|
|
111
105
|
q = case each_or_total
|
|
112
106
|
when :each then 1
|
|
@@ -123,39 +117,31 @@ module FreightKit # :nodoc:
|
|
|
123
117
|
format('%0.2f', cubic_ft).to_f
|
|
124
118
|
end
|
|
125
119
|
|
|
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))
|
|
120
|
+
def cylinder?
|
|
121
|
+
@cylinder
|
|
135
122
|
end
|
|
136
123
|
|
|
137
124
|
def declared_freight_class
|
|
138
125
|
@declared_freight_class || @options[:declared_freight_class]
|
|
139
126
|
end
|
|
140
127
|
|
|
141
|
-
def
|
|
142
|
-
|
|
143
|
-
end
|
|
128
|
+
def density
|
|
129
|
+
return unless inches[..2].all?(&:present?) && pounds(:each)
|
|
144
130
|
|
|
145
|
-
|
|
146
|
-
|
|
131
|
+
density = pounds(:each).to_f / cubic_ft(:each)
|
|
132
|
+
format('%0.2f', density).to_f
|
|
147
133
|
end
|
|
148
134
|
|
|
149
|
-
def
|
|
150
|
-
|
|
135
|
+
def freight_class
|
|
136
|
+
declared_freight_class.presence || calculated_freight_class
|
|
151
137
|
end
|
|
152
138
|
|
|
153
139
|
def height(unit)
|
|
154
140
|
@dimensions[0].convert_to(unit).value.to_f
|
|
155
141
|
end
|
|
156
142
|
|
|
157
|
-
def
|
|
158
|
-
@
|
|
143
|
+
def length(unit)
|
|
144
|
+
@dimensions[2].convert_to(unit).value.to_f
|
|
159
145
|
end
|
|
160
146
|
|
|
161
147
|
def oversized?
|
|
@@ -166,7 +152,11 @@ module FreightKit # :nodoc:
|
|
|
166
152
|
@unpackaged
|
|
167
153
|
end
|
|
168
154
|
|
|
169
|
-
|
|
155
|
+
def width(unit)
|
|
156
|
+
@dimensions[1].convert_to(unit).value.to_f
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
alias tube? cylinder?
|
|
170
160
|
|
|
171
161
|
def gift?
|
|
172
162
|
@gift
|
|
@@ -179,36 +169,36 @@ module FreightKit # :nodoc:
|
|
|
179
169
|
def ounces(options = {})
|
|
180
170
|
weight(options).convert_to(:oz).value.to_f
|
|
181
171
|
end
|
|
182
|
-
|
|
172
|
+
alias oz ounces
|
|
183
173
|
|
|
184
174
|
def grams(options = {})
|
|
185
175
|
weight(options).convert_to(:g).value.to_f
|
|
186
176
|
end
|
|
187
|
-
|
|
177
|
+
alias g grams
|
|
188
178
|
|
|
189
179
|
def pounds(args)
|
|
190
180
|
weight(*args).convert_to(:lb).value.to_f
|
|
191
181
|
end
|
|
192
|
-
|
|
193
|
-
|
|
182
|
+
alias lb pounds
|
|
183
|
+
alias lbs pounds
|
|
194
184
|
|
|
195
185
|
def kilograms(options = {})
|
|
196
186
|
weight(options).convert_to(:kg).value.to_f
|
|
197
187
|
end
|
|
198
|
-
|
|
199
|
-
|
|
188
|
+
alias kg kilograms
|
|
189
|
+
alias kgs kilograms
|
|
200
190
|
|
|
201
191
|
def inches(measurement = nil)
|
|
202
192
|
@inches ||= @dimensions.map { |m| m.convert_to(:in).value.to_f }
|
|
203
193
|
measurement.nil? ? @inches : measure(measurement, @inches)
|
|
204
194
|
end
|
|
205
|
-
|
|
195
|
+
alias in inches
|
|
206
196
|
|
|
207
197
|
def centimetres(measurement = nil)
|
|
208
198
|
@centimetres ||= @dimensions.map { |m| m.convert_to(:cm).value.to_f }
|
|
209
199
|
measurement.nil? ? @centimetres : measure(measurement, @centimetres)
|
|
210
200
|
end
|
|
211
|
-
|
|
201
|
+
alias cm centimetres
|
|
212
202
|
|
|
213
203
|
def dim_weight
|
|
214
204
|
return if inches(:length).blank? || inches(:width).blank? || inches(:height).blank? || pounds(:each).blank?
|
|
@@ -240,32 +230,22 @@ module FreightKit # :nodoc:
|
|
|
240
230
|
return 60 if density > 30
|
|
241
231
|
|
|
242
232
|
density_table = [
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
233
|
+
[1, 2, 300],
|
|
234
|
+
[2, 4, 250],
|
|
235
|
+
[4, 6, 175],
|
|
236
|
+
[6, 8, 125],
|
|
237
|
+
[8, 10, 100],
|
|
238
|
+
[10, 12, 92.5],
|
|
239
|
+
[12, 15, 85],
|
|
240
|
+
[15, 22.5, 70],
|
|
241
|
+
[22.5, 30, 65],
|
|
242
|
+
[30, 35, 60]
|
|
243
|
+
]
|
|
254
244
|
density_table.each do |density_row|
|
|
255
245
|
return density_row[2] if (density >= density_row[0]) && (density < density_row[1])
|
|
256
246
|
end
|
|
257
247
|
end
|
|
258
248
|
|
|
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
249
|
def measure(measurement, ary)
|
|
270
250
|
case measurement
|
|
271
251
|
when Integer then ary[measurement]
|
|
@@ -286,9 +266,17 @@ module FreightKit # :nodoc:
|
|
|
286
266
|
# [1,2] => [1,1,2]
|
|
287
267
|
# [5] => [5,5,5]
|
|
288
268
|
# etc..
|
|
289
|
-
2.downto(@dimensions.length)
|
|
290
|
-
|
|
269
|
+
2.downto(@dimensions.length) { |_n| @dimensions.unshift(@dimensions[0]) }
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
def sanitized_freight_class(freight_class)
|
|
273
|
+
return if freight_class.blank?
|
|
274
|
+
|
|
275
|
+
if VALID_FREIGHT_CLASSES.include?(freight_class)
|
|
276
|
+
return freight_class.to_i == freight_class ? freight_class.to_i : freight_class
|
|
291
277
|
end
|
|
278
|
+
|
|
279
|
+
nil
|
|
292
280
|
end
|
|
293
281
|
|
|
294
282
|
def weight(which_weight, options = {})
|