shippinglogic 1.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. data/.document +5 -0
  2. data/CHANGELOG.rdoc +55 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +175 -0
  5. data/Rakefile +37 -0
  6. data/VERSION.yml +5 -0
  7. data/init.rb +1 -0
  8. data/lib/shippinglogic.rb +3 -0
  9. data/lib/shippinglogic/attributes.rb +121 -0
  10. data/lib/shippinglogic/error.rb +22 -0
  11. data/lib/shippinglogic/fedex.rb +84 -0
  12. data/lib/shippinglogic/fedex/cancel.rb +47 -0
  13. data/lib/shippinglogic/fedex/enumerations.rb +348 -0
  14. data/lib/shippinglogic/fedex/error.rb +47 -0
  15. data/lib/shippinglogic/fedex/rate.rb +229 -0
  16. data/lib/shippinglogic/fedex/request.rb +134 -0
  17. data/lib/shippinglogic/fedex/response.rb +72 -0
  18. data/lib/shippinglogic/fedex/service.rb +11 -0
  19. data/lib/shippinglogic/fedex/ship.rb +238 -0
  20. data/lib/shippinglogic/fedex/signature.rb +68 -0
  21. data/lib/shippinglogic/fedex/track.rb +124 -0
  22. data/lib/shippinglogic/proxy.rb +23 -0
  23. data/lib/shippinglogic/service.rb +42 -0
  24. data/lib/shippinglogic/ups.rb +83 -0
  25. data/lib/shippinglogic/ups/cancel.rb +52 -0
  26. data/lib/shippinglogic/ups/enumerations.rb +56 -0
  27. data/lib/shippinglogic/ups/error.rb +42 -0
  28. data/lib/shippinglogic/ups/label.rb +50 -0
  29. data/lib/shippinglogic/ups/rate.rb +228 -0
  30. data/lib/shippinglogic/ups/request.rb +49 -0
  31. data/lib/shippinglogic/ups/response.rb +58 -0
  32. data/lib/shippinglogic/ups/service.rb +11 -0
  33. data/lib/shippinglogic/ups/ship_accept.rb +53 -0
  34. data/lib/shippinglogic/ups/ship_confirm.rb +170 -0
  35. data/lib/shippinglogic/ups/track.rb +118 -0
  36. data/lib/shippinglogic/validation.rb +32 -0
  37. data/shippinglogic.gemspec +120 -0
  38. data/spec/attributes_spec.rb +67 -0
  39. data/spec/config/fedex_credentials.example.yml +4 -0
  40. data/spec/config/ups_credentials.example.yml +3 -0
  41. data/spec/error_spec.rb +43 -0
  42. data/spec/fedex/cancel_spec.rb +10 -0
  43. data/spec/fedex/error_spec.rb +26 -0
  44. data/spec/fedex/rate_spec.rb +87 -0
  45. data/spec/fedex/request_spec.rb +15 -0
  46. data/spec/fedex/responses/blank.xml +0 -0
  47. data/spec/fedex/responses/cancel_not_found.xml +7 -0
  48. data/spec/fedex/responses/failed_authentication.xml +7 -0
  49. data/spec/fedex/responses/malformed.xml +8 -0
  50. data/spec/fedex/responses/rate_defaults.xml +7 -0
  51. data/spec/fedex/responses/rate_insurance.xml +9 -0
  52. data/spec/fedex/responses/rate_no_services.xml +7 -0
  53. data/spec/fedex/responses/rate_non_custom_packaging.xml +7 -0
  54. data/spec/fedex/responses/ship_defaults.xml +7 -0
  55. data/spec/fedex/responses/ship_with_no_signature.xml +7 -0
  56. data/spec/fedex/responses/signature_defaults.xml +7 -0
  57. data/spec/fedex/responses/track_defaults.xml +7 -0
  58. data/spec/fedex/responses/unexpected.xml +1 -0
  59. data/spec/fedex/service_spec.rb +19 -0
  60. data/spec/fedex/ship_spec.rb +37 -0
  61. data/spec/fedex/signature_spec.rb +11 -0
  62. data/spec/fedex/spec_helper.rb +84 -0
  63. data/spec/fedex/track_spec.rb +37 -0
  64. data/spec/fedex_spec.rb +16 -0
  65. data/spec/lib/interceptor.rb +17 -0
  66. data/spec/proxy_spec.rb +42 -0
  67. data/spec/service_spec.rb +23 -0
  68. data/spec/spec_helper.rb +12 -0
  69. data/spec/ups/responses/blank.xml +0 -0
  70. data/spec/ups/responses/track_defaults.xml +2 -0
  71. data/spec/ups/spec_helper.rb +43 -0
  72. data/spec/ups_spec.rb +16 -0
  73. data/spec/validation_spec.rb +49 -0
  74. metadata +163 -0
@@ -0,0 +1,32 @@
1
+ require "shippinglogic/error"
2
+
3
+ module Shippinglogic
4
+ # This module is more for application integration, so you can do something like:
5
+ #
6
+ # tracking = fedex.tracking
7
+ # if tracking.valid?
8
+ # # render a successful response
9
+ # else
10
+ # # do something with the errors: fedex.errors
11
+ # end
12
+ module Validation
13
+ # Just an array of errors that were encounted if valid? returns false.
14
+ def errors
15
+ @errors ||= []
16
+ end
17
+
18
+ # Allows you to determine if the request is valid or not. All validation is delegated to the API
19
+ # services, so what this does is make a call to the API and rescue any errors, then it puts those
20
+ # errors into the 'errors' array.
21
+ def valid?
22
+ begin
23
+ target
24
+ true
25
+ rescue Error => e
26
+ errors.clear
27
+ self.errors << e.message
28
+ false
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,120 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "shippinglogic"
8
+ s.version = "1.2.3"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Ben Johnson of Binary Logic"]
12
+ s.date = "2012-04-20"
13
+ s.description = "Easily use FedEx, UPS, USPS web services with an elegant and simple syntax."
14
+ s.email = "bjohnson@binarylogic.com"
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ "CHANGELOG.rdoc",
22
+ "LICENSE",
23
+ "README.rdoc",
24
+ "Rakefile",
25
+ "VERSION.yml",
26
+ "init.rb",
27
+ "lib/shippinglogic.rb",
28
+ "lib/shippinglogic/attributes.rb",
29
+ "lib/shippinglogic/error.rb",
30
+ "lib/shippinglogic/fedex.rb",
31
+ "lib/shippinglogic/fedex/cancel.rb",
32
+ "lib/shippinglogic/fedex/enumerations.rb",
33
+ "lib/shippinglogic/fedex/error.rb",
34
+ "lib/shippinglogic/fedex/rate.rb",
35
+ "lib/shippinglogic/fedex/request.rb",
36
+ "lib/shippinglogic/fedex/response.rb",
37
+ "lib/shippinglogic/fedex/service.rb",
38
+ "lib/shippinglogic/fedex/ship.rb",
39
+ "lib/shippinglogic/fedex/signature.rb",
40
+ "lib/shippinglogic/fedex/track.rb",
41
+ "lib/shippinglogic/proxy.rb",
42
+ "lib/shippinglogic/service.rb",
43
+ "lib/shippinglogic/ups.rb",
44
+ "lib/shippinglogic/ups/cancel.rb",
45
+ "lib/shippinglogic/ups/enumerations.rb",
46
+ "lib/shippinglogic/ups/error.rb",
47
+ "lib/shippinglogic/ups/label.rb",
48
+ "lib/shippinglogic/ups/rate.rb",
49
+ "lib/shippinglogic/ups/request.rb",
50
+ "lib/shippinglogic/ups/response.rb",
51
+ "lib/shippinglogic/ups/service.rb",
52
+ "lib/shippinglogic/ups/ship_accept.rb",
53
+ "lib/shippinglogic/ups/ship_confirm.rb",
54
+ "lib/shippinglogic/ups/track.rb",
55
+ "lib/shippinglogic/validation.rb",
56
+ "shippinglogic.gemspec",
57
+ "spec/attributes_spec.rb",
58
+ "spec/config/fedex_credentials.example.yml",
59
+ "spec/config/ups_credentials.example.yml",
60
+ "spec/error_spec.rb",
61
+ "spec/fedex/cancel_spec.rb",
62
+ "spec/fedex/error_spec.rb",
63
+ "spec/fedex/rate_spec.rb",
64
+ "spec/fedex/request_spec.rb",
65
+ "spec/fedex/responses/blank.xml",
66
+ "spec/fedex/responses/cancel_not_found.xml",
67
+ "spec/fedex/responses/failed_authentication.xml",
68
+ "spec/fedex/responses/malformed.xml",
69
+ "spec/fedex/responses/rate_defaults.xml",
70
+ "spec/fedex/responses/rate_insurance.xml",
71
+ "spec/fedex/responses/rate_no_services.xml",
72
+ "spec/fedex/responses/rate_non_custom_packaging.xml",
73
+ "spec/fedex/responses/ship_defaults.xml",
74
+ "spec/fedex/responses/ship_with_no_signature.xml",
75
+ "spec/fedex/responses/signature_defaults.xml",
76
+ "spec/fedex/responses/track_defaults.xml",
77
+ "spec/fedex/responses/unexpected.xml",
78
+ "spec/fedex/service_spec.rb",
79
+ "spec/fedex/ship_spec.rb",
80
+ "spec/fedex/signature_spec.rb",
81
+ "spec/fedex/spec_helper.rb",
82
+ "spec/fedex/track_spec.rb",
83
+ "spec/fedex_spec.rb",
84
+ "spec/lib/interceptor.rb",
85
+ "spec/proxy_spec.rb",
86
+ "spec/service_spec.rb",
87
+ "spec/spec_helper.rb",
88
+ "spec/ups/responses/blank.xml",
89
+ "spec/ups/responses/track_defaults.xml",
90
+ "spec/ups/spec_helper.rb",
91
+ "spec/ups_spec.rb",
92
+ "spec/validation_spec.rb"
93
+ ]
94
+ s.homepage = "http://github.com/binarylogic/shippinglogic"
95
+ s.require_paths = ["lib"]
96
+ s.rubygems_version = "1.8.17"
97
+ s.summary = "A simple and clean library to interface with shipping carriers"
98
+
99
+ if s.respond_to? :specification_version then
100
+ s.specification_version = 3
101
+
102
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
103
+ s.add_development_dependency(%q<rspec>, [">= 0"])
104
+ s.add_development_dependency(%q<fakeweb>, [">= 0"])
105
+ s.add_runtime_dependency(%q<httparty>, [">= 0.4.4"])
106
+ s.add_runtime_dependency(%q<builder>, [">= 2.1.2"])
107
+ else
108
+ s.add_dependency(%q<rspec>, [">= 0"])
109
+ s.add_dependency(%q<fakeweb>, [">= 0"])
110
+ s.add_dependency(%q<httparty>, [">= 0.4.4"])
111
+ s.add_dependency(%q<builder>, [">= 2.1.2"])
112
+ end
113
+ else
114
+ s.add_dependency(%q<rspec>, [">= 0"])
115
+ s.add_dependency(%q<fakeweb>, [">= 0"])
116
+ s.add_dependency(%q<httparty>, [">= 0.4.4"])
117
+ s.add_dependency(%q<builder>, [">= 2.1.2"])
118
+ end
119
+ end
120
+
@@ -0,0 +1,67 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "Service Attributes" do
4
+ before(:all) do
5
+ class ::ServiceWithAttributes
6
+ include Shippinglogic::Attributes
7
+
8
+ attribute :tracking_number, :string
9
+ attribute :packaging_type, :string, :default => "YOUR_PACKAGING"
10
+ attribute :special_services_requested, :array
11
+ attribute :ship_time, :datetime, :default => lambda { |shipment| Time.now }
12
+ end
13
+ end
14
+
15
+ after(:all) do
16
+ Object.send(:remove_const, :ServiceWithAttributes)
17
+ end
18
+
19
+ it "should allow setting attributes upon initialization" do
20
+ service = ServiceWithAttributes.new(:tracking_number => "TEST")
21
+ service.tracking_number.should == "TEST"
22
+ end
23
+
24
+ it "should allow setting attributes individually" do
25
+ service = ServiceWithAttributes.new
26
+ service.tracking_number = "TEST"
27
+ service.tracking_number.should == "TEST"
28
+ end
29
+
30
+ it "should allow setting attributes with a hash" do
31
+ service = ServiceWithAttributes.new
32
+ service.attributes = {:tracking_number => "TEST"}
33
+ service.tracking_number.should == "TEST"
34
+ end
35
+
36
+ it "should allow reading attributes" do
37
+ service = ServiceWithAttributes.new
38
+ service.attributes = {:tracking_number => "TEST"}
39
+ service.attributes.should be_a(Hash)
40
+ service.attributes.should have_key(:tracking_number)
41
+ service.attributes[:tracking_number].should == "TEST"
42
+ end
43
+
44
+ it "should implement defaults" do
45
+ service = ServiceWithAttributes.new
46
+ service.packaging_type.should == "YOUR_PACKAGING"
47
+ end
48
+
49
+ it "should use blank array as defaults for arrays" do
50
+ service = ServiceWithAttributes.new
51
+ service.special_services_requested.should == []
52
+ end
53
+
54
+ it "should call procs during run time if a default is a proc" do
55
+ service = ServiceWithAttributes.new
56
+ service.ship_time.to_s.should == Time.now.to_s
57
+ end
58
+
59
+ it "should parse string representations of times" do
60
+ service = ServiceWithAttributes.new
61
+ service.ship_time = "19551105000000"
62
+ service.ship_time.should be_a(Time)
63
+ service.ship_time.strftime("%B") == "November"
64
+ service.ship_time.day.should == 5
65
+ service.ship_time.year.should == 1955
66
+ end
67
+ end
@@ -0,0 +1,4 @@
1
+ key: your key
2
+ password: your password
3
+ account: your account number
4
+ meter: your meter number
@@ -0,0 +1,3 @@
1
+ key: your key
2
+ password: your password
3
+ account: your account username
@@ -0,0 +1,43 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "Shippinglogic Errors" do
4
+ before(:each) do
5
+ @error = Shippinglogic::Error.new("", "")
6
+ end
7
+
8
+ it "should inherit from StandardError" do
9
+ @error.should be_a(StandardError)
10
+ end
11
+
12
+ it "should contain an array of errors" do
13
+ @error.errors.should == []
14
+ end
15
+
16
+ it "should be able to add error hashes" do
17
+ @error.errors.size.should == 0
18
+ @error.add_error("MESSAGE")
19
+ @error.errors.size.should == 1
20
+ @error.errors.last.should be_a(Hash)
21
+ end
22
+
23
+ it "should append (not prepend) error hashes" do
24
+ @error.add_error("FIRST")
25
+ @error.errors.last[:message].should == "FIRST"
26
+ @error.add_error("LAST")
27
+ @error.errors.last[:message].should == "LAST"
28
+ end
29
+
30
+ it "should have error hashes containing a required message" do
31
+ @error.add_error("MESSAGE")
32
+ @error.errors.last.should have_key(:message)
33
+ @error.errors.last[:message].should == "MESSAGE"
34
+ end
35
+
36
+ it "should have error hashes containing an optional code" do
37
+ @error.add_error("WITHOUT")
38
+ @error.errors.last.should have_key(:code)
39
+ @error.errors.last[:code].should be_nil
40
+ @error.add_error("WITH", "CODE")
41
+ @error.errors.last[:code].should == "CODE"
42
+ end
43
+ end
@@ -0,0 +1,10 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "FedEx Track" do
4
+ it "should cancel the shipment" do
5
+ use_response(:cancel_not_found)
6
+ fedex = new_fedex
7
+ cancel = fedex.cancel(:tracking_number => fedex_tracking_number)
8
+ lambda { cancel.perform }.should raise_error(Shippinglogic::FedEx::Error, "Unable to retrieve record from database")
9
+ end
10
+ end
@@ -0,0 +1,26 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "FedEx Error" do
4
+ it "should handle blank response errors" do
5
+ use_response(:blank)
6
+ lambda { new_fedex.track(:tracking_number => fedex_tracking_number).size }.should raise_error(Shippinglogic::FedEx::Error, "The response from FedEx was blank.")
7
+ end
8
+
9
+ it "should pass through malformed errors" do
10
+ use_response(:malformed, :content_type => "")
11
+ lambda { new_fedex.track(:tracking_number => fedex_tracking_number).size }.should raise_error(Shippinglogic::FedEx::Error, "The response from FedEx was malformed and was not in a valid XML format.")
12
+ end
13
+
14
+ it "should pass through authentication errors" do
15
+ use_response(:failed_authentication)
16
+ fedex = Shippinglogic::FedEx.new("", "", "", "")
17
+ lambda { fedex.track(:tracking_number => fedex_tracking_number).size }.should raise_error(Shippinglogic::FedEx::Error, "Authentication Failed")
18
+ end
19
+
20
+ it "should pass through unexpected errors" do
21
+ use_response(:unexpected)
22
+ lambda { new_fedex.track(:tracking_number => fedex_tracking_number).size }.should raise_error(Shippinglogic::FedEx::Error, "There was a problem with your fedex request, and " +
23
+ "we couldn't locate a specific error message. This means your response was in an unexpected format. You might try glancing at the raw response " +
24
+ "by using the 'response' method on this error object.")
25
+ end
26
+ end
@@ -0,0 +1,87 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "FedEx Rate" do
4
+ it "should rate the shipment" do
5
+ use_response(:rate_defaults)
6
+
7
+ fedex = new_fedex
8
+ rates = fedex.rate
9
+
10
+ rates.attributes = fedex_shipper
11
+ rates.attributes = fedex_recipient
12
+ rates.attributes = fedex_package
13
+ rates.size.should == 6
14
+
15
+ rate = rates.first
16
+ rate.name.should == "First Overnight"
17
+ rate.type.should == "FIRST_OVERNIGHT"
18
+ rate.saturday.should == false
19
+ rate.delivered_by.should == Time.parse("Fri Aug 07 08:00:00 -0400 2009")
20
+ rate.speed.should == 86400 # 1.day
21
+ rate.rate.should == 70.01
22
+ rate.currency.should == "USD"
23
+ end
24
+
25
+ it "should not require package dimensions when not using custom packaging" do
26
+ use_response(:rate_non_custom_packaging)
27
+
28
+ fedex = new_fedex
29
+ rates = fedex.rate
30
+
31
+ rates.attributes = fedex_shipper
32
+ rates.attributes = fedex_recipient
33
+ rates.packaging_type = "FEDEX_ENVELOPE"
34
+ rates.package_weight = 0.1
35
+
36
+ rates.size.should == 5
37
+
38
+ rate = rates.first
39
+ rate.name.should == "First Overnight"
40
+ rate.type.should == "FIRST_OVERNIGHT"
41
+ rate.saturday.should == false
42
+ rate.delivered_by.should == Time.parse("Mon Aug 10 08:00:00 -0400 2009")
43
+ rate.speed.should == 86400 # 1.day
44
+ rate.rate.should == 50.43
45
+ rate.currency.should == "USD"
46
+ end
47
+
48
+ it "should handle responses with no services" do
49
+ use_response(:rate_no_services)
50
+
51
+ fedex = new_fedex
52
+ rates = fedex.rate
53
+
54
+ rates.attributes = fedex_shipper
55
+ rates.attributes = fedex_recipient
56
+ rates.packaging_type = "FEDEX_ENVELOPE"
57
+ rates.package_weight = 2
58
+ rates.size.should == 0
59
+ end
60
+
61
+ it "should remove any services that don't meet the deadline" do
62
+ use_response(:rate_defaults)
63
+
64
+ fedex = new_fedex
65
+ rates = fedex.rate
66
+
67
+ rates.attributes = fedex_shipper
68
+ rates.attributes = fedex_recipient
69
+ rates.attributes = fedex_package
70
+ rates.delivery_deadline = Time.parse("Aug 07 08:01:00 -0400 2009")
71
+ rates.size.should == 1
72
+ rates.first.delivered_by.should == Time.parse("Fri Aug 07 08:00:00 -0400 2009")
73
+ end
74
+
75
+ it "should rate the shipment with an insured value" do
76
+ use_response(:rate_insurance)
77
+
78
+ fedex = new_fedex
79
+ rates = fedex.rate
80
+
81
+ rates.attributes = fedex_shipper
82
+ rates.attributes = fedex_recipient
83
+ rates.attributes = fedex_package
84
+ rates.insured_value = 200
85
+ rates.size.should == 6
86
+ end
87
+ end
@@ -0,0 +1,15 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "FedEx Attributes" do
4
+ it "should convert full country names to country codes" do
5
+ fedex = new_fedex
6
+ rates = fedex.rate
7
+ rates.send(:country_code, "United States").should == "US"
8
+ end
9
+
10
+ it "should convert full state names to state codes" do
11
+ fedex = new_fedex
12
+ rates = fedex.rate
13
+ rates.send(:state_code, "Texas").should == "TX"
14
+ end
15
+ end
File without changes
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <v6:ShipmentReply xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:v6="http://fedex.com/ws/ship/v6"><v6:HighestSeverity>ERROR</v6:HighestSeverity><v6:Notifications><v6:Severity>ERROR</v6:Severity><v6:Source>ship</v6:Source><v6:Code>8149</v6:Code><v6:Message>Unable to retrieve record from database</v6:Message><v6:LocalizedMessage>Unable to retrieve record from database</v6:LocalizedMessage></v6:Notifications><v6:Version>
3
+ <v6:ServiceId>ship</v6:ServiceId>
4
+ <v6:Major>6</v6:Major>
5
+ <v6:Intermediate>0</v6:Intermediate>
6
+ <v6:Minor>0</v6:Minor>
7
+ </v6:Version></v6:ShipmentReply>
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <ns:TrackReply xmlns:ns="http://fedex.com/ws/track/v3"><ns:HighestSeverity>ERROR</ns:HighestSeverity><ns:Notifications><ns:Severity>ERROR</ns:Severity><ns:Source>prof</ns:Source><ns:Code>1000</ns:Code><ns:Message>Authentication Failed</ns:Message></ns:Notifications><ns:Version>
3
+ <ns:ServiceId>trck</ns:ServiceId>
4
+ <ns:Major>3</ns:Major>
5
+ <ns:Intermediate>0</ns:Intermediate>
6
+ <ns:Minor>0</ns:Minor>
7
+ </ns:Version></ns:TrackReply>
@@ -0,0 +1,8 @@
1
+ malformed\nfdsf
2
+ fsd
3
+ fds
4
+
5
+
6
+
7
+ dsf
8
+ dsfsdf