shippinglogic 1.2.3

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 (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