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.
Files changed (466) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +0 -2
  3. data/README.md +6 -5
  4. data/Rakefile +4 -0
  5. data/VERSION +1 -1
  6. data/configuration/locations/amazon_warehouses.yml +3330 -0
  7. data/freight_kit-0.1.21.gem +0 -0
  8. data/freight_kit.gemspec +11 -22
  9. data/lib/freight_kit/address_normalizer.rb +24 -0
  10. data/lib/freight_kit/amazon_warehouse.rb +33 -0
  11. data/lib/freight_kit/api_clients/soap_client.rb +33 -10
  12. data/lib/freight_kit/carrier.rb +248 -302
  13. data/lib/freight_kit/carriers/a1_express.rb +25 -0
  14. data/lib/freight_kit/carriers/a_duie_pyle.rb +30 -0
  15. data/lib/freight_kit/carriers/aaa_cooper.rb +11 -0
  16. data/lib/freight_kit/carriers/aaa_expedited_services.rb +10 -0
  17. data/lib/freight_kit/carriers/ab_brothers_usa_inc.rb +12 -0
  18. data/lib/freight_kit/carriers/aberdeen_express_inc.rb +28 -0
  19. data/lib/freight_kit/carriers/abf_freight_system.rb +475 -0
  20. data/lib/freight_kit/carriers/access_transport.rb +10 -0
  21. data/lib/freight_kit/carriers/action_express.rb +10 -0
  22. data/lib/freight_kit/carriers/adams_and_companies.rb +10 -0
  23. data/lib/freight_kit/carriers/advance_distribution.rb +28 -0
  24. data/lib/freight_kit/carriers/alcon_transport.rb +10 -0
  25. data/lib/freight_kit/carriers/all_freight.rb +10 -0
  26. data/lib/freight_kit/carriers/alliance_transportation_group.rb +10 -0
  27. data/lib/freight_kit/carriers/allstate_transport.rb +10 -0
  28. data/lib/freight_kit/carriers/aloha_freight_forwarders.rb +31 -0
  29. data/lib/freight_kit/carriers/amado_trucking.rb +31 -0
  30. data/lib/freight_kit/carriers/american_fast_freight.rb +28 -0
  31. data/lib/freight_kit/carriers/amigos_service_transportation.rb +10 -0
  32. data/lib/freight_kit/carriers/anderson_towing_and_transport.rb +10 -0
  33. data/lib/freight_kit/carriers/apex_transporting.rb +10 -0
  34. data/lib/freight_kit/carriers/archer_cargo.rb +35 -0
  35. data/lib/freight_kit/carriers/armstrong_transport_group.rb +10 -0
  36. data/lib/freight_kit/carriers/autobahn_logistics.rb +10 -0
  37. data/lib/freight_kit/carriers/averitt_express.rb +30 -0
  38. data/lib/freight_kit/carriers/ba_transportation.rb +10 -0
  39. data/lib/freight_kit/carriers/balkin_express.rb +10 -0
  40. data/lib/freight_kit/carriers/bay_area_express.rb +10 -0
  41. data/lib/freight_kit/carriers/bc_freightways.rb +11 -0
  42. data/lib/freight_kit/carriers/benjamin_best_freight_inc.rb +37 -0
  43. data/lib/freight_kit/carriers/bennett_trucking.rb +10 -0
  44. data/lib/freight_kit/carriers/best_overnite_express.rb +78 -0
  45. data/lib/freight_kit/carriers/best_trucking.rb +10 -0
  46. data/lib/freight_kit/carriers/bestway_transport.rb +10 -0
  47. data/lib/freight_kit/carriers/bryan_systems.rb +10 -0
  48. data/lib/freight_kit/carriers/c_and_w_express.rb +10 -0
  49. data/lib/freight_kit/carriers/campbell_trucking.rb +10 -0
  50. data/lib/freight_kit/carriers/carde_transportation.rb +10 -0
  51. data/lib/freight_kit/carriers/cardinal_logistics.rb +28 -0
  52. data/lib/freight_kit/carriers/cdc_transport.rb +10 -0
  53. data/lib/freight_kit/carriers/cdo_express_diversified.rb +10 -0
  54. data/lib/freight_kit/carriers/cedar_supply_trucking.rb +10 -0
  55. data/lib/freight_kit/carriers/central_freight_lines.rb +12 -0
  56. data/lib/freight_kit/carriers/central_transport.rb +12 -0
  57. data/lib/freight_kit/carriers/chicago_suburban_express.rb +28 -0
  58. data/lib/freight_kit/carriers/city_logistics.rb +11 -0
  59. data/lib/freight_kit/carriers/clear_lane_freight_systems.rb +474 -0
  60. data/lib/freight_kit/carriers/cleopatra_trucking.rb +10 -0
  61. data/lib/freight_kit/carriers/clifford_transportation.rb +10 -0
  62. data/lib/freight_kit/carriers/cms_domestic.rb +25 -0
  63. data/lib/freight_kit/carriers/cnd_logistics.rb +10 -0
  64. data/lib/freight_kit/carriers/coast_to_coast_transport.rb +27 -0
  65. data/lib/freight_kit/carriers/countrywide_carriers.rb +10 -0
  66. data/lib/freight_kit/carriers/cpl_express.rb +31 -0
  67. data/lib/freight_kit/carriers/crosby_trucking_service.rb +29 -0
  68. data/lib/freight_kit/carriers/cross_country_freight_solutions.rb +408 -0
  69. data/lib/freight_kit/carriers/crowley.rb +10 -0
  70. data/lib/freight_kit/carriers/csa_transportation.rb +40 -0
  71. data/lib/freight_kit/carriers/csx_transportation.rb +40 -0
  72. data/lib/freight_kit/carriers/custom_global_logistics.rb +14 -0
  73. data/lib/freight_kit/carriers/d_and_a_transport.rb +10 -0
  74. data/lib/freight_kit/carriers/dak_transport.rb +10 -0
  75. data/lib/freight_kit/carriers/dash_courier_and_logistics_north_carolina.rb +10 -0
  76. data/lib/freight_kit/carriers/daylight_transport.rb +29 -0
  77. data/lib/freight_kit/carriers/dayton_freight_lines.rb +30 -0
  78. data/lib/freight_kit/carriers/dbr_logistics.rb +10 -0
  79. data/lib/freight_kit/carriers/deep_south_freight.rb +27 -0
  80. data/lib/freight_kit/carriers/delta_express.rb +10 -0
  81. data/lib/freight_kit/carriers/delta_transport.rb +10 -0
  82. data/lib/freight_kit/carriers/delta_trucking_logistics.rb +10 -0
  83. data/lib/freight_kit/carriers/demco_express.rb +10 -0
  84. data/lib/freight_kit/carriers/dependable_global_express.rb +10 -0
  85. data/lib/freight_kit/carriers/dependable_hawaiian_express.rb +24 -0
  86. data/lib/freight_kit/carriers/dependable_highway_express.rb +573 -0
  87. data/lib/freight_kit/carriers/desert_coastal_transport.rb +10 -0
  88. data/lib/freight_kit/carriers/dhl.rb +11 -0
  89. data/lib/freight_kit/carriers/diamond_line_delivery.rb +174 -0
  90. data/lib/freight_kit/carriers/ding_tai_trucking.rb +10 -0
  91. data/lib/freight_kit/carriers/diversified_transfer_and_storage.rb +29 -0
  92. data/lib/freight_kit/carriers/dohrn_transfer_company.rb +30 -0
  93. data/lib/freight_kit/carriers/dot_line_transportation.rb +29 -0
  94. data/lib/freight_kit/carriers/drt_transportation.rb +13 -0
  95. data/lib/freight_kit/carriers/dugan_truck_line.rb +29 -0
  96. data/lib/freight_kit/carriers/dupont.rb +10 -0
  97. data/lib/freight_kit/carriers/e_transport_carriers.rb +29 -0
  98. data/lib/freight_kit/carriers/echo_global_logistics.rb +13 -0
  99. data/lib/freight_kit/carriers/ecklund_logistics.rb +10 -0
  100. data/lib/freight_kit/carriers/el_emplumado_transport.rb +10 -0
  101. data/lib/freight_kit/carriers/elite_carriers.rb +28 -0
  102. data/lib/freight_kit/carriers/emerald_express.rb +10 -0
  103. data/lib/freight_kit/carriers/era_transport.rb +10 -0
  104. data/lib/freight_kit/carriers/estes_express_lines.rb +25 -0
  105. data/lib/freight_kit/carriers/euro_kam.rb +28 -0
  106. data/lib/freight_kit/carriers/ew_riverside_trucking.rb +10 -0
  107. data/lib/freight_kit/carriers/express_2000_inc.rb +12 -0
  108. data/lib/freight_kit/carriers/express_services_international.rb +10 -0
  109. data/lib/freight_kit/carriers/f_and_a_express.rb +27 -0
  110. data/lib/freight_kit/carriers/fairmont_logistics.rb +13 -0
  111. data/lib/freight_kit/carriers/fargo_cargo.rb +10 -0
  112. data/lib/freight_kit/carriers/fast_freight_transportation.rb +10 -0
  113. data/lib/freight_kit/carriers/fast_load_transport.rb +10 -0
  114. data/lib/freight_kit/carriers/fed_ex_express.rb +30 -0
  115. data/lib/freight_kit/carriers/fed_ex_ground.rb +24 -0
  116. data/lib/freight_kit/carriers/fed_ex_ltl_economy.rb +11 -0
  117. data/lib/freight_kit/carriers/fed_ex_ltl_priority.rb +11 -0
  118. data/lib/freight_kit/carriers/first_trucking_express.rb +10 -0
  119. data/lib/freight_kit/carriers/flash_trucking.rb +10 -0
  120. data/lib/freight_kit/carriers/fort_transportation_and_service_company_inc.rb +37 -0
  121. data/lib/freight_kit/carriers/forward_air.rb +781 -0
  122. data/lib/freight_kit/carriers/frahtex.rb +10 -0
  123. data/lib/freight_kit/carriers/frozen_food_express.rb +10 -0
  124. data/lib/freight_kit/carriers/gholia_bros_trucking.rb +36 -0
  125. data/lib/freight_kit/carriers/global_cargo.rb +10 -0
  126. data/lib/freight_kit/carriers/global_logistics_and_transportation.rb +10 -0
  127. data/lib/freight_kit/carriers/gls_freight.rb +32 -0
  128. data/lib/freight_kit/carriers/go_trucking_services.rb +10 -0
  129. data/lib/freight_kit/carriers/gold_eagle_transportation.rb +11 -0
  130. data/lib/freight_kit/carriers/golden_drop_trucking.rb +10 -0
  131. data/lib/freight_kit/carriers/gonzalez_transportation.rb +10 -0
  132. data/lib/freight_kit/carriers/gps_transport.rb +10 -0
  133. data/lib/freight_kit/carriers/greene_enterprise.rb +10 -0
  134. data/lib/freight_kit/carriers/gsa_international.rb +10 -0
  135. data/lib/freight_kit/carriers/gsp_express.rb +24 -0
  136. data/lib/freight_kit/carriers/gsv_transportation.rb +10 -0
  137. data/lib/freight_kit/carriers/gta_transportation.rb +10 -0
  138. data/lib/freight_kit/carriers/guam_freight_services.rb +10 -0
  139. data/lib/freight_kit/carriers/harrah_transportation.rb +23 -0
  140. data/lib/freight_kit/carriers/her_trucking.rb +10 -0
  141. data/lib/freight_kit/carriers/hercules_freight.rb +20 -0
  142. data/lib/freight_kit/carriers/highlander_xpress.rb +36 -0
  143. data/lib/freight_kit/carriers/hn_transport.rb +10 -0
  144. data/lib/freight_kit/carriers/honolulu_freight_service.rb +10 -0
  145. data/lib/freight_kit/carriers/hot_line_freight_system_inc.rb +12 -0
  146. data/lib/freight_kit/carriers/hotshot_freight_of_texas.rb +13 -0
  147. data/lib/freight_kit/carriers/houser_transport.rb +27 -0
  148. data/lib/freight_kit/carriers/infiniti_freight_logistics.rb +28 -0
  149. data/lib/freight_kit/carriers/infinity_trucking.rb +10 -0
  150. data/lib/freight_kit/carriers/interstate_tma.rb +10 -0
  151. data/lib/freight_kit/carriers/intrade_industries.rb +10 -0
  152. data/lib/freight_kit/carriers/jasper_trucking.rb +28 -0
  153. data/lib/freight_kit/carriers/jb_hunt.rb +11 -0
  154. data/lib/freight_kit/carriers/jfj_transportation.rb +8 -8
  155. data/lib/freight_kit/carriers/jkb_express.rb +10 -0
  156. data/lib/freight_kit/carriers/jlm_transport.rb +10 -0
  157. data/lib/freight_kit/carriers/johansson_transport.rb +10 -0
  158. data/lib/freight_kit/carriers/jones_express.rb +10 -0
  159. data/lib/freight_kit/carriers/jp_logistics.rb +41 -0
  160. data/lib/freight_kit/carriers/just_in_time_cargo.rb +29 -0
  161. data/lib/freight_kit/carriers/kengkok_times.rb +10 -0
  162. data/lib/freight_kit/carriers/kings_express.rb +10 -0
  163. data/lib/freight_kit/carriers/klc_transportation.rb +10 -0
  164. data/lib/freight_kit/carriers/km_trucking.rb +10 -0
  165. data/lib/freight_kit/carriers/kma_logistics.rb +10 -0
  166. data/lib/freight_kit/carriers/krc_logistics.rb +10 -0
  167. data/lib/freight_kit/carriers/ktx.rb +10 -0
  168. data/lib/freight_kit/carriers/landstar.rb +25 -0
  169. data/lib/freight_kit/carriers/lanter_distributing_llc.rb +30 -0
  170. data/lib/freight_kit/carriers/ld_trucking.rb +10 -0
  171. data/lib/freight_kit/carriers/legacy_logistics_solutions.rb +10 -0
  172. data/lib/freight_kit/carriers/leonards_express.rb +10 -0
  173. data/lib/freight_kit/carriers/liberty_linehaul_west.rb +28 -0
  174. data/lib/freight_kit/carriers/liberty_transport.rb +10 -0
  175. data/lib/freight_kit/carriers/lightning_express.rb +10 -0
  176. data/lib/freight_kit/carriers/lj_express.rb +24 -0
  177. data/lib/freight_kit/carriers/lkp_enterprises.rb +10 -0
  178. data/lib/freight_kit/carriers/ltl_pros.rb +28 -0
  179. data/lib/freight_kit/carriers/m_and_m_and_sons.rb +10 -0
  180. data/lib/freight_kit/carriers/mag_lines_transport.rb +10 -0
  181. data/lib/freight_kit/carriers/magic_messenger.rb +24 -0
  182. data/lib/freight_kit/carriers/majors_transit.rb +10 -0
  183. data/lib/freight_kit/carriers/map_global_logistics.rb +10 -0
  184. data/lib/freight_kit/carriers/matths_trucking.rb +11 -0
  185. data/lib/freight_kit/carriers/mav_canadian_transport.rb +13 -0
  186. data/lib/freight_kit/carriers/mc_systems.rb +35 -0
  187. data/lib/freight_kit/carriers/mega_fleet.rb +10 -0
  188. data/lib/freight_kit/carriers/mega_trans_group.rb +28 -0
  189. data/lib/freight_kit/carriers/meta_express.rb +10 -0
  190. data/lib/freight_kit/carriers/mia_transportation.rb +10 -0
  191. data/lib/freight_kit/carriers/midwest_motor_express.rb +14 -0
  192. data/lib/freight_kit/carriers/midwest_transport_and_trucking.rb +10 -0
  193. data/lib/freight_kit/carriers/mikade_delivery_service.rb +10 -0
  194. data/lib/freight_kit/carriers/mohoff_freight_lines.rb +23 -0
  195. data/lib/freight_kit/carriers/montata_travelers_express.rb +10 -0
  196. data/lib/freight_kit/carriers/morgan_van_lines.rb +29 -0
  197. data/lib/freight_kit/carriers/moto_transportation.rb +24 -0
  198. data/lib/freight_kit/carriers/mountain_valley_express.rb +197 -0
  199. data/lib/freight_kit/carriers/ms_freight.rb +27 -0
  200. data/lib/freight_kit/carriers/mvg_transport.rb +10 -0
  201. data/lib/freight_kit/carriers/n_and_m_transfer_co_inc.rb +29 -0
  202. data/lib/freight_kit/carriers/nabot_transport_solutions.rb +10 -0
  203. data/lib/freight_kit/carriers/national_freight_xpress.rb +10 -0
  204. data/lib/freight_kit/carriers/navigation_group.rb +10 -0
  205. data/lib/freight_kit/carriers/nelson_trucking.rb +10 -0
  206. data/lib/freight_kit/carriers/network_1_transportation.rb +10 -0
  207. data/lib/freight_kit/carriers/new_century_transport.rb +28 -0
  208. data/lib/freight_kit/carriers/new_penn_motor_express.rb +11 -0
  209. data/lib/freight_kit/carriers/nieves_transportation.rb +10 -0
  210. data/lib/freight_kit/carriers/nolan_transportation_group.rb +26 -0
  211. data/lib/freight_kit/carriers/northland_trucking.rb +10 -0
  212. data/lib/freight_kit/carriers/northwest_carrier_logistics.rb +27 -0
  213. data/lib/freight_kit/carriers/nt_usa.rb +10 -0
  214. data/lib/freight_kit/carriers/nu_line_transportation.rb +10 -0
  215. data/lib/freight_kit/carriers/numark_transportation.rb +80 -0
  216. data/lib/freight_kit/carriers/nvk_transport.rb +10 -0
  217. data/lib/freight_kit/carriers/ny_transport.rb +10 -0
  218. data/lib/freight_kit/carriers/oak_harbor.rb +28 -0
  219. data/lib/freight_kit/carriers/oakline_transportation.rb +10 -0
  220. data/lib/freight_kit/carriers/old_dominion_freight_line.rb +30 -0
  221. data/lib/freight_kit/carriers/on_trac.rb +555 -0
  222. data/lib/freight_kit/carriers/one_hundred_one_transport.rb +10 -0
  223. data/lib/freight_kit/carriers/one_way_delivery.rb +10 -0
  224. data/lib/freight_kit/carriers/oracle_transportation_solutions.rb +10 -0
  225. data/lib/freight_kit/carriers/orange_courier.rb +27 -0
  226. data/lib/freight_kit/carriers/ortas_trucking.rb +10 -0
  227. data/lib/freight_kit/carriers/pac_trux_transportation.rb +10 -0
  228. data/lib/freight_kit/carriers/pacer.rb +10 -0
  229. data/lib/freight_kit/carriers/pacific_logistics.rb +10 -0
  230. data/lib/freight_kit/carriers/pacific_states_truck_lines.rb +10 -0
  231. data/lib/freight_kit/carriers/paradise_distributing.rb +10 -0
  232. data/lib/freight_kit/carriers/paramount_freight_systems.rb +10 -0
  233. data/lib/freight_kit/carriers/peninsula_truck_lines.rb +206 -0
  234. data/lib/freight_kit/carriers/pg_transport.rb +10 -0
  235. data/lib/freight_kit/carriers/pgs_360.rb +10 -0
  236. data/lib/freight_kit/carriers/pilot_freight_services.rb +10 -0
  237. data/lib/freight_kit/carriers/pious_trans.rb +27 -0
  238. data/lib/freight_kit/carriers/pitt_ohio_express.rb +30 -0
  239. data/lib/freight_kit/carriers/pki_logistics.rb +12 -0
  240. data/lib/freight_kit/carriers/plana_transportation.rb +28 -0
  241. data/lib/freight_kit/carriers/prestige.rb +10 -0
  242. data/lib/freight_kit/carriers/pro_trans_solutions.rb +28 -0
  243. data/lib/freight_kit/carriers/puma_logistics.rb +10 -0
  244. data/lib/freight_kit/carriers/pwc_international.rb +10 -0
  245. data/lib/freight_kit/carriers/quality_logistics.rb +10 -0
  246. data/lib/freight_kit/carriers/queen_star_trucking.rb +27 -0
  247. data/lib/freight_kit/carriers/r_and_l_carriers.rb +11 -0
  248. data/lib/freight_kit/carriers/rac_transport.rb +10 -0
  249. data/lib/freight_kit/carriers/re_logistics.rb +23 -0
  250. data/lib/freight_kit/carriers/reddaway.rb +11 -0
  251. data/lib/freight_kit/carriers/reefer_van_network.rb +13 -0
  252. data/lib/freight_kit/carriers/refrigerated_trucking_and_ltl_transportation_services.rb +10 -0
  253. data/lib/freight_kit/carriers/ridgeline_express.rb +10 -0
  254. data/lib/freight_kit/carriers/rist_transport.rb +29 -0
  255. data/lib/freight_kit/carriers/river_city_transport.rb +10 -0
  256. data/lib/freight_kit/carriers/roadrunner_transportation_services.rb +669 -0
  257. data/lib/freight_kit/carriers/roadtex.rb +13 -0
  258. data/lib/freight_kit/carriers/ronald_transport_services.rb +10 -0
  259. data/lib/freight_kit/carriers/rose_trucking.rb +24 -0
  260. data/lib/freight_kit/carriers/rp_and_j_transport.rb +24 -0
  261. data/lib/freight_kit/carriers/rpm_transportation.rb +11 -0
  262. data/lib/freight_kit/carriers/rude_transportation.rb +30 -0
  263. data/lib/freight_kit/carriers/s_and_s_logistics.rb +10 -0
  264. data/lib/freight_kit/carriers/saia.rb +456 -362
  265. data/lib/freight_kit/carriers/sb_transportation.rb +27 -0
  266. data/lib/freight_kit/carriers/schneider_national.rb +29 -0
  267. data/lib/freight_kit/carriers/schwarz_trucking.rb +10 -0
  268. data/lib/freight_kit/carriers/sewell_motor_express.rb +29 -0
  269. data/lib/freight_kit/carriers/shawnee_trucking.rb +28 -0
  270. data/lib/freight_kit/carriers/shi_logistics.rb +10 -0
  271. data/lib/freight_kit/carriers/sinbad_transport.rb +10 -0
  272. data/lib/freight_kit/carriers/skyway.rb +10 -0
  273. data/lib/freight_kit/carriers/smith_cargo_transportation_services.rb +23 -0
  274. data/lib/freight_kit/carriers/sna_transportation.rb +10 -0
  275. data/lib/freight_kit/carriers/solid_group.rb +10 -0
  276. data/lib/freight_kit/carriers/solution_carrier_express.rb +10 -0
  277. data/lib/freight_kit/carriers/southeastern_freight_lines.rb +441 -0
  278. data/lib/freight_kit/carriers/southwestern_motor_transport.rb +30 -0
  279. data/lib/freight_kit/carriers/span_alaska.rb +10 -0
  280. data/lib/freight_kit/carriers/specialize_transportation.rb +27 -0
  281. data/lib/freight_kit/carriers/ssi_refrigerated_express.rb +10 -0
  282. data/lib/freight_kit/carriers/standard_forwarding_llc.rb +28 -0
  283. data/lib/freight_kit/carriers/star_american_enterprise.rb +10 -0
  284. data/lib/freight_kit/carriers/sterling_transportation.rb +10 -0
  285. data/lib/freight_kit/carriers/stg.rb +163 -0
  286. data/lib/freight_kit/carriers/supervan_service.rb +10 -0
  287. data/lib/freight_kit/carriers/sutton_transport_inc.rb +12 -0
  288. data/lib/freight_kit/carriers/swift_transportation.rb +28 -0
  289. data/lib/freight_kit/carriers/t_force_worldwide.rb +605 -0
  290. data/lib/freight_kit/carriers/tax_airfreight_inc.rb +35 -0
  291. data/lib/freight_kit/carriers/tforce_freight_inc.rb +30 -0
  292. data/lib/freight_kit/carriers/the_custom_companies.rb +162 -0
  293. data/lib/freight_kit/carriers/thk_trucking.rb +28 -0
  294. data/lib/freight_kit/carriers/tiger_cool_express.rb +11 -0
  295. data/lib/freight_kit/carriers/tili_logistics.rb +10 -0
  296. data/lib/freight_kit/carriers/tmt_industries.rb +10 -0
  297. data/lib/freight_kit/carriers/top_ten_express.rb +28 -0
  298. data/lib/freight_kit/carriers/total_quality_logistics.rb +339 -0
  299. data/lib/freight_kit/carriers/total_transportation.rb +258 -0
  300. data/lib/freight_kit/carriers/trans_international_trucking.rb +29 -0
  301. data/lib/freight_kit/carriers/treasure_transportation.rb +10 -0
  302. data/lib/freight_kit/carriers/tri_state_services.rb +10 -0
  303. data/lib/freight_kit/carriers/tritex_freighters.rb +10 -0
  304. data/lib/freight_kit/carriers/triways.rb +10 -0
  305. data/lib/freight_kit/carriers/tsi_kansas.rb +29 -0
  306. data/lib/freight_kit/carriers/u_and_r_transportation.rb +23 -0
  307. data/lib/freight_kit/carriers/union_pacific.rb +11 -0
  308. data/lib/freight_kit/carriers/united_freight_logistics.rb +10 -0
  309. data/lib/freight_kit/carriers/unlimited_distance_transportation.rb +10 -0
  310. data/lib/freight_kit/carriers/up_streamline.rb +10 -0
  311. data/lib/freight_kit/carriers/ups_freight.rb +12 -0
  312. data/lib/freight_kit/carriers/us_freightways.rb +10 -0
  313. data/lib/freight_kit/carriers/usa_truck.rb +28 -0
  314. data/lib/freight_kit/carriers/usf_holland.rb +11 -0
  315. data/lib/freight_kit/carriers/valley_cartage.rb +11 -0
  316. data/lib/freight_kit/carriers/vc_transport.rb +10 -0
  317. data/lib/freight_kit/carriers/vision_express.rb +11 -0
  318. data/lib/freight_kit/carriers/vision_logistics_group.rb +10 -0
  319. data/lib/freight_kit/carriers/vmg_transportation_group.rb +10 -0
  320. data/lib/freight_kit/carriers/volpe_express.rb +10 -0
  321. data/lib/freight_kit/carriers/ward_trucking.rb +29 -0
  322. data/lib/freight_kit/carriers/wdwb.rb +10 -0
  323. data/lib/freight_kit/carriers/western_flyer_express.rb +28 -0
  324. data/lib/freight_kit/carriers/western_regional_delivery_service.rb +265 -0
  325. data/lib/freight_kit/carriers/western_specialized_trucking.rb +22 -0
  326. data/lib/freight_kit/carriers/win_distribution.rb +28 -0
  327. data/lib/freight_kit/carriers/wlb_transport.rb +10 -0
  328. data/lib/freight_kit/carriers/x_trux.rb +29 -0
  329. data/lib/freight_kit/carriers/xpo_logistics.rb +415 -0
  330. data/lib/freight_kit/carriers/xpress_global_systems.rb +30 -0
  331. data/lib/freight_kit/carriers/xylo_trucking.rb +10 -0
  332. data/lib/freight_kit/carriers/yrc_freight.rb +24 -0
  333. data/lib/freight_kit/carriers/zentner_transportation.rb +28 -0
  334. data/lib/freight_kit/carriers.rb +331 -34
  335. data/lib/freight_kit/countries.rb +22 -0
  336. data/lib/freight_kit/error.rb +0 -2
  337. data/lib/freight_kit/errors/document_not_found_error.rb +0 -2
  338. data/lib/freight_kit/errors/expired_credentials_error.rb +0 -2
  339. data/lib/freight_kit/errors/http_error.rb +0 -2
  340. data/lib/freight_kit/errors/invalid_credentials_error.rb +0 -2
  341. data/lib/freight_kit/errors/rate_limit_error.rb +12 -0
  342. data/lib/freight_kit/errors/response_error.rb +0 -2
  343. data/lib/freight_kit/errors/shipment_not_found_error.rb +0 -2
  344. data/lib/freight_kit/errors/unserviceable_accessorials_error.rb +1 -5
  345. data/lib/freight_kit/errors/unserviceable_error.rb +0 -2
  346. data/lib/freight_kit/helpers/documentable.rb +0 -2
  347. data/lib/freight_kit/helpers/pickupable.rb +3 -14
  348. data/lib/freight_kit/helpers/rateable.rb +0 -2
  349. data/lib/freight_kit/helpers/trackable.rb +0 -2
  350. data/lib/freight_kit/http_client/cache_store.rb +2 -4
  351. data/lib/freight_kit/http_client/httpi_adapter.rb +37 -0
  352. data/lib/freight_kit/http_client/log_device.rb +0 -2
  353. data/lib/freight_kit/http_client/response.rb +0 -2
  354. data/lib/freight_kit/http_client/revalidation.rb +0 -2
  355. data/lib/freight_kit/http_client/safe_retries.rb +17 -3
  356. data/lib/freight_kit/http_client/zstd.rb +2 -4
  357. data/lib/freight_kit/http_client.rb +21 -21
  358. data/lib/freight_kit/model.rb +1 -3
  359. data/lib/freight_kit/models/address.rb +15 -0
  360. data/lib/freight_kit/models/contact.rb +3 -4
  361. data/lib/freight_kit/models/country.rb +20 -0
  362. data/lib/freight_kit/models/credential.rb +3 -18
  363. data/lib/freight_kit/models/date_time.rb +0 -2
  364. data/lib/freight_kit/models/document_response.rb +0 -2
  365. data/lib/freight_kit/models/label.rb +0 -2
  366. data/lib/freight_kit/models/location.rb +10 -25
  367. data/lib/freight_kit/models/pickup_response.rb +0 -2
  368. data/lib/freight_kit/models/price.rb +0 -2
  369. data/lib/freight_kit/models/rate.rb +0 -2
  370. data/lib/freight_kit/models/rate_response.rb +0 -2
  371. data/lib/freight_kit/models/region.rb +19 -0
  372. data/lib/freight_kit/models/response.rb +0 -2
  373. data/lib/freight_kit/models/shipment.rb +5 -14
  374. data/lib/freight_kit/models/shipment_event.rb +0 -2
  375. data/lib/freight_kit/models/terminal.rb +10 -0
  376. data/lib/freight_kit/models/tracking_response.rb +0 -2
  377. data/lib/freight_kit/package.rb +52 -64
  378. data/lib/freight_kit/package_item.rb +14 -14
  379. data/lib/freight_kit/packaging.rb +6 -26
  380. data/lib/freight_kit/platform.rb +0 -32
  381. data/lib/freight_kit/platforms/carrier_logistics.rb +326 -345
  382. data/lib/freight_kit/platforms/dsdc.rb +82 -0
  383. data/lib/freight_kit/platforms/next_tms/graphql_client/mutation/quote_create.rb +32 -0
  384. data/lib/freight_kit/platforms/next_tms/graphql_client/mutation/shipment_create.rb +29 -0
  385. data/lib/freight_kit/platforms/next_tms/graphql_client/query/broker_carrier.rb +37 -0
  386. data/lib/freight_kit/platforms/next_tms/graphql_client/query/broker_carriers.rb +45 -0
  387. data/lib/freight_kit/platforms/next_tms/graphql_client/query/broker_customer.rb +54 -0
  388. data/lib/freight_kit/platforms/next_tms/graphql_client/query/broker_customers.rb +62 -0
  389. data/lib/freight_kit/platforms/next_tms/graphql_client/query/carrier.rb +22 -0
  390. data/lib/freight_kit/platforms/next_tms/graphql_client/query/carriers.rb +30 -0
  391. data/lib/freight_kit/platforms/next_tms/graphql_client/query/customer.rb +20 -0
  392. data/lib/freight_kit/platforms/next_tms/graphql_client/query/customers.rb +28 -0
  393. data/lib/freight_kit/platforms/next_tms/graphql_client/query/invoice.rb +31 -0
  394. data/lib/freight_kit/platforms/next_tms/graphql_client/query/invoices.rb +39 -0
  395. data/lib/freight_kit/platforms/next_tms/graphql_client/query/shipment.rb +102 -0
  396. data/lib/freight_kit/platforms/next_tms/graphql_client/query/shipment_documents.rb +29 -0
  397. data/lib/freight_kit/platforms/next_tms/graphql_client/query/shipments.rb +110 -0
  398. data/lib/freight_kit/platforms/next_tms/graphql_client.rb +22 -0
  399. data/lib/freight_kit/platforms/next_tms/orm/address.rb +22 -0
  400. data/lib/freight_kit/platforms/next_tms/orm/base.rb +120 -0
  401. data/lib/freight_kit/platforms/next_tms/orm/broker_carrier.rb +18 -0
  402. data/lib/freight_kit/platforms/next_tms/orm/broker_customer.rb +22 -0
  403. data/lib/freight_kit/platforms/next_tms/orm/carrier.rb +14 -0
  404. data/lib/freight_kit/platforms/next_tms/orm/collection.rb +335 -0
  405. data/lib/freight_kit/platforms/next_tms/orm/customer.rb +12 -0
  406. data/lib/freight_kit/platforms/next_tms/orm/invoice.rb +21 -0
  407. data/lib/freight_kit/platforms/next_tms/orm/record_not_found_error.rb +9 -0
  408. data/lib/freight_kit/platforms/next_tms/orm/shipment.rb +50 -0
  409. data/lib/freight_kit/platforms/next_tms/orm.rb +38 -0
  410. data/lib/freight_kit/platforms/next_tms.rb +452 -0
  411. data/lib/freight_kit/platforms/the_great_information_factory.rb +492 -425
  412. data/lib/freight_kit/regions.rb +27 -0
  413. data/lib/freight_kit/shipment_packer.rb +36 -38
  414. data/lib/freight_kit/tariff/overlength_rule.rb +1 -5
  415. data/lib/freight_kit/tariff.rb +0 -2
  416. data/lib/freight_kit.rb +103 -11
  417. data/schemas/next_tms.json +110710 -0
  418. metadata +443 -55
  419. data/configuration/carriers/abfs.yml +0 -124
  420. data/configuration/carriers/btvp.yml +0 -84
  421. data/configuration/carriers/ccyq.yml +0 -121
  422. data/configuration/carriers/clni.yml +0 -113
  423. data/configuration/carriers/cnwy.yml +0 -113
  424. data/configuration/carriers/ctbv.yml +0 -117
  425. data/configuration/carriers/dcha.yml +0 -105
  426. data/configuration/carriers/dlds.yml +0 -111
  427. data/configuration/carriers/dphe.yml +0 -130
  428. data/configuration/carriers/drrq.yml +0 -131
  429. data/configuration/carriers/fcsy.yml +0 -102
  430. data/configuration/carriers/fwda.yml +0 -137
  431. data/configuration/carriers/jfj_transportation.yml +0 -2
  432. data/configuration/carriers/mtvl.yml +0 -12
  433. data/configuration/carriers/numk.yml +0 -14
  434. data/configuration/carriers/otcl.yml +0 -124
  435. data/configuration/carriers/pens.yml +0 -22
  436. data/configuration/carriers/rdfs.yml +0 -142
  437. data/configuration/carriers/saia.yml +0 -129
  438. data/configuration/carriers/sefl.yml +0 -115
  439. data/configuration/carriers/totl.yml +0 -111
  440. data/configuration/carriers/tqyl.yml +0 -28
  441. data/configuration/carriers/wrds.yml +0 -20
  442. data/configuration/platforms/carrier_logistics.yml +0 -25
  443. data/configuration/platforms/next.yml +0 -12
  444. data/configuration/platforms/the_great_information_factory.yml +0 -122
  445. data/lib/freight_kit/carriers/abfs.rb +0 -421
  446. data/lib/freight_kit/carriers/btvp.rb +0 -29
  447. data/lib/freight_kit/carriers/ccyq.rb +0 -310
  448. data/lib/freight_kit/carriers/clni.rb +0 -396
  449. data/lib/freight_kit/carriers/cnwy.rb +0 -327
  450. data/lib/freight_kit/carriers/ctbv.rb +0 -53
  451. data/lib/freight_kit/carriers/dcha.rb +0 -76
  452. data/lib/freight_kit/carriers/dlds.rb +0 -49
  453. data/lib/freight_kit/carriers/dphe.rb +0 -472
  454. data/lib/freight_kit/carriers/drrq.rb +0 -580
  455. data/lib/freight_kit/carriers/fcsy.rb +0 -57
  456. data/lib/freight_kit/carriers/fwda.rb +0 -744
  457. data/lib/freight_kit/carriers/mtvl.rb +0 -34
  458. data/lib/freight_kit/carriers/numk.rb +0 -58
  459. data/lib/freight_kit/carriers/otcl.rb +0 -520
  460. data/lib/freight_kit/carriers/pens.rb +0 -204
  461. data/lib/freight_kit/carriers/rdfs.rb +0 -521
  462. data/lib/freight_kit/carriers/sefl.rb +0 -342
  463. data/lib/freight_kit/carriers/totl.rb +0 -172
  464. data/lib/freight_kit/carriers/tqyl.rb +0 -337
  465. data/lib/freight_kit/carriers/wrds.rb +0 -246
  466. 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 and logger are hookable; they default to the host Rails/Hanami app's logger:
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 ||= ActiveSupport::Cache::MemoryStore.new
15
+ def cache = @cache || FreightKit.cache
16
16
 
17
17
  def cache=(store)
18
18
  @cache = store
19
- @sessions.clear
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
- @sessions.clear
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: {}, proxy: nil, query: nil)
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(proxy.presence).request(verb.to_s.upcase, url, **options)
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(proxy)
62
- @sessions.compute_if_absent(proxy) do
63
- session = HTTPX
64
- .plugin(:brotli)
65
- .plugin(Zstd)
66
- .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)
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
- proxy ? session.plugin(:proxy).with(proxy: { uri: proxy }) : session
75
+ proxy_url ? session.plugin(:proxy).with(proxy: { uri: proxy_url }) : session
76
76
  end
77
77
  end
78
78
  end
@@ -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
- alias_method :to_hash, :attributes
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
- alias_method :company, :company_name
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
- { api_key: String, proxy_url: String }
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.each do |k, _v|
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
  # Represent dates and times in varous formats.
5
3
  #
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  module FreightKit
4
2
  # Represents the response to calls:
5
3
  # - {FreightKit::Carrier#bol}
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  module FreightKit
4
2
  # Class representing a shipping option with estimated price.
5
3
  #
@@ -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
- return @contact = nil if contact.blank?
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
- return country = nil if country.blank?
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
- raise ArgumentError, 'country must be an ActiveUtils::Country'
66
+ @country = country.presence
76
67
  end
77
68
 
78
69
  def lat=(num)
79
- return @lat = nil if num.blank?
70
+ raise ArgumentError, 'lat must be a BigNum' unless num.blank? || num.is_a?(BigNum)
80
71
 
81
- return @lat = num if num.is_a?(BigNum)
82
-
83
- raise ArgumentError, 'lat must be a BigNum'
72
+ @lat = num.presence
84
73
  end
85
74
 
86
75
  def lng=(num)
87
- return @lng = nil if num.blank?
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
- raise ArgumentError, 'lng must be a BigNum'
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
- return @type = nil if value.blank?
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
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  module FreightKit
4
2
  # The `PickupResponse` object is returned by the {FreightKit::Carrier#create_pickup}
5
3
  # call. The most important method is {#pickup_number}, which will return the pickup reference
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  module FreightKit
4
2
  # Class representing a price.
5
3
  #
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  module FreightKit
4
2
  # Class representing a shipping option with estimated price.
5
3
  #
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  module FreightKit
4
2
  # The `RateResponse` object is returned by the {FreightKit::Carrier#find_rates}
5
3
  # call. The most important method is {#rates}, which will return a list of possible
@@ -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
  # Basic Response class for requests against a carrier's API.
5
3
  #
@@ -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
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  module FreightKit
4
2
  # `ShipmentEvent` is the abstract base class for all shipment events (usually
5
3
  # attached to `TrackingEresponse`).
@@ -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
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  module FreightKit
4
2
  # Represents the response to a {FreightKit::Carrier#find_tracking_info} call.
5
3
  #
@@ -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) do |_n|
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 density
127
- return unless inches[..2].all?(&:present?) && pounds(:each)
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 freight_class
142
- declared_freight_class.presence || calculated_freight_class
143
- end
128
+ def density
129
+ return unless inches[..2].all?(&:present?) && pounds(:each)
144
130
 
145
- def length(unit)
146
- @dimensions[2].convert_to(unit).value.to_f
131
+ density = pounds(:each).to_f / cubic_ft(:each)
132
+ format('%0.2f', density).to_f
147
133
  end
148
134
 
149
- def width(unit)
150
- @dimensions[1].convert_to(unit).value.to_f
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 cylinder?
158
- @cylinder
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
- alias_method :tube?, :cylinder?
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
- alias_method :oz, :ounces
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
- alias_method :g, :grams
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
- alias_method :lb, :pounds
193
- alias_method :lbs, :pounds
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
- alias_method :kg, :kilograms
199
- alias_method :kgs, :kilograms
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
- alias_method :in, :inches
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
- alias_method :cm, :centimetres
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
- [1, 2, 300],
244
- [2, 4, 250],
245
- [4, 6, 175],
246
- [6, 8, 125],
247
- [8, 10, 100],
248
- [10, 12, 92.5],
249
- [12, 15, 85],
250
- [15, 22.5, 70],
251
- [22.5, 30, 65],
252
- [30, 35, 60],
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) do |_n|
290
- @dimensions.unshift(@dimensions[0])
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 = {})