cargowise 0.10.2 → 1.0.0.alpha
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/CHANGELOG +3 -0
- data/README.markdown +12 -16
- data/lib/cargowise.rb +1 -16
- data/lib/cargowise/abstract_result.rb +0 -19
- data/lib/cargowise/client.rb +113 -0
- data/lib/cargowise/consol.rb +2 -0
- data/lib/cargowise/document.rb +2 -0
- data/lib/cargowise/invoice.rb +2 -0
- data/lib/cargowise/order.rb +3 -0
- data/lib/cargowise/order_search.rb +25 -4
- data/lib/cargowise/packing.rb +2 -0
- data/lib/cargowise/shipment.rb +20 -19
- data/lib/cargowise/shipment_search.rb +25 -5
- metadata +18 -11
- data/lib/cargowise/abstract_client.rb +0 -46
- data/lib/cargowise/abstract_search.rb +0 -25
- data/lib/cargowise/endpoint.rb +0 -27
- data/lib/cargowise/orders_client.rb +0 -43
- data/lib/cargowise/shipments_client.rb +0 -44
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9817101a99e84ae1fdf68b2a1389e83a94298fb1
|
4
|
+
data.tar.gz: 0264a94a2cd8b1ed3d142d4829478343ed0ea37b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6881b0677e349919f63fc6bcfaa96b451950b83c6a7930c6027d645078efa99f11d0193cb28e7817bfe22a4c022d0b14691eb14b97ae144ab16ca3690d559469
|
7
|
+
data.tar.gz: 79d5fe26d024a84cbcad27d6dccf0d06f403df8925c5edad34262879fdf2e244eb341f8ce50c47f8ab4dc6bfdbccaef6544316f66b639b84064e1157e5840ed6
|
data/CHANGELOG
CHANGED
data/README.markdown
CHANGED
@@ -27,21 +27,17 @@ either or both.
|
|
27
27
|
Each company using the cargowise product hosts the server themselves, so you will
|
28
28
|
need to register the URI and authentication details for the company you want to use.
|
29
29
|
|
30
|
-
Cargowise::
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
Cargowise::Shipment.register(:ijs, :uri => "http://visibility.ijsglobal.com/Tracker/WebService/ShipmentService.asmx",
|
36
|
-
:code => "company_code",
|
37
|
-
:user => "user@example.com",
|
38
|
-
:password => "secret")
|
30
|
+
client = Cargowise::Client.new(:order_uri => "http://visibility.ijsglobal.com/Tracker/WebService/OrderService.asmx",
|
31
|
+
:shipment_uri => "http://visibility.ijsglobal.com/Tracker/WebService/ShipmentService.asmx",
|
32
|
+
:company_code => "company_code",
|
33
|
+
:username => "user@example.com",
|
34
|
+
:password => "secret")
|
39
35
|
|
40
36
|
In a rails app the registration should be done in a file like
|
41
37
|
config/initializers/cargowise.rb.
|
42
38
|
|
43
|
-
If you deal with multiple companies running cargowise you
|
44
|
-
|
39
|
+
If you deal with multiple companies running cargowise you should create a client
|
40
|
+
instance per company.
|
45
41
|
|
46
42
|
See the Finding API Endpoints section below for tips on finding the correct URI
|
47
43
|
to register.
|
@@ -55,11 +51,11 @@ the order.
|
|
55
51
|
|
56
52
|
To find all orders with a certain order number:
|
57
53
|
|
58
|
-
|
54
|
+
client.orders.by_order_number("123456")
|
59
55
|
|
60
56
|
To find all incomplete orders:
|
61
57
|
|
62
|
-
|
58
|
+
client.orders.incomplete
|
63
59
|
|
64
60
|
Cargowise::Shipment represents something being sent to you - like a carton,
|
65
61
|
palet or truck load. It might be transported via air, sea, road or a combination.
|
@@ -67,15 +63,15 @@ palet or truck load. It might be transported via air, sea, road or a combination
|
|
67
63
|
To find shipments by the shipment number (a reference number selected by your logistics
|
68
64
|
company):
|
69
65
|
|
70
|
-
|
66
|
+
client.shipments.by_shipment_number("123456")
|
71
67
|
|
72
68
|
To find undelivered shipments:
|
73
69
|
|
74
|
-
|
70
|
+
client.shipments.undelivered
|
75
71
|
|
76
72
|
To find shipments with activity in the past 14 days (or so):
|
77
73
|
|
78
|
-
|
74
|
+
client.shipments.with_recent_activity
|
79
75
|
|
80
76
|
All Order and Shipment objects are read only, there are no write capabale
|
81
77
|
methods exposed via the API. If you see errors, contact your logistics company.
|
data/lib/cargowise.rb
CHANGED
@@ -2,12 +2,10 @@
|
|
2
2
|
|
3
3
|
# stdlib
|
4
4
|
require "bigdecimal"
|
5
|
-
require "handsoap"
|
6
5
|
|
7
6
|
# gems
|
8
7
|
require 'mechanize'
|
9
8
|
require 'andand'
|
10
|
-
require 'savon'
|
11
9
|
|
12
10
|
module Cargowise
|
13
11
|
DEFAULT_NS = "http://www.edi.com.au/EnterpriseService/"
|
@@ -15,20 +13,7 @@ module Cargowise
|
|
15
13
|
end
|
16
14
|
|
17
15
|
# this lib
|
18
|
-
require 'cargowise/
|
19
|
-
require 'cargowise/orders_client'
|
20
|
-
require 'cargowise/shipments_client'
|
21
|
-
require 'cargowise/abstract_result'
|
22
|
-
require 'cargowise/order'
|
23
|
-
require 'cargowise/shipment'
|
24
|
-
require 'cargowise/packing'
|
25
|
-
require 'cargowise/consol'
|
26
|
-
require 'cargowise/document'
|
27
|
-
require 'cargowise/invoice'
|
28
|
-
require 'cargowise/endpoint'
|
29
|
-
require 'cargowise/abstract_search'
|
30
|
-
require 'cargowise/order_search'
|
31
|
-
require 'cargowise/shipment_search'
|
16
|
+
require 'cargowise/client'
|
32
17
|
|
33
18
|
# Make savon/httpi always use Net::HTTP for HTTP requests. It supports
|
34
19
|
# forcing the connection to TLSv1 (needed for OHL)
|
@@ -8,25 +8,6 @@ module Cargowise
|
|
8
8
|
#
|
9
9
|
class AbstractResult # :nodoc:
|
10
10
|
|
11
|
-
def self.register(name, opts = {})
|
12
|
-
@endpoints ||= {}
|
13
|
-
@endpoints[name] = Endpoint.new(opts)
|
14
|
-
end
|
15
|
-
|
16
|
-
def self.endpoint(name)
|
17
|
-
@endpoints ||= {}
|
18
|
-
@endpoints[name]
|
19
|
-
end
|
20
|
-
|
21
|
-
def self.via(name)
|
22
|
-
@endpoints ||= {}
|
23
|
-
raise ArgumentError, "#{name} is not recognised, have you registered it?" if @endpoints[name].nil?
|
24
|
-
|
25
|
-
klass_name = (self.name[/Cargowise::(.+)/,1] + "Search")
|
26
|
-
search_klass = Cargowise.const_get(klass_name)
|
27
|
-
search_klass.new(@endpoints[name])
|
28
|
-
end
|
29
|
-
|
30
11
|
def inspect
|
31
12
|
str = "<#{self.class}: "
|
32
13
|
str << inspectable_vars.map { |v| "#{v.to_s.tr('@','')}: #{instance_variable_get(v)}" }.join(" ")
|
@@ -0,0 +1,113 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'savon'
|
4
|
+
require 'cargowise/order_search'
|
5
|
+
require 'cargowise/shipment_search'
|
6
|
+
|
7
|
+
module Cargowise
|
8
|
+
|
9
|
+
# The starting point for accessing data from your logistics provider. See
|
10
|
+
# the README for usage tips.
|
11
|
+
#
|
12
|
+
# You should create a new Client instance for each company API you plan
|
13
|
+
# to query.
|
14
|
+
#
|
15
|
+
class Client
|
16
|
+
|
17
|
+
def initialize(opts = {})
|
18
|
+
@order_uri = opts[:order_uri]
|
19
|
+
@shipment_uri = opts[:shipment_uri]
|
20
|
+
@code = opts[:company_code]
|
21
|
+
@username = opts[:username]
|
22
|
+
@password = opts[:password]
|
23
|
+
end
|
24
|
+
|
25
|
+
# begin an order search. See the docs for Cargowise::OrderSearch for info
|
26
|
+
# on what you can do with the object returned from this method.
|
27
|
+
def orders
|
28
|
+
OrderSearch.new(orders_client)
|
29
|
+
end
|
30
|
+
|
31
|
+
# begin a shipment search. See the docs for Cargowise::ShipmentSearch for
|
32
|
+
# info on what you can do with the object returned from this method.
|
33
|
+
def shipments
|
34
|
+
ShipmentSearch.new(shipments_client)
|
35
|
+
end
|
36
|
+
|
37
|
+
def orders_hello
|
38
|
+
response = orders_client.call(:hello)
|
39
|
+
response.xpath("//tns:HelloResponse/tns:HelloResult/text()", {"tns" => Cargowise::DEFAULT_NS}).to_s
|
40
|
+
end
|
41
|
+
|
42
|
+
def shipments_hello
|
43
|
+
response = shipments_client.call(:hello)
|
44
|
+
response.xpath("//tns:HelloResponse/tns:HelloResult/text()", {"tns" => Cargowise::DEFAULT_NS}).to_s
|
45
|
+
end
|
46
|
+
|
47
|
+
# Find the base URI for the web interface at this client
|
48
|
+
#
|
49
|
+
def base_uri
|
50
|
+
uri = @shipment_uri || @order_uri || ""
|
51
|
+
uri.to_s[/(.+)\/WebService.+/,1]
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def orders_client
|
57
|
+
build_client(order_wsdl_path, @order_uri)
|
58
|
+
end
|
59
|
+
|
60
|
+
def order_wsdl_path
|
61
|
+
File.join(
|
62
|
+
File.dirname(__FILE__),
|
63
|
+
"order_wsdl.xml"
|
64
|
+
)
|
65
|
+
end
|
66
|
+
|
67
|
+
def shipments_client
|
68
|
+
build_client(shipment_wsdl_path, @shipment_uri)
|
69
|
+
end
|
70
|
+
|
71
|
+
def shipment_wsdl_path
|
72
|
+
File.join(
|
73
|
+
File.dirname(__FILE__),
|
74
|
+
"shipment_wsdl.xml"
|
75
|
+
)
|
76
|
+
end
|
77
|
+
|
78
|
+
# TODO: make some of these configurable via the initialize to Cargowise::Client. Will enable
|
79
|
+
# providers that need special treatment to work (like OHL) to be configured differently
|
80
|
+
# by the calling code
|
81
|
+
def build_client(wsdl_path, endpoint_uri)
|
82
|
+
Savon.client(
|
83
|
+
wsdl: wsdl_path,
|
84
|
+
endpoint: endpoint_uri,
|
85
|
+
|
86
|
+
# Cargowise servers can be super slow to respond, this gives them time
|
87
|
+
# to have a smoko before responding to our queries.
|
88
|
+
read_timeout: 240,
|
89
|
+
|
90
|
+
# OHL uses cargowise and has a load balancer that freaks out if we use
|
91
|
+
# the OpenSSL 1.0.1 default of TLS1.1.
|
92
|
+
ssl_version: :TLSv1,
|
93
|
+
|
94
|
+
# savon 2.2.0 ignores the above ssl_version unless this is set to
|
95
|
+
# false. Annoying.
|
96
|
+
ssl_verify_mode: :none,
|
97
|
+
|
98
|
+
# turn off logging to keep me sane. Change this to true when developing
|
99
|
+
log: false,
|
100
|
+
|
101
|
+
# the cargowsie API requires auth details in the SOAP header of every
|
102
|
+
# request
|
103
|
+
soap_header: {
|
104
|
+
"tns:WebTrackerSOAPHeader" => {
|
105
|
+
"tns:CompanyCode" => @code,
|
106
|
+
"tns:UserName" => @username,
|
107
|
+
"tns:Password" => @password
|
108
|
+
}
|
109
|
+
}
|
110
|
+
)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
data/lib/cargowise/consol.rb
CHANGED
data/lib/cargowise/document.rb
CHANGED
data/lib/cargowise/invoice.rb
CHANGED
data/lib/cargowise/order.rb
CHANGED
@@ -1,8 +1,14 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
|
+
require 'cargowise/order'
|
4
|
+
|
3
5
|
module Cargowise
|
4
6
|
|
5
|
-
class OrderSearch
|
7
|
+
class OrderSearch
|
8
|
+
|
9
|
+
def initialize(savon_client)
|
10
|
+
@savon_client = savon_client
|
11
|
+
end
|
6
12
|
|
7
13
|
# find all orders with an OrderNumber that matches ref
|
8
14
|
#
|
@@ -15,7 +21,7 @@ module Cargowise
|
|
15
21
|
}
|
16
22
|
}
|
17
23
|
}
|
18
|
-
|
24
|
+
get_order_list(filter_hash)
|
19
25
|
end
|
20
26
|
|
21
27
|
# find all orders with a ShipmentNumber that matches ref
|
@@ -29,7 +35,7 @@ module Cargowise
|
|
29
35
|
}
|
30
36
|
}
|
31
37
|
}
|
32
|
-
|
38
|
+
get_order_list(filter_hash)
|
33
39
|
end
|
34
40
|
|
35
41
|
# find all orders still marked as incomplete.
|
@@ -38,7 +44,22 @@ module Cargowise
|
|
38
44
|
filter_hash = {
|
39
45
|
"tns:Filter" => { "tns:OrderStatus" => "INC" }
|
40
46
|
}
|
41
|
-
|
47
|
+
get_order_list(filter_hash)
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
# return an array of orders. Each order *should* correspond to a buyer PO.
|
53
|
+
#
|
54
|
+
# filter_hash should be a hash that will be serialised into an
|
55
|
+
# XML fragment specifying the search criteria. See the WSDL documentation
|
56
|
+
# for samples
|
57
|
+
#
|
58
|
+
def get_order_list(filter_hash)
|
59
|
+
response = @savon_client.call(:get_order_list, message: filter_hash)
|
60
|
+
response.xpath("//tns:GetOrderListResult/tns:WebOrder", {"tns" => Cargowise::DEFAULT_NS}).map do |node|
|
61
|
+
Cargowise::Order.new(node)
|
62
|
+
end
|
42
63
|
end
|
43
64
|
|
44
65
|
end
|
data/lib/cargowise/packing.rb
CHANGED
data/lib/cargowise/shipment.rb
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
|
+
require 'cargowise/abstract_result'
|
4
|
+
require 'cargowise/packing'
|
5
|
+
require 'cargowise/consol'
|
6
|
+
require 'cargowise/document'
|
7
|
+
require 'cargowise/invoice'
|
8
|
+
|
3
9
|
module Cargowise
|
4
10
|
|
5
11
|
# A shipment that is currently on its way to you. Could take on a
|
@@ -88,23 +94,23 @@ module Cargowise
|
|
88
94
|
|
89
95
|
# lookup full Cargowise::Order objects for each order on this shipment.
|
90
96
|
#
|
91
|
-
#
|
97
|
+
# client is a Cargowise::Client instance to look for the related shipments on
|
92
98
|
#
|
93
|
-
def orders(
|
94
|
-
@orders ||=
|
99
|
+
def orders(client)
|
100
|
+
@orders ||= client.orders.by_shipment_number(self.number)
|
95
101
|
end
|
96
102
|
|
97
103
|
# lookup related Cargowise::Shipment objects. These are usually "child" shipments
|
98
104
|
# grouped under a parent. Think a consolidated pallet (the parent) with cartons from
|
99
105
|
# multiple suppliers (the children).
|
100
106
|
#
|
101
|
-
#
|
107
|
+
# client is a Cargowise::Client instance to look for the related shipments on
|
102
108
|
#
|
103
|
-
def related_shipments(
|
109
|
+
def related_shipments(client)
|
104
110
|
@related ||= @consols.map { |consol|
|
105
111
|
consol.master_bill
|
106
112
|
}.compact.map { |master_bill|
|
107
|
-
|
113
|
+
client.shipments.by_masterbill_number(master_bill)
|
108
114
|
}.flatten.select { |shipment|
|
109
115
|
shipment.number != self.number
|
110
116
|
}.compact
|
@@ -115,9 +121,11 @@ module Cargowise
|
|
115
121
|
# This data isn't available via the API, so we need to screen scrape the
|
116
122
|
# website to get it.
|
117
123
|
#
|
118
|
-
|
119
|
-
|
120
|
-
|
124
|
+
# client is a Cargowise::Client instance to look for the related shipments on
|
125
|
+
#
|
126
|
+
def order_ref(client)
|
127
|
+
if client.base_uri
|
128
|
+
@order_ref ||= html_page(client).search(".//span[@id='Ztextlabel1']/text()").to_s.strip || ""
|
121
129
|
else
|
122
130
|
nil
|
123
131
|
end
|
@@ -127,12 +135,11 @@ module Cargowise
|
|
127
135
|
|
128
136
|
# retrieve a Mechanize::Page object that containts info on this shipment
|
129
137
|
#
|
130
|
-
def html_page(
|
131
|
-
return nil unless
|
138
|
+
def html_page(client)
|
139
|
+
return nil unless client.base_uri
|
132
140
|
|
133
141
|
@html_page ||= begin
|
134
|
-
|
135
|
-
login_uri = base_uri + "/Login/Login.aspx"
|
142
|
+
login_uri = client.base_uri + "/Login/Login.aspx"
|
136
143
|
agent = Mechanize.new
|
137
144
|
agent.agent.http.ssl_version = :TLSv1
|
138
145
|
if File.file?(Cargowise::CA_CERT_FILE)
|
@@ -147,11 +154,5 @@ module Cargowise
|
|
147
154
|
end
|
148
155
|
end
|
149
156
|
|
150
|
-
# Find a shipment with documents attached so we can discover the
|
151
|
-
# web interface uri
|
152
|
-
#
|
153
|
-
def tracker_login_uri(via)
|
154
|
-
Shipment.endpoint(via).uri.to_s[/(.+)\/WebService.+/,1]
|
155
|
-
end
|
156
157
|
end
|
157
158
|
end
|
@@ -1,8 +1,14 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
|
+
require 'cargowise/shipment'
|
4
|
+
|
3
5
|
module Cargowise
|
4
6
|
|
5
|
-
class ShipmentSearch
|
7
|
+
class ShipmentSearch
|
8
|
+
|
9
|
+
def initialize(savon_client)
|
10
|
+
@savon_client = savon_client
|
11
|
+
end
|
6
12
|
|
7
13
|
# find all shipments with a MasterBillNumber that matches ref
|
8
14
|
#
|
@@ -26,7 +32,7 @@ module Cargowise
|
|
26
32
|
filter_hash = {
|
27
33
|
"tns:Filter" => { "tns:Status" => "Undelivered" }
|
28
34
|
}
|
29
|
-
|
35
|
+
get_shipments_list(filter_hash)
|
30
36
|
end
|
31
37
|
|
32
38
|
# find all shipments that had some activity in the past fourteen days. This could
|
@@ -42,7 +48,7 @@ module Cargowise
|
|
42
48
|
}
|
43
49
|
}
|
44
50
|
}
|
45
|
-
|
51
|
+
get_shipments_list(filter_hash)
|
46
52
|
end
|
47
53
|
|
48
54
|
# find all shipments that had were shipped in the past 14 days or will ship in
|
@@ -58,7 +64,7 @@ module Cargowise
|
|
58
64
|
}
|
59
65
|
}
|
60
66
|
}
|
61
|
-
|
67
|
+
get_shipments_list(filter_hash)
|
62
68
|
end
|
63
69
|
|
64
70
|
private
|
@@ -72,7 +78,21 @@ module Cargowise
|
|
72
78
|
}
|
73
79
|
}
|
74
80
|
}
|
75
|
-
|
81
|
+
get_shipments_list(filter_hash)
|
82
|
+
end
|
83
|
+
|
84
|
+
# return an array of shipments. Each shipment should correspond to
|
85
|
+
# a consolidated shipment from the freight company.
|
86
|
+
#
|
87
|
+
# filter_hash should be a hash that will be serialised into an
|
88
|
+
# XML fragment specifying the search criteria. See the WSDL documentation
|
89
|
+
# for samples
|
90
|
+
#
|
91
|
+
def get_shipments_list(filter_hash)
|
92
|
+
response = @savon_client.call(:get_shipments_list, message: filter_hash)
|
93
|
+
response.xpath("//tns:GetShipmentsListResult/tns:WebShipment", {"tns" => Cargowise::DEFAULT_NS}).map do |node|
|
94
|
+
Cargowise::Shipment.new(node)
|
95
|
+
end
|
76
96
|
end
|
77
97
|
|
78
98
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cargowise
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0.alpha
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Healy
|
@@ -66,7 +66,7 @@ dependencies:
|
|
66
66
|
- - ~>
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '2.0'
|
69
|
-
description: Retrieve tracking and status information on your shipments from
|
69
|
+
description: Retrieve tracking and status information on your shipments from ediEnterprise
|
70
70
|
email:
|
71
71
|
- james@yob.id.au
|
72
72
|
executables: []
|
@@ -77,16 +77,12 @@ files:
|
|
77
77
|
- lib/cargowise/order_search.rb
|
78
78
|
- lib/cargowise/consol.rb
|
79
79
|
- lib/cargowise/invoice.rb
|
80
|
+
- lib/cargowise/client.rb
|
80
81
|
- lib/cargowise/order.rb
|
81
82
|
- lib/cargowise/document.rb
|
82
|
-
- lib/cargowise/orders_client.rb
|
83
|
-
- lib/cargowise/abstract_client.rb
|
84
83
|
- lib/cargowise/shipment.rb
|
85
|
-
- lib/cargowise/shipments_client.rb
|
86
84
|
- lib/cargowise/packing.rb
|
87
|
-
- lib/cargowise/abstract_search.rb
|
88
85
|
- lib/cargowise/abstract_result.rb
|
89
|
-
- lib/cargowise/endpoint.rb
|
90
86
|
- lib/cargowise/shipment_search.rb
|
91
87
|
- lib/cargowise/order_wsdl.xml
|
92
88
|
- lib/cargowise/shipment_wsdl.xml
|
@@ -99,7 +95,18 @@ homepage: http://github.com/yob/cargowise
|
|
99
95
|
licenses:
|
100
96
|
- mit
|
101
97
|
metadata: {}
|
102
|
-
post_install_message:
|
98
|
+
post_install_message: |2+
|
99
|
+
|
100
|
+
********************************************
|
101
|
+
|
102
|
+
v1.0.0 of cargowise introduced a new API. There are extensive
|
103
|
+
examples showing how to use it in the README and examples directory.
|
104
|
+
|
105
|
+
The old API has been removed, so you will need to update your code
|
106
|
+
before it will work with cargowise 1.0.0 or higher.
|
107
|
+
|
108
|
+
********************************************
|
109
|
+
|
103
110
|
rdoc_options:
|
104
111
|
- --title
|
105
112
|
- Cargowise
|
@@ -113,13 +120,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
113
120
|
version: '0'
|
114
121
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
115
122
|
requirements:
|
116
|
-
- - '
|
123
|
+
- - '>'
|
117
124
|
- !ruby/object:Gem::Version
|
118
|
-
version:
|
125
|
+
version: 1.3.1
|
119
126
|
requirements: []
|
120
127
|
rubyforge_project:
|
121
128
|
rubygems_version: 2.0.3
|
122
129
|
signing_key:
|
123
130
|
specification_version: 4
|
124
|
-
summary:
|
131
|
+
summary: client library for the ediEnterprise SOAP API by cargowise
|
125
132
|
test_files: []
|
@@ -1,46 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
|
3
|
-
module Cargowise
|
4
|
-
|
5
|
-
# Superclass of all clients, currently we have clients for
|
6
|
-
# orders and Shipments.
|
7
|
-
#
|
8
|
-
# Not much to see here, just common methods
|
9
|
-
#
|
10
|
-
class AbstractClient
|
11
|
-
|
12
|
-
private
|
13
|
-
|
14
|
-
def build_client(wsdl_path, endpoint_uri, company_code, username, password)
|
15
|
-
Savon.client(
|
16
|
-
wsdl: wsdl_path,
|
17
|
-
endpoint: endpoint_uri,
|
18
|
-
|
19
|
-
# Cargowise servers can be super slow to respond, this gives them time
|
20
|
-
# to have a smoko before responding to our queries.
|
21
|
-
read_timeout: 240,
|
22
|
-
|
23
|
-
# OHL uses cargowise and has a load balancer that freaks out if we use
|
24
|
-
# the OpenSSL 1.0.1 default of TLS1.1.
|
25
|
-
ssl_version: :TLSv1,
|
26
|
-
|
27
|
-
# savon 2.2.0 ignores the above ssl_version unless this is set to
|
28
|
-
# false. Annoying.
|
29
|
-
ssl_verify_mode: :none,
|
30
|
-
|
31
|
-
# turn off logging to keep me sane. Change this to true when developing
|
32
|
-
log: false,
|
33
|
-
|
34
|
-
# the cargowsie API requires auth details in the SOAP header of every
|
35
|
-
# request
|
36
|
-
soap_header: {
|
37
|
-
"tns:WebTrackerSOAPHeader" => {
|
38
|
-
"tns:CompanyCode" => company_code,
|
39
|
-
"tns:UserName" => username,
|
40
|
-
"tns:Password" => password
|
41
|
-
}
|
42
|
-
}
|
43
|
-
)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
|
3
|
-
module Cargowise
|
4
|
-
|
5
|
-
class AbstractSearch
|
6
|
-
|
7
|
-
def initialize(endpoint)
|
8
|
-
@endpoint = endpoint
|
9
|
-
end
|
10
|
-
|
11
|
-
private
|
12
|
-
|
13
|
-
def ep
|
14
|
-
@endpoint
|
15
|
-
end
|
16
|
-
|
17
|
-
def endpoint_hash
|
18
|
-
{
|
19
|
-
:uri => ep.uri,
|
20
|
-
:version => 2
|
21
|
-
}
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
end
|
data/lib/cargowise/endpoint.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
|
3
|
-
module Cargowise
|
4
|
-
|
5
|
-
# Stores the details for connecting to a single logistics company.
|
6
|
-
#
|
7
|
-
# Generally created using the register() method on the Order and
|
8
|
-
# Shipment classes.
|
9
|
-
#
|
10
|
-
class Endpoint
|
11
|
-
|
12
|
-
attr_reader :uri
|
13
|
-
attr_reader :code, :user, :password
|
14
|
-
|
15
|
-
# create a new endpoint. All 4 options are compulsory.
|
16
|
-
#
|
17
|
-
def initialize(opts = {})
|
18
|
-
raise ArgumentError, "option :uri must be provided" if opts[:uri].nil?
|
19
|
-
raise ArgumentError, "option :code must be provided" if opts[:code].nil?
|
20
|
-
raise ArgumentError, "option :user must be provided" if opts[:user].nil?
|
21
|
-
raise ArgumentError, "option :password must be provided" if opts[:password].nil?
|
22
|
-
|
23
|
-
@uri = opts[:uri]
|
24
|
-
@code, @user, @password = opts[:code], opts[:user], opts[:password]
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,43 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
|
3
|
-
module Cargowise
|
4
|
-
|
5
|
-
# SOAP client for retreiving order data. Not much to
|
6
|
-
# see here, used by the Order resource class.
|
7
|
-
#
|
8
|
-
class OrdersClient < AbstractClient
|
9
|
-
|
10
|
-
# return an array of orders. Each order *should* correspond to a buyer PO.
|
11
|
-
#
|
12
|
-
# filter_hash should be a hash that will be serialised into an
|
13
|
-
# XML fragment specifying the search criteria. See the WSDL documentation
|
14
|
-
# for samples
|
15
|
-
#
|
16
|
-
def get_order_list(endpoint_uri, company_code, username, pass, filter_hash)
|
17
|
-
client = build_client(order_wsdl_path, endpoint_uri, company_code, username, pass)
|
18
|
-
response = client.call(:get_order_list, message: filter_hash)
|
19
|
-
response.xpath("//tns:GetOrderListResult/tns:WebOrder", {"tns" => Cargowise::DEFAULT_NS}).map do |node|
|
20
|
-
Cargowise::Order.new(node)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
# test authentication, returns a string with your company name
|
25
|
-
# if successful
|
26
|
-
#
|
27
|
-
def hello(endpoint_uri, company_code, username, pass)
|
28
|
-
client = build_client(order_wsdl_path, endpoint_uri, company_code, username, pass)
|
29
|
-
response = client.call(:hello)
|
30
|
-
response.xpath("//tns:HelloResponse/tns:HelloResult/text()", {"tns" => Cargowise::DEFAULT_NS}).to_s
|
31
|
-
end
|
32
|
-
|
33
|
-
private
|
34
|
-
|
35
|
-
def order_wsdl_path
|
36
|
-
File.join(
|
37
|
-
File.dirname(__FILE__),
|
38
|
-
"order_wsdl.xml"
|
39
|
-
)
|
40
|
-
end
|
41
|
-
|
42
|
-
end
|
43
|
-
end
|
@@ -1,44 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
|
3
|
-
module Cargowise
|
4
|
-
|
5
|
-
# SOAP client for retreiving shipment data. Not much to
|
6
|
-
# see here, used by the Shipment resource class.
|
7
|
-
#
|
8
|
-
class ShipmentsClient < AbstractClient
|
9
|
-
|
10
|
-
# return an array of shipments. Each shipment should correspond to
|
11
|
-
# a consolidated shipment from the freight company.
|
12
|
-
#
|
13
|
-
# filter_hash should be a hash that will be serialised into an
|
14
|
-
# XML fragment specifying the search criteria. See the WSDL documentation
|
15
|
-
# for samples
|
16
|
-
#
|
17
|
-
def get_shipments_list(endpoint_uri, company_code, username, pass, filter_hash)
|
18
|
-
client = build_client(shipment_wsdl_path, endpoint_uri, company_code, username, pass)
|
19
|
-
response = client.call(:get_shipments_list, message: filter_hash)
|
20
|
-
response.xpath("//tns:GetShipmentsListResult/tns:WebShipment", {"tns" => Cargowise::DEFAULT_NS}).map do |node|
|
21
|
-
Cargowise::Shipment.new(node)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
# test authentication, returns a string with your company name
|
26
|
-
# if successful
|
27
|
-
#
|
28
|
-
def hello(endpoint_uri, company_code, username, pass)
|
29
|
-
client = build_client(shipment_wsdl_path, endpoint_uri, company_code, username, pass)
|
30
|
-
response = client.call(:hello)
|
31
|
-
response.xpath("//tns:HelloResponse/tns:HelloResult/text()", {"tns" => Cargowise::DEFAULT_NS}).to_s
|
32
|
-
end
|
33
|
-
|
34
|
-
private
|
35
|
-
|
36
|
-
def shipment_wsdl_path
|
37
|
-
File.join(
|
38
|
-
File.dirname(__FILE__),
|
39
|
-
"shipment_wsdl.xml"
|
40
|
-
)
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|
44
|
-
end
|