shippo 1.0.4 → 2.0.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.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/.atom-build.json +22 -0
  3. data/.codeclimate.yml +30 -0
  4. data/.gitignore +22 -0
  5. data/.rspec +2 -0
  6. data/.rubocop.yml +1156 -0
  7. data/.travis.yml +16 -0
  8. data/CHANGELOG.md +50 -0
  9. data/Gemfile +5 -0
  10. data/Guardfile +39 -0
  11. data/README.md +288 -0
  12. data/Rakefile +24 -0
  13. data/bin/example +114 -0
  14. data/lib/shippo.rb +23 -97
  15. data/lib/shippo/api.rb +52 -0
  16. data/lib/shippo/api/api_object.rb +133 -0
  17. data/lib/shippo/api/category.rb +49 -0
  18. data/lib/shippo/api/category/base.rb +144 -0
  19. data/lib/shippo/api/category/purpose.rb +13 -0
  20. data/lib/shippo/api/category/source.rb +16 -0
  21. data/lib/shippo/api/category/state.rb +13 -0
  22. data/lib/shippo/api/category/status.rb +17 -0
  23. data/lib/shippo/api/extend/operation.rb +21 -0
  24. data/lib/shippo/api/extend/transformers.rb +12 -0
  25. data/lib/shippo/api/extend/url.rb +26 -0
  26. data/lib/shippo/api/operations.rb +8 -0
  27. data/lib/shippo/api/operations/create.rb +33 -0
  28. data/lib/shippo/api/operations/list.rb +22 -0
  29. data/lib/shippo/api/operations/rates.rb +16 -0
  30. data/lib/shippo/api/operations/update.rb +12 -0
  31. data/lib/shippo/api/operations/validate.rb +12 -0
  32. data/lib/shippo/api/request.rb +159 -0
  33. data/lib/shippo/api/resource.rb +104 -0
  34. data/lib/shippo/api/transformers/list.rb +73 -0
  35. data/lib/shippo/api/version.rb +5 -0
  36. data/lib/shippo/exceptions.rb +7 -0
  37. data/lib/shippo/exceptions/api_error.rb +20 -0
  38. data/lib/shippo/exceptions/error.rb +22 -0
  39. data/lib/shippo/model/address.rb +5 -0
  40. data/lib/shippo/model/carrieraccount.rb +5 -0
  41. data/lib/shippo/model/customs_declaration.rb +6 -0
  42. data/lib/shippo/model/customs_item.rb +5 -0
  43. data/lib/shippo/model/manifest.rb +5 -0
  44. data/lib/shippo/model/parcel.rb +5 -0
  45. data/lib/shippo/model/rate.rb +5 -0
  46. data/lib/shippo/model/refund.rb +5 -0
  47. data/lib/shippo/model/shipment.rb +5 -0
  48. data/lib/shippo/model/transaction.rb +5 -0
  49. data/lib/shippo/tasks/shippo.rb +22 -0
  50. data/shippo.gemspec +34 -0
  51. metadata +226 -40
  52. data/example.rb +0 -71
  53. data/lib/shippo/address.rb +0 -10
  54. data/lib/shippo/api_object.rb +0 -89
  55. data/lib/shippo/carrieraccount.rb +0 -8
  56. data/lib/shippo/container_object.rb +0 -28
  57. data/lib/shippo/create.rb +0 -18
  58. data/lib/shippo/customs_declaration.rb +0 -7
  59. data/lib/shippo/customs_item.rb +0 -7
  60. data/lib/shippo/error.rb +0 -18
  61. data/lib/shippo/list.rb +0 -23
  62. data/lib/shippo/manifest.rb +0 -6
  63. data/lib/shippo/parcel.rb +0 -6
  64. data/lib/shippo/rate.rb +0 -5
  65. data/lib/shippo/refund.rb +0 -6
  66. data/lib/shippo/resource.rb +0 -29
  67. data/lib/shippo/shipment.rb +0 -14
  68. data/lib/shippo/transaction.rb +0 -6
  69. data/lib/shippo/update.rb +0 -15
  70. data/test/test.rb +0 -26
data/example.rb DELETED
@@ -1,71 +0,0 @@
1
- # This example demonstrates how to purchase a label for a domestic US shipment.
2
- require 'shippo'
3
-
4
- # replace <YOUR_PRIVATE_KEY> with your ShippoToken key
5
- Shippo::api_token = '<YOUR_PRIVATE_KEY>'
6
-
7
- # Create address_from object
8
- address_from = {
9
- :object_purpose => 'PURCHASE',
10
- :name => 'Mr Hippo',
11
- :company => 'Shippo',
12
- :street1 => '215 Clayton St.',
13
- :street2 => '',
14
- :city => 'San Francisco',
15
- :state => 'CA',
16
- :zip => '94117',
17
- :country => 'US',
18
- :phone => '+1 555 341 9393',
19
- :email => 'support@goshippo.com'}
20
-
21
- # Create address_to object
22
- address_to = {
23
- :object_purpose => 'PURCHASE',
24
- :name => 'Mrs Hippo"',
25
- :company => 'San Diego Zoo',
26
- :street1 => '2920 Zoo Drive',
27
- :city => 'San Diego',
28
- :state => 'CA',
29
- :zip => '92101',
30
- :country => 'US',
31
- :phone => '+1 555 341 9393',
32
- :email => 'hippo@goshippo.com'}
33
-
34
- # Create parcel object
35
- parcel = {
36
- :length => 5,
37
- :width => 2,
38
- :height => 5,
39
- :distance_unit => :in,
40
- :weight => 2,
41
- :mass_unit => :lb}
42
-
43
- # Creating the shipment object
44
- puts "Creating shipment object.."
45
- shipment = Shippo::Shipment.create(
46
- :object_purpose => 'PURCHASE',
47
- :address_from => address_from,
48
- :address_to => address_to,
49
- :parcel => parcel,
50
- :async => false )
51
-
52
- # Get the desired rate according to your business logic
53
- # We select the first rate in this example
54
- rate = shipment.rates()[0]
55
-
56
- puts "Rates generated. Purchasing a #{rate.provider} #{rate.servicelevel_name} label"
57
-
58
- # Purchase the desired rate (create a Transaction object)
59
- transaction = Shippo::Transaction.create(
60
- :rate => rate["object_id"],
61
- :async => false )
62
-
63
- # label_url and tracking_number
64
- if transaction.object_status == "SUCCESS"
65
- puts "Label sucessfully generated:"
66
- puts "label_url: #{transaction.label_url}"
67
- puts "tracking_number: #{transaction.tracking_number}"
68
- else
69
- puts "Error generating label:"
70
- puts transaction.messages
71
- end
@@ -1,10 +0,0 @@
1
- module Shippo
2
- class Address < Resource
3
- include Shippo::Operations::List
4
- include Shippo::Operations::Create
5
- def validate(params={})
6
- response = Shippo.request(:get, "#{url}/validate/", params)
7
- Shippo::Address.construct_from(response)
8
- end
9
- end
10
- end
@@ -1,89 +0,0 @@
1
- module Shippo
2
- class ApiObject < ContainerObject
3
- include Enumerable
4
-
5
- def initialize(id=nil)
6
- # parameter overloading!
7
- if id.kind_of?(Hash)
8
- id = id[:id]
9
- end
10
-
11
- @values = {}
12
- @values[:id] = id if id
13
- end
14
-
15
- def self.construct_from(values)
16
- # recursive on arrays
17
- case values
18
- when Array
19
- values.map { |v| self.construct_from(v) }
20
- when Hash
21
- obj = self.new(values[:id])
22
- obj.refresh_from(values)
23
- obj
24
- else
25
- # on scalar types, just identity
26
- values
27
- end
28
- end
29
-
30
- def to_s(*args)
31
- JSON.pretty_generate @values
32
- end
33
-
34
- def inspect()
35
- id_string = (self.respond_to?(:id) && !self.id.nil?) ? " id=#{self.id}" : ""
36
- "#<#{self.class}:0x#{self.object_id.to_s(16)}#{id_string}> JSON: " + self.to_s
37
- end
38
-
39
- def refresh_from(values)
40
- values.each do |k, v|
41
- @values[k.to_sym] = v
42
- end
43
- instance_eval do
44
- add_accessors(@values.keys)
45
- end
46
-
47
- end
48
- def [](k)
49
- @values[k.to_sym]
50
- end
51
-
52
- def []=(k, v)
53
- send(:"#{k}=", v)
54
- end
55
- def keys
56
- @values.keys
57
- end
58
-
59
- def values
60
- @values.values
61
- end
62
-
63
- def to_json(*a)
64
- JSON.dump(@values)
65
- end
66
-
67
- def as_json(*a)
68
- @values.as_json(*a)
69
- end
70
-
71
- def to_hash
72
- @values
73
- end
74
-
75
- def each(&blk)
76
- @values.each(&blk)
77
- end
78
-
79
- if RUBY_VERSION < '1.9.2'
80
- def respond_to?(symbol)
81
- @values.has_key?(symbol) || super
82
- end
83
- end
84
-
85
-
86
- end
87
-
88
-
89
- end
@@ -1,8 +0,0 @@
1
- module Shippo
2
- class CarrierAccount < Resource
3
- @non_standard_URL = "/carrier_accounts"
4
- include Shippo::Operations::List
5
- include Shippo::Operations::Create
6
- include Shippo::Operations::Update
7
- end
8
- end
@@ -1,28 +0,0 @@
1
- module Shippo
2
- class ContainerObject
3
- protected
4
- def create_accessor(k_name, k_index)
5
- metaclass.instance_eval do
6
- define_method(k_name) { @values[k_index] }
7
- define_method(:"#{k_name}=") do |v|
8
- @values[k_index] = v unless k_index == ''
9
- end
10
- end
11
- end
12
- def add_accessors(keys)
13
- keys.each do |k|
14
- #TODO raise something here, should filter this before
15
- orig_k = k
16
- while respond_to?(k) do
17
- k = "_#{k}".to_sym
18
- end
19
- create_accessor(k, orig_k)
20
- end
21
- end
22
- def metaclass
23
- class << self
24
- self
25
- end
26
- end
27
- end
28
- end
@@ -1,18 +0,0 @@
1
- module Shippo
2
- module Operations
3
- module Create
4
- module ClassMethods
5
- def create(params={})
6
- params.each do |k, v|
7
- params[k] = v[:object_id] if v.is_a?(ApiObject)
8
- end
9
- response = Shippo.request(:post, "#{self.url}/", params)
10
- self.construct_from(response)
11
- end
12
- end
13
- def self.included(base)
14
- base.extend(ClassMethods)
15
- end
16
- end
17
- end
18
- end
@@ -1,7 +0,0 @@
1
- module Shippo
2
- class Customs_Declaration < Resource
3
- @non_standard_URL = "/customs/declarations"
4
- include Shippo::Operations::List
5
- include Shippo::Operations::Create
6
- end
7
- end
@@ -1,7 +0,0 @@
1
- module Shippo
2
- class Customs_Item < Resource
3
- @non_standard_URL = "/customs/items"
4
- include Shippo::Operations::List
5
- include Shippo::Operations::Create
6
- end
7
- end
@@ -1,18 +0,0 @@
1
- module Shippo
2
- class APIError < StandardError
3
- attr_reader :message
4
- def initialize(message=nil)
5
- @message = message
6
- end
7
-
8
- def to_s
9
- @message
10
- end
11
- end
12
- class ConnectionError < APIError
13
- end
14
- class MissingDataError < APIError
15
- end
16
- class AuthError < APIError
17
- end
18
- end
@@ -1,23 +0,0 @@
1
- module Shippo
2
- module Operations
3
- module List
4
- module ClassMethods
5
- # return all items
6
- def all(params={})
7
- response = Shippo.request(:get, "#{url}/", params)
8
- # Limiting to results array, does not allow user to see count,..
9
- # self.construct_from(response[:results] || [])
10
- self.construct_from(response)
11
- end
12
- # return a specific item
13
- def get(id, params={})
14
- response = Shippo.request(:get, "#{url}/#{CGI.escape(id)}/", params)
15
- self.construct_from(response)
16
- end
17
- end
18
- def self.included(base)
19
- base.extend(ClassMethods)
20
- end
21
- end
22
- end
23
- end
@@ -1,6 +0,0 @@
1
- module Shippo
2
- class Manifest < Resource
3
- include Shippo::Operations::List
4
- include Shippo::Operations::Create
5
- end
6
- end
@@ -1,6 +0,0 @@
1
- module Shippo
2
- class Parcel < Resource
3
- include Shippo::Operations::List
4
- include Shippo::Operations::Create
5
- end
6
- end
@@ -1,5 +0,0 @@
1
- module Shippo
2
- class Rate < Resource
3
- include Shippo::Operations::List
4
- end
5
- end
@@ -1,6 +0,0 @@
1
- module Shippo
2
- class Refund < Resource
3
- include Shippo::Operations::List
4
- include Shippo::Operations::Create
5
- end
6
- end
@@ -1,29 +0,0 @@
1
- module Shippo
2
- class Resource < ApiObject
3
- @non_standard_URL
4
- def self.class_name
5
- self.name.split('::')[-1]
6
- end
7
- def self.url()
8
- # Process non standard URL
9
- if defined? @non_standard_URL
10
- return @non_standard_URL
11
- else
12
- # Process standard url
13
- dc = class_name.downcase
14
- "/" + dc + (dc[-1] == 's' ? 'es' : 's')
15
- end
16
- end
17
- def url
18
- unless id = self['object_id']
19
- raise MissingDataError.new("#{self.class} has no object_id")
20
- end
21
- "#{self.class.url}/#{CGI.escape(id)}"
22
- end
23
- def refresh
24
- response, api_key = Shippo.request(:get, url, @retrieve_options)
25
- refresh_from(response)
26
- self
27
- end
28
- end
29
- end
@@ -1,14 +0,0 @@
1
- module Shippo
2
- class Shipment < Resource
3
- include Shippo::Operations::List
4
- include Shippo::Operations::Create
5
- def rates(currency=nil, params={})
6
- if !currency.nil?
7
- response = Shippo.request(:get, "#{url}/rates/#{currency}/", params)
8
- else
9
- response = Shippo.request(:get, "#{url}/rates/", params)
10
- end
11
- Shippo::Rate.construct_from(response[:results])
12
- end
13
- end
14
- end
@@ -1,6 +0,0 @@
1
- module Shippo
2
- class Transaction < Resource
3
- include Shippo::Operations::List
4
- include Shippo::Operations::Create
5
- end
6
- end
@@ -1,15 +0,0 @@
1
- module Shippo
2
- module Operations
3
- module Update
4
- module ClassMethods
5
- def update(object_id, params={})
6
- response = Shippo.request(:put, "#{url}/#{CGI.escape(object_id)}/", params)
7
- self.construct_from(response)
8
- end
9
- end
10
- def self.included(base)
11
- base.extend(ClassMethods)
12
- end
13
- end
14
- end
15
- end
@@ -1,26 +0,0 @@
1
- require 'rubygems'
2
- gem 'mocha'
3
- require 'test/unit'
4
- require 'mocha/test_unit'
5
- require 'shippo'
6
- def parcel_list_result
7
- JSON::parse File.open('./parcel_list.json').read
8
- end
9
-
10
- module Shippo
11
- class ParcelTest < Test::Unit::TestCase
12
- def test_import
13
- # get an array of test parcels from JSON
14
- ret = Shippo::Parcel.construct_from(parcel_list_result)
15
- # test the various options of accessing the parcel data
16
- assert_equal ret[:metadata], "Customer ID 123456"
17
- ret["metadata"] = "Customer ID 007"
18
- assert_equal ret.metadata, "Customer ID 007"
19
- assert_equal ret.object_owner, "tobias.schottdorf@gmail.com"
20
- ret[:object_owner] = "hans.wurst@gmail.com"
21
- assert_equal ret["object_owner"], "hans.wurst@gmail.com"
22
- assert_equal ret.object_state, "VALID"
23
-
24
- end
25
- end
26
- end