shipping 1.5.1 → 1.6.0
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.
- data/README +1 -0
- data/lib/shipping/base.rb +28 -4
- data/lib/shipping/fedex.rb +63 -1
- data/test/fedex/fedex_test.rb +17 -0
- metadata +53 -46
data/README
CHANGED
@@ -44,6 +44,7 @@ Alternately, you can instantiate the base class and then see both UPS and FedEx
|
|
44
44
|
|
45
45
|
== Authors
|
46
46
|
* Lucas Carlson (mailto:lucas@rufy.com)
|
47
|
+
* Jimmy Baker (mailto:jimmyebaker@gmail.com)
|
47
48
|
* Noah Zoschke (mailto:noah@bitscribe.net)
|
48
49
|
|
49
50
|
This library is released under the terms of the GNU LGPL.
|
data/lib/shipping/base.rb
CHANGED
@@ -3,16 +3,16 @@
|
|
3
3
|
# License:: LGPL
|
4
4
|
|
5
5
|
module Shipping
|
6
|
-
VERSION = "1.
|
6
|
+
VERSION = "1.6.0"
|
7
7
|
|
8
8
|
class ShippingError < StandardError; end
|
9
9
|
class ShippingRequiredFieldError < StandardError; end
|
10
10
|
|
11
11
|
class Base
|
12
|
-
attr_reader :data, :response, :plain_response, :required
|
12
|
+
attr_reader :data, :response, :plain_response, :required, :services
|
13
13
|
|
14
14
|
attr_writer :ups_license_number, :ups_shipper_number, :ups_user, :ups_password, :ups_url, :ups_tool
|
15
|
-
attr_writer :fedex_account, :fedex_meter, :fedex_url
|
15
|
+
attr_writer :fedex_account, :fedex_meter, :fedex_url, :fedex_package_weight_limit_in_lbs
|
16
16
|
|
17
17
|
attr_accessor :name, :phone, :company, :email, :address, :address2, :city, :state, :zip, :country
|
18
18
|
attr_accessor :sender_name, :sender_phone, :sender_company, :sender_email, :sender_address, :sender_city, :sender_state, :sender_zip, :sender_country
|
@@ -20,6 +20,8 @@ module Shipping
|
|
20
20
|
attr_accessor :weight, :weight_units, :insured_value, :declared_value, :transaction_type, :description
|
21
21
|
attr_accessor :measure_units, :measure_length, :measure_width, :measure_height
|
22
22
|
attr_accessor :package_total, :packaging_type, :service_type
|
23
|
+
|
24
|
+
attr_accessor :price, :discount_price, :eta, :time_in_transit
|
23
25
|
|
24
26
|
attr_accessor :ship_date, :dropoff_type, :pay_type, :currency_code, :image_type, :label_type
|
25
27
|
|
@@ -28,12 +30,22 @@ module Shipping
|
|
28
30
|
YAML.load(File.open(prefs)).each {|pref, value| eval("@#{pref} = #{value.inspect}")} if File.exists?(prefs)
|
29
31
|
|
30
32
|
@required = Array.new
|
33
|
+
@services = Array.new
|
31
34
|
|
32
35
|
# include all provided data
|
33
36
|
options.each do |method, value|
|
34
37
|
instance_variable_set("@#{method}", value)
|
35
38
|
end
|
36
|
-
|
39
|
+
|
40
|
+
case options[:carrier]
|
41
|
+
when "fedex"
|
42
|
+
fedex
|
43
|
+
when "ups"
|
44
|
+
ups
|
45
|
+
when nil
|
46
|
+
else
|
47
|
+
raise ShippingError, "unknown service"
|
48
|
+
end
|
37
49
|
end
|
38
50
|
|
39
51
|
# Initializes an instance of Shipping::FedEx with the same instance variables as the base object
|
@@ -45,6 +57,8 @@ module Shipping
|
|
45
57
|
def ups
|
46
58
|
Shipping::UPS.new prepare_vars
|
47
59
|
end
|
60
|
+
|
61
|
+
|
48
62
|
|
49
63
|
def self.state_from_zip(zip)
|
50
64
|
zip = zip.to_i
|
@@ -160,5 +174,15 @@ module Shipping
|
|
160
174
|
end
|
161
175
|
|
162
176
|
STATES = {"al" => "alabama", "ne" => "nebraska", "ak" => "alaska", "nv" => "nevada", "az" => "arizona", "nh" => "new hampshire", "ar" => "arkansas", "nj" => "new jersey", "ca" => "california", "nm" => "new mexico", "co" => "colorado", "ny" => "new york", "ct" => "connecticut", "nc" => "north carolina", "de" => "delaware", "nd" => "north dakota", "fl" => "florida", "oh" => "ohio", "ga" => "georgia", "ok" => "oklahoma", "hi" => "hawaii", "or" => "oregon", "id" => "idaho", "pa" => "pennsylvania", "il" => "illinois", "pr" => "puerto rico", "in" => "indiana", "ri" => "rhode island", "ia" => "iowa", "sc" => "south carolina", "ks" => "kansas", "sd" => "south dakota", "ky" => "kentucky", "tn" => "tennessee", "la" => "louisiana", "tx" => "texas", "me" => "maine", "ut" => "utah", "md" => "maryland", "vt" => "vermont", "ma" => "massachusetts", "va" => "virginia", "mi" => "michigan", "wa" => "washington", "mn" => "minnesota", "dc" => "district of columbia", "ms" => "mississippi", "wv" => "west virginia", "mo" => "missouri", "wi" => "wisconsin", "mt" => "montana", "wy" => "wyoming"}
|
177
|
+
|
178
|
+
def self.initialize_for_fedex_service(xml)
|
179
|
+
s = Shipping::Base.new
|
180
|
+
s.fedex
|
181
|
+
s.eta = REXML::XPath.first(xml, "DeliveryDate").text unless REXML::XPath.match(xml, "DeliveryDate").empty?
|
182
|
+
s.service_type = REXML::XPath.first(xml, "Service").text
|
183
|
+
s.discount_price = REXML::XPath.first(xml, "EstimatedCharges/DiscountedCharges/BaseCharge").text
|
184
|
+
s.price = REXML::XPath.first(xml, "EstimatedCharges/DiscountedCharges/NetCharge").text
|
185
|
+
return s
|
186
|
+
end
|
163
187
|
end
|
164
188
|
end
|
data/lib/shipping/fedex.rb
CHANGED
@@ -68,7 +68,7 @@ module Shipping
|
|
68
68
|
b.PersonName @name
|
69
69
|
b.CompanyName @company
|
70
70
|
b.Department @department if @department
|
71
|
-
b.PhoneNumber @phone.gsub(/[^\d]/,"")
|
71
|
+
b.PhoneNumber @phone.to_s.gsub(/[^\d]/,"")
|
72
72
|
b.tag! :"E-MailAddress", @email
|
73
73
|
}
|
74
74
|
b.Address { |b|
|
@@ -401,6 +401,14 @@ module Shipping
|
|
401
401
|
return true
|
402
402
|
end
|
403
403
|
|
404
|
+
def available_services(force=nil)
|
405
|
+
if @services.empty? || force
|
406
|
+
get_available_services
|
407
|
+
else
|
408
|
+
@services
|
409
|
+
end
|
410
|
+
end
|
411
|
+
|
404
412
|
private
|
405
413
|
|
406
414
|
def get_price #:nodoc:
|
@@ -456,6 +464,60 @@ module Shipping
|
|
456
464
|
return "Error #{code}: #{message}"
|
457
465
|
end
|
458
466
|
|
467
|
+
def get_available_services
|
468
|
+
@required = [:zip, :sender_zip, :weight]
|
469
|
+
@required += [:fedex_account, :fedex_meter, :fedex_url]
|
470
|
+
|
471
|
+
@transaction_type = 'rate_services'
|
472
|
+
@weight = (@weight.to_f*10).round/10.0
|
473
|
+
|
474
|
+
# Ground first
|
475
|
+
@services = []
|
476
|
+
rate_available_services_request('FDXG')
|
477
|
+
rate_available_services_request('FDXE')
|
478
|
+
|
479
|
+
return @services
|
480
|
+
end
|
481
|
+
|
482
|
+
def rate_available_services_request(carrier_code)
|
483
|
+
@data = String.new
|
484
|
+
b = Builder::XmlMarkup.new(:target => @data)
|
485
|
+
b.instruct!
|
486
|
+
b.FDXRateAvailableServicesRequest('xmlns:api' => 'http://www.fedex.com/fsmapi', 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance', 'xsi:noNamespaceSchemaLocation' => 'FDXRateAvailableServicesRequest.xsd') { |b|
|
487
|
+
b.RequestHeader { |b|
|
488
|
+
b.AccountNumber @fedex_account
|
489
|
+
b.MeterNumber @fedex_meter
|
490
|
+
b.CarrierCode carrier_code
|
491
|
+
}
|
492
|
+
b.ShipDate @ship_date unless @ship_date.blank?
|
493
|
+
b.DropoffType DropoffTypes[@dropoff_type] || DropoffTypes['regular_pickup']
|
494
|
+
b.Packaging PackageTypes[@packaging_type] || PackageTypes['your_packaging']
|
495
|
+
b.WeightUnits @weight_units || 'LBS'
|
496
|
+
b.Weight @weight || '1.0'
|
497
|
+
b.ListRate 'false'
|
498
|
+
b.OriginAddress { |b|
|
499
|
+
b.StateOrProvince @sender_state
|
500
|
+
b.PostalCode @sender_zip
|
501
|
+
b.CountryCode @sender_country_code || 'US'
|
502
|
+
}
|
503
|
+
b.DestinationAddress { |b|
|
504
|
+
b.StateOrProvince @state
|
505
|
+
b.PostalCode @zip
|
506
|
+
b.CountryCode @country_code || 'US'
|
507
|
+
}
|
508
|
+
b.Payment { |b|
|
509
|
+
b.PayorType PaymentTypes[@pay_type] || PaymentTypes['sender']
|
510
|
+
}
|
511
|
+
b.PackageCount @package_total || 1
|
512
|
+
}
|
513
|
+
get_response @fedex_url
|
514
|
+
|
515
|
+
REXML::XPath.each(@response, "//Entry") { |el|
|
516
|
+
@services << Shipping::Base.initialize_for_fedex_service(el)
|
517
|
+
}
|
518
|
+
|
519
|
+
end
|
520
|
+
|
459
521
|
# The following type hashes are to allow cross-api data retrieval
|
460
522
|
|
461
523
|
ServiceTypes = {
|
data/test/fedex/fedex_test.rb
CHANGED
@@ -64,6 +64,23 @@ class FedExTest < Test::Unit::TestCase
|
|
64
64
|
assert @ship.void(@label.tracking_number)
|
65
65
|
end
|
66
66
|
|
67
|
+
def test_available_services
|
68
|
+
@ship.name = "Package Receiver"
|
69
|
+
@ship.phone = "555-555-5555"
|
70
|
+
@ship.email = "lucas@rufy.com"
|
71
|
+
@ship.address = "Some address"
|
72
|
+
@ship.city = "Portland"
|
73
|
+
|
74
|
+
@ship.sender_name = "Package Sender"
|
75
|
+
@ship.sender_phone = "333-333-3333"
|
76
|
+
@ship.sender_email = "john@doe.com"
|
77
|
+
@ship.sender_address = "Ok old address"
|
78
|
+
@ship.sender_city = "New York"
|
79
|
+
|
80
|
+
assert_nothing_raised { @available_services = @ship.available_services }
|
81
|
+
assert_not_nil @available_services
|
82
|
+
end
|
83
|
+
|
67
84
|
def test_void_fail
|
68
85
|
# made up tracking number
|
69
86
|
assert_raise(Shipping::ShippingError) { @ship.void('470012923511666') }
|
metadata
CHANGED
@@ -1,68 +1,75 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.8.11
|
3
|
-
specification_version: 1
|
4
2
|
name: shipping
|
5
3
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.
|
7
|
-
date: 2007-07-10 00:00:00 -07:00
|
8
|
-
summary: A general shipping module to find out the shipping prices via UPS or FedEx.
|
9
|
-
require_paths:
|
10
|
-
- lib
|
11
|
-
email: lucas@rufy.com
|
12
|
-
homepage: http://shipping.rufy.com/
|
13
|
-
rubyforge_project:
|
14
|
-
description: A general shipping module to find out the shipping prices via UPS or FedEx.
|
15
|
-
autorequire: shipping
|
16
|
-
default_executable:
|
17
|
-
bindir: bin
|
18
|
-
has_rdoc: true
|
19
|
-
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">"
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 0.0.0
|
24
|
-
version:
|
4
|
+
version: 1.6.0
|
25
5
|
platform: ruby
|
26
|
-
signing_key:
|
27
|
-
cert_chain:
|
28
6
|
authors:
|
29
7
|
- Lucas Carlson
|
8
|
+
autorequire: shipping
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-10-10 00:00:00 -07:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: builder
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 1.2.0
|
24
|
+
version:
|
25
|
+
description: " A general shipping module to find out the shipping prices via UPS or FedEx.\n"
|
26
|
+
email: lucas@rufy.com
|
27
|
+
executables: []
|
28
|
+
|
29
|
+
extensions: []
|
30
|
+
|
31
|
+
extra_rdoc_files: []
|
32
|
+
|
30
33
|
files:
|
31
34
|
- lib/extensions.rb
|
32
|
-
- lib/shipping
|
33
|
-
- lib/shipping.rb
|
34
35
|
- lib/shipping/base.rb
|
35
36
|
- lib/shipping/fedex.rb
|
36
37
|
- lib/shipping/ups.rb
|
37
|
-
-
|
38
|
-
- test/fedex
|
39
|
-
- test/test_helper.rb
|
40
|
-
- test/ups
|
38
|
+
- lib/shipping.rb
|
41
39
|
- test/base/base_test.rb
|
42
40
|
- test/fedex/fedex_test.rb
|
41
|
+
- test/test_helper.rb
|
43
42
|
- test/ups/ups_test.rb
|
44
43
|
- LICENSE
|
45
44
|
- Rakefile
|
46
45
|
- README
|
47
|
-
|
46
|
+
has_rdoc: true
|
47
|
+
homepage: http://shipping.rufy.com/
|
48
|
+
licenses: []
|
48
49
|
|
50
|
+
post_install_message:
|
49
51
|
rdoc_options: []
|
50
52
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
53
|
+
require_paths:
|
54
|
+
- lib
|
55
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: "0"
|
60
|
+
version:
|
61
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
62
|
+
requirements:
|
63
|
+
- - ">="
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: "0"
|
66
|
+
version:
|
57
67
|
requirements:
|
58
68
|
- An xml-builder library.
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
- !ruby/object:Gem::Version
|
67
|
-
version: 1.2.0
|
68
|
-
version:
|
69
|
+
rubyforge_project:
|
70
|
+
rubygems_version: 1.3.5
|
71
|
+
signing_key:
|
72
|
+
specification_version: 3
|
73
|
+
summary: A general shipping module to find out the shipping prices via UPS or FedEx.
|
74
|
+
test_files: []
|
75
|
+
|