binarylogic-shippinglogic 1.1.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.rdoc CHANGED
@@ -1,3 +1,8 @@
1
+ == 1.1.1 released 2009-07-17
2
+
3
+ * Added :just_validate options for creating shipments, that leverages FedExs validation option without creating a shipment.
4
+ * Added more shipper and recipient options, also standardized those options between rating and shipping to create consistency.
5
+
1
6
  == 1.1.0 released 2009-07-16
2
7
 
3
8
  * Added another layer to tracking. You dont get an array of events anymore, you get a Shippinglogic::Fedex::Track::Details object that has information the single shipment. Such as delivery date, signature name, etc. To access the events you just call the events method on this object.
data/README.rdoc CHANGED
@@ -36,24 +36,30 @@ See below for usage examples.
36
36
  What I think is unique about this library is it's usage / syntax:
37
37
 
38
38
  fedex = Shippinglogic::FedEx.new(key, password, account, meter)
39
- tracking = fedex.track(:tracking_number => "XXXXXXXXXXXXXXXXX")
39
+ tracking_details = fedex.track(:tracking_number => "XXXXXXXXXXXXXXXXX")
40
40
  # => A proxy object that delegates calls to an array of Shippinglogic::FedEx::Track::Event objects
41
41
 
42
42
  # this shows that the tracking object is a proxy for the underlying array
43
- tracking.tracking_number
43
+ tracking_details.tracking_number
44
44
  # => "XXXXXXXXXXXXXXXXX"
45
45
 
46
- tracking.tracking_number = "YYYYYYYYYYYYYYYYYY"
46
+ tracking_details.tracking_number = "YYYYYYYYYYYYYYYYYY"
47
47
  # => "YYYYYYYYYYYYYYYYYY"
48
48
 
49
- tracking.class
50
- # => Array
49
+ tracking_details.class
50
+ # => Shippinglogic::FedEx::Track::Details
51
51
 
52
- tracking.first
52
+ tracking_details.status
53
+ # => "Delivered"
54
+
55
+ tracking_details.signature_name
56
+ # => "KKING"
57
+
58
+ tracking_details.events.first
53
59
  # => #<Shippinglogic::FedEx::Track::Event @postal_code="95817", @name="Delivered", @state="CA", @residential=false,
54
60
  # @city="Sacramento", @type="DL", @country="US", @occured_at=Mon Dec 08 10:43:37 -0500 2008>
55
61
 
56
- tracking.first.name
62
+ tracking_details.first.name
57
63
  # => "Delivered"
58
64
 
59
65
  == Calls to the web services are lazy
@@ -69,21 +75,21 @@ This is similar to how ActiveRecord's association proxies work. When you call "u
69
75
  You will notice above we assign the result of the 'track' method to a variable called 'tracking'. That object has more to it:
70
76
 
71
77
  # Initializing
72
- tracking = fedex.track(:tracking_number => "XXXXXXXXXXXXX")
73
- tracking.tracking_number
78
+ tracking_details = fedex.track(:tracking_number => "XXXXXXXXXXXXX")
79
+ tracking_details.tracking_number
74
80
  # => "XXXXXXXXXXXXX"
75
81
 
76
82
  # Attribute accessors
77
- tracking.tracking_number = "YYYYYYYYYYYYYYY"
78
- tracking.tracking_number
83
+ tracking_details.tracking_number = "YYYYYYYYYYYYYYY"
84
+ tracking_details.tracking_number
79
85
  # => "YYYYYYYYYYYYYYY"
80
86
 
81
87
  # Mass attribute setting
82
- tracking.attributes = {:tracking_number => "ZZZZZZZZZZZZZZZZ"}
83
- tracking.tracking_number
88
+ tracking_details.attributes = {:tracking_number => "ZZZZZZZZZZZZZZZZ"}
89
+ tracking_details.tracking_number
84
90
  # => "ZZZZZZZZZZZZZZZZ"
85
91
 
86
- tracking.attributes
92
+ tracking_details.attributes
87
93
  # => {:tracking_number => "ZZZZZZZZZZZZZZZZ"}
88
94
 
89
95
  == Available services and their features
@@ -110,11 +116,11 @@ What's nice about having an object is that you can pass it around. Let's say you
110
116
 
111
117
  class TrackingController < ApplicationController
112
118
  def new
113
- @tracking = fedex.track(params[:tracking])
119
+ @tracking_details = fedex.track(params[:tracking])
114
120
  end
115
121
 
116
122
  def create
117
- @tracking = fedex.track(params[:tracking])
123
+ @tracking_details = fedex.track(params[:tracking])
118
124
  render :action => :new if !@tracking.successful?
119
125
  end
120
126
 
@@ -127,7 +133,7 @@ What's nice about having an object is that you can pass it around. Let's say you
127
133
  That's pretty simple. Now check out your form:
128
134
 
129
135
  # new.html.haml
130
- - form_for @tracking do |f|
136
+ - form_for @tracking_details do |f|
131
137
  = f.error_messages
132
138
  = f.text_field :tracking_number
133
139
  = f.submit "Track"
@@ -135,7 +141,8 @@ That's pretty simple. Now check out your form:
135
141
  Then your results:
136
142
 
137
143
  # create.html.haml
138
- - @tracking.each do |event|
144
+ .signature_name= @tracking_details.signature_name
145
+ - @tracking_details.events.each do |event|
139
146
  .event
140
147
  .name= event.name
141
148
  .occured_at= event.occured_at.to_s(:long)
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
2
  :minor: 1
3
- :patch: 0
3
+ :patch: 1
4
4
  :major: 1
@@ -6,6 +6,11 @@ module Shippinglogic
6
6
  # == Options
7
7
  # === Shipper options
8
8
  #
9
+ # * <tt>shipper_name</tt> - name of the shipper.
10
+ # * <tt>shipper_title</tt> - title of the shipper.
11
+ # * <tt>shipper_company_name</tt> - company name of the shipper.
12
+ # * <tt>shipper_phone_number</tt> - phone number of the shipper.
13
+ # * <tt>shipper_email</tt> - email of the shipper.
9
14
  # * <tt>shipper_streets</tt> - street part of the address, separate multiple streets with a new line, dont include blank lines.
10
15
  # * <tt>shipper_city</tt> - city part of the address.
11
16
  # * <tt>shipper_state_</tt> - state part of the address, use state abreviations.
@@ -15,6 +20,11 @@ module Shippinglogic
15
20
  #
16
21
  # === Recipient options
17
22
  #
23
+ # * <tt>recipient_name</tt> - name of the recipient.
24
+ # * <tt>recipient_title</tt> - title of the recipient.
25
+ # * <tt>recipient_company_name</tt> - company name of the recipient.
26
+ # * <tt>recipient_phone_number</tt> - phone number of the recipient.
27
+ # * <tt>recipient_email</tt> - email of the recipient.
18
28
  # * <tt>recipient_streets</tt> - street part of the address, separate multiple streets with a new line, dont include blank lines.
19
29
  # * <tt>recipient_city</tt> - city part of the address.
20
30
  # * <tt>recipient_state</tt> - state part of the address, use state abreviations.
@@ -92,6 +102,11 @@ module Shippinglogic
92
102
  VERSION = {:major => 6, :intermediate => 0, :minor => 0}
93
103
 
94
104
  # shipper options
105
+ attribute :shipper_name, :string
106
+ attribute :shipper_title, :string
107
+ attribute :shipper_company_name, :string
108
+ attribute :shipper_phone_number, :string
109
+ attribute :shipper_email, :string
95
110
  attribute :shipper_streets, :string
96
111
  attribute :shipper_city, :string
97
112
  attribute :shipper_state, :string
@@ -100,6 +115,11 @@ module Shippinglogic
100
115
  attribute :shipper_residential, :boolean, :default => false
101
116
 
102
117
  # recipient options
118
+ attribute :recipient_name, :string
119
+ attribute :recipient_title, :string
120
+ attribute :recipient_company_name, :string
121
+ attribute :recipient_phone_number, :string
122
+ attribute :recipient_email, :string
103
123
  attribute :recipient_streets, :string
104
124
  attribute :recipient_city, :string
105
125
  attribute :recipient_state, :string
@@ -46,9 +46,11 @@ module Shippinglogic
46
46
  # A convenience method for building the contact block in your XML request
47
47
  def build_contact(b, type)
48
48
  b.Contact do
49
- b.Contact send("#{type}_name") if send("#{type}_name")
49
+ b.PersonName send("#{type}_name") if send("#{type}_name")
50
+ b.Title send("#{type}_title") if send("#{type}_title")
50
51
  b.CompanyName send("#{type}_company_name") if send("#{type}_company_name")
51
52
  b.PhoneNumber send("#{type}_phone_number") if send("#{type}_phone_number")
53
+ b.EmailAddress send("#{type}_email") if send("#{type}_email")
52
54
  end
53
55
  end
54
56
 
@@ -6,6 +6,11 @@ module Shippinglogic
6
6
  # == Options
7
7
  # === Shipper options
8
8
  #
9
+ # * <tt>shipper_name</tt> - name of the shipper.
10
+ # * <tt>shipper_title</tt> - title of the shipper.
11
+ # * <tt>shipper_company_name</tt> - company name of the shipper.
12
+ # * <tt>shipper_phone_number</tt> - phone number of the shipper.
13
+ # * <tt>shipper_email</tt> - email of the shipper.
9
14
  # * <tt>shipper_streets</tt> - street part of the address, separate multiple streets with a new line, dont include blank lines.
10
15
  # * <tt>shipper_city</tt> - city part of the address.
11
16
  # * <tt>shipper_state_</tt> - state part of the address, use state abreviations.
@@ -15,6 +20,11 @@ module Shippinglogic
15
20
  #
16
21
  # === Recipient options
17
22
  #
23
+ # * <tt>recipient_name</tt> - name of the recipient.
24
+ # * <tt>recipient_title</tt> - title of the recipient.
25
+ # * <tt>recipient_company_name</tt> - company name of the recipient.
26
+ # * <tt>recipient_phone_number</tt> - phone number of the recipient.
27
+ # * <tt>recipient_email</tt> - email of the recipient.
18
28
  # * <tt>recipient_streets</tt> - street part of the address, separate multiple streets with a new line, dont include blank lines.
19
29
  # * <tt>recipient_city</tt> - city part of the address.
20
30
  # * <tt>recipient_state</tt> - state part of the address, use state abreviations.
@@ -65,6 +75,7 @@ module Shippinglogic
65
75
  #
66
76
  # === Misc options
67
77
  #
78
+ # * <tt>just_validate</tt> - will tell FedEx to ONLY validate the shipment, not actually create it. (default: false)
68
79
  # * <tt>rate_request_types</tt> - one or more of RATE_REQUEST_TYPES. (default: ACCOUNT)
69
80
  #
70
81
  # == Simple Example
@@ -98,8 +109,10 @@ module Shippinglogic
98
109
 
99
110
  # shipper options
100
111
  attribute :shipper_name, :string
112
+ attribute :shipper_title, :string
101
113
  attribute :shipper_company_name, :string
102
114
  attribute :shipper_phone_number, :string
115
+ attribute :shipper_email, :string
103
116
  attribute :shipper_streets, :string
104
117
  attribute :shipper_city, :string
105
118
  attribute :shipper_state, :string
@@ -109,8 +122,10 @@ module Shippinglogic
109
122
 
110
123
  # recipient options
111
124
  attribute :recipient_name, :string
125
+ attribute :recipient_title, :string
112
126
  attribute :recipient_company_name, :string
113
127
  attribute :recipient_phone_number, :string
128
+ attribute :recipient_email, :string
114
129
  attribute :recipient_streets, :string
115
130
  attribute :recipient_city, :string
116
131
  attribute :recipient_state, :string
@@ -149,6 +164,7 @@ module Shippinglogic
149
164
  attribute :signature, :string
150
165
 
151
166
  # misc options
167
+ attribute :just_validate, :boolean, :default => false
152
168
  attribute :rate_request_types, :array, :default => ["ACCOUNT"]
153
169
 
154
170
  private
@@ -159,7 +175,7 @@ module Shippinglogic
159
175
  # Just building some XML to send off to FedEx using our various options
160
176
  def build_request
161
177
  b = builder
162
- xml = b.ProcessShipmentRequest(:xmlns => "http://fedex.com/ws/ship/v#{VERSION[:major]}") do
178
+ xml = b.tag!(just_validate ? "ValidateShipmentRequest" : "ProcessShipmentRequest", :xmlns => "http://fedex.com/ws/ship/v#{VERSION[:major]}") do
163
179
  build_authentication(b)
164
180
  build_version(b, "ship", VERSION[:major], VERSION[:intermediate], VERSION[:minor])
165
181
  b.SpecialServicesRequested special_services_requested.join(",") if special_services_requested.any?
@@ -12,12 +12,19 @@ module Shippinglogic
12
12
  # Here is a very simple example:
13
13
  #
14
14
  # fedex = Shippinglogic::FedEx.new(key, password, account, meter)
15
- # tracking = fedex.track(:tracking_number => "my number")
16
- # tracking.first
15
+ # tracking_details = fedex.track(:tracking_number => "my number")
16
+ #
17
+ # tracking_details.status
18
+ # # => "Delivered"
19
+ #
20
+ # tracking_details.signature_name
21
+ # # => "KKING"
22
+ #
23
+ # tracking_details.events.first
17
24
  # # => #<Shippinglogic::FedEx::Track::Event @postal_code="95817", @name="Delivered", @state="CA", @residential=false,
18
25
  # # @city="Sacramento", @type="DL", @country="US", @occured_at=Mon Dec 08 10:43:37 -0500 2008>
19
26
  #
20
- # tracking.first.name
27
+ # tracking_details.events.first.name
21
28
  # # => "Delivered"
22
29
  #
23
30
  # === Note
@@ -43,7 +50,6 @@ module Shippinglogic
43
50
  :service_type,
44
51
  :status,
45
52
  :delivery_at,
46
- :tracking_number,
47
53
  :events
48
54
 
49
55
  def origin_residential?
@@ -71,7 +77,6 @@ module Shippinglogic
71
77
  self.service_type = details[:service_type]
72
78
  self.status = details[:status_description]
73
79
  self.delivery_at = Time.parse(details[:actual_delivery_timestamp])
74
- self.tracking_number = details[:tracking_number]
75
80
 
76
81
  self.events = response[:track_details][:events].collect do |details|
77
82
  event = Event.new
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{shippinglogic}
8
- s.version = "1.1.0"
8
+ s.version = "1.1.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Ben Johnson of Binary Logic"]
12
- s.date = %q{2009-08-16}
12
+ s.date = %q{2009-08-17}
13
13
  s.description = %q{Easily use FedEx, UPS, USPS web services with an elegant and simple syntax.}
14
14
  s.email = %q{bjohnson@binarylogic.com}
15
15
  s.extra_rdoc_files = [
@@ -1,22 +1,37 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
2
 
3
3
  describe "FedEx Ship" do
4
+ before(:each) do
5
+ fedex = new_fedex
6
+ @shipment = fedex.ship
7
+
8
+ @shipment.service_type = "FEDEX_2_DAY"
9
+ @shipment.attributes = fedex_shipper
10
+ @shipment.attributes = fedex_recipient
11
+ @shipment.attributes = fedex_package
12
+ end
13
+
4
14
  it "should create a new shipment" do
5
15
  use_response(:ship_defaults)
6
16
 
7
- fedex = new_fedex
8
- shipment = fedex.ship
17
+ @shipment.rate.should == 17.02
18
+ @shipment.currency.should == "USD"
19
+ @shipment.delivery_date.should == Date.parse("Tue, 11 Aug 2009")
20
+ @shipment.tracking_number.should == "794797892957"
21
+ @shipment.label.should_not be_nil
22
+ @shipment.barcode.should_not be_nil
23
+ end
24
+
25
+ it "should only validate the shipment" do
26
+ pending
27
+ DONT_SAVE = true
9
28
 
10
- shipment.service_type = "FEDEX_2_DAY"
11
- shipment.attributes = fedex_shipper
12
- shipment.attributes = fedex_recipient
13
- shipment.attributes = fedex_package
29
+ @shipment.just_validate = true
14
30
 
15
- shipment.rate.should == 17.02
16
- shipment.currency.should == "USD"
17
- shipment.delivery_date.should == Date.parse("Tue, 11 Aug 2009")
18
- shipment.tracking_number.should == "794797892957"
19
- shipment.label.should_not be_nil
20
- shipment.barcode.should_not be_nil
31
+ begin
32
+ @shipment.rate.should == 'fdsf'
33
+ rescue Shippinglogic::FedEx::Error => e
34
+ raise e.request
35
+ end
21
36
  end
22
37
  end
data/spec/spec_helper.rb CHANGED
@@ -46,8 +46,11 @@ Spec::Runner.configure do |config|
46
46
 
47
47
  def fedex_shipper
48
48
  {
49
+ :shipper_name => "Name",
50
+ :shipper_title => "Title",
49
51
  :shipper_company_name => "Company",
50
52
  :shipper_phone_number => "2222222222",
53
+ :shipper_email => "a@a.com",
51
54
  :shipper_streets => "260 Broadway",
52
55
  :shipper_city => "New York",
53
56
  :shipper_state => "NY",
@@ -58,8 +61,11 @@ Spec::Runner.configure do |config|
58
61
 
59
62
  def fedex_recipient
60
63
  {
64
+ :recipient_name => "Name",
65
+ :recipient_title => "Title",
61
66
  :recipient_company_name => "Dallas City Hall",
62
67
  :recipient_phone_number => "2222222222",
68
+ :recipient_email => "a@a.com",
63
69
  :recipient_streets => "1500 Marilla Street",
64
70
  :recipient_city => "Dallas",
65
71
  :recipient_state => "TX",
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: binarylogic-shippinglogic
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Johnson of Binary Logic
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-08-16 00:00:00 -07:00
12
+ date: 2009-08-17 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency