active_fulfillment 1.0.3 → 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.
- data/CHANGELOG +4 -0
- data/Rakefile +3 -30
- data/VERSION +1 -1
- data/active_fulfillment.gemspec +6 -25
- data/lib/active_fulfillment/fulfillment/response.rb +6 -10
- data/lib/active_fulfillment/fulfillment/services/amazon.rb +1 -1
- data/lib/active_fulfillment/fulfillment/services/shipwire.rb +30 -14
- data/lib/active_fulfillment/fulfillment/services/webgistix.rb +3 -1
- data/lib/active_fulfillment/fulfillment/services.rb +1 -0
- data/lib/active_fulfillment.rb +3 -2
- data/test/fixtures.yml +6 -1
- data/test/remote/amazon_test.rb +4 -4
- data/test/remote/shipwire_test.rb +3 -3
- data/test/remote/webgistix_test.rb +2 -2
- data/test/test_helper.rb +6 -17
- data/test/unit/services/amazon_test.rb +2 -2
- data/test/unit/services/shipwire_test.rb +100 -21
- data/test/unit/services/webgistix_test.rb +1 -1
- metadata +97 -75
- data/lib/active_merchant/common/connection.rb +0 -162
- data/lib/active_merchant/common/country.rb +0 -328
- data/lib/active_merchant/common/error.rb +0 -26
- data/lib/active_merchant/common/post_data.rb +0 -24
- data/lib/active_merchant/common/posts_data.rb +0 -61
- data/lib/active_merchant/common/requires_parameters.rb +0 -16
- data/lib/active_merchant/common/utils.rb +0 -18
- data/lib/active_merchant/common/validateable.rb +0 -76
- data/lib/active_merchant/common.rb +0 -14
- data/lib/certs/cacert.pem +0 -7815
metadata
CHANGED
@@ -1,65 +1,103 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_fulfillment
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 1
|
8
|
-
- 0
|
9
|
-
- 3
|
10
|
-
version: 1.0.3
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2.0.0
|
5
|
+
prerelease:
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Cody Fauser
|
14
9
|
- James MacAulay
|
15
10
|
autorequire:
|
16
11
|
bindir: bin
|
17
12
|
cert_chain: []
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
dependencies:
|
22
|
-
- !ruby/object:Gem::Dependency
|
13
|
+
date: 2010-12-13 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
23
16
|
name: activesupport
|
24
|
-
|
25
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
26
18
|
none: false
|
27
|
-
requirements:
|
28
|
-
- -
|
29
|
-
- !ruby/object:Gem::Version
|
30
|
-
|
31
|
-
segments:
|
32
|
-
- 2
|
33
|
-
- 3
|
34
|
-
- 2
|
35
|
-
version: 2.3.2
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 2.3.11
|
36
23
|
type: :runtime
|
37
|
-
|
38
|
-
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ! '>='
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: 2.3.11
|
31
|
+
- !ruby/object:Gem::Dependency
|
39
32
|
name: builder
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: 2.0.0
|
39
|
+
type: :runtime
|
40
40
|
prerelease: false
|
41
|
-
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
42
|
none: false
|
43
|
-
requirements:
|
44
|
-
- -
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
hash: 15
|
47
|
-
segments:
|
48
|
-
- 2
|
49
|
-
- 0
|
50
|
-
- 0
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
51
46
|
version: 2.0.0
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: active_utils
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.0.1
|
52
55
|
type: :runtime
|
53
|
-
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 1.0.1
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: rake
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
type: :development
|
72
|
+
prerelease: false
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
- !ruby/object:Gem::Dependency
|
80
|
+
name: mocha
|
81
|
+
requirement: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
type: :development
|
88
|
+
prerelease: false
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
54
95
|
description:
|
55
96
|
email: cody@shopify.com
|
56
97
|
executables: []
|
57
|
-
|
58
98
|
extensions: []
|
59
|
-
|
60
99
|
extra_rdoc_files: []
|
61
|
-
|
62
|
-
files:
|
100
|
+
files:
|
63
101
|
- CHANGELOG
|
64
102
|
- Rakefile
|
65
103
|
- VERSION
|
@@ -73,16 +111,6 @@ files:
|
|
73
111
|
- lib/active_fulfillment/fulfillment/services/amazon.rb
|
74
112
|
- lib/active_fulfillment/fulfillment/services/shipwire.rb
|
75
113
|
- lib/active_fulfillment/fulfillment/services/webgistix.rb
|
76
|
-
- lib/active_merchant/common.rb
|
77
|
-
- lib/active_merchant/common/connection.rb
|
78
|
-
- lib/active_merchant/common/country.rb
|
79
|
-
- lib/active_merchant/common/error.rb
|
80
|
-
- lib/active_merchant/common/post_data.rb
|
81
|
-
- lib/active_merchant/common/posts_data.rb
|
82
|
-
- lib/active_merchant/common/requires_parameters.rb
|
83
|
-
- lib/active_merchant/common/utils.rb
|
84
|
-
- lib/active_merchant/common/validateable.rb
|
85
|
-
- lib/certs/cacert.pem
|
86
114
|
- test/fixtures.yml
|
87
115
|
- test/fixtures/xml/amazon/inventory_get_response.xml
|
88
116
|
- test/fixtures/xml/amazon/inventory_list_response.xml
|
@@ -101,41 +129,35 @@ files:
|
|
101
129
|
- test/unit/services/amazon_test.rb
|
102
130
|
- test/unit/services/shipwire_test.rb
|
103
131
|
- test/unit/services/webgistix_test.rb
|
104
|
-
has_rdoc: true
|
105
132
|
homepage: http://github.com/shopify/active_fulfillment
|
106
133
|
licenses: []
|
107
|
-
|
108
134
|
post_install_message:
|
109
135
|
rdoc_options: []
|
110
|
-
|
111
|
-
require_paths:
|
136
|
+
require_paths:
|
112
137
|
- lib
|
113
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
138
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
114
139
|
none: false
|
115
|
-
requirements:
|
116
|
-
- -
|
117
|
-
- !ruby/object:Gem::Version
|
118
|
-
|
119
|
-
segments:
|
140
|
+
requirements:
|
141
|
+
- - ! '>='
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: '0'
|
144
|
+
segments:
|
120
145
|
- 0
|
121
|
-
|
122
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
146
|
+
hash: -4502399821123636791
|
147
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
148
|
none: false
|
124
|
-
requirements:
|
125
|
-
- -
|
126
|
-
- !ruby/object:Gem::Version
|
127
|
-
|
128
|
-
segments:
|
129
|
-
- 0
|
130
|
-
version: "0"
|
149
|
+
requirements:
|
150
|
+
- - ! '>='
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
131
153
|
requirements: []
|
132
|
-
|
133
154
|
rubyforge_project:
|
134
|
-
rubygems_version: 1.
|
155
|
+
rubygems_version: 1.8.23
|
135
156
|
signing_key:
|
136
157
|
specification_version: 3
|
137
|
-
summary: Framework and tools for dealing with shipping, tracking and order fulfillment
|
138
|
-
|
158
|
+
summary: Framework and tools for dealing with shipping, tracking and order fulfillment
|
159
|
+
services.
|
160
|
+
test_files:
|
139
161
|
- test/remote/amazon_test.rb
|
140
162
|
- test/remote/shipwire_test.rb
|
141
163
|
- test/remote/webgistix_test.rb
|
@@ -1,162 +0,0 @@
|
|
1
|
-
require 'uri'
|
2
|
-
require 'net/http'
|
3
|
-
require 'net/https'
|
4
|
-
require 'benchmark'
|
5
|
-
|
6
|
-
module ActiveMerchant
|
7
|
-
class ConnectionError < ActiveMerchantError # :nodoc:
|
8
|
-
end
|
9
|
-
|
10
|
-
class RetriableConnectionError < ConnectionError # :nodoc:
|
11
|
-
end
|
12
|
-
|
13
|
-
class ResponseError < ActiveMerchantError # :nodoc:
|
14
|
-
attr_reader :response
|
15
|
-
|
16
|
-
def initialize(response, message = nil)
|
17
|
-
@response = response
|
18
|
-
@message = message
|
19
|
-
end
|
20
|
-
|
21
|
-
def to_s
|
22
|
-
"Failed with #{response.code} #{response.message if response.respond_to?(:message)}"
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
class Connection
|
27
|
-
MAX_RETRIES = 3
|
28
|
-
OPEN_TIMEOUT = 60
|
29
|
-
READ_TIMEOUT = 60
|
30
|
-
VERIFY_PEER = true
|
31
|
-
RETRY_SAFE = false
|
32
|
-
RUBY_184_POST_HEADERS = { "Content-Type" => "application/x-www-form-urlencoded" }
|
33
|
-
|
34
|
-
attr_accessor :endpoint
|
35
|
-
attr_accessor :open_timeout
|
36
|
-
attr_accessor :read_timeout
|
37
|
-
attr_accessor :verify_peer
|
38
|
-
attr_accessor :retry_safe
|
39
|
-
attr_accessor :pem
|
40
|
-
attr_accessor :pem_password
|
41
|
-
attr_accessor :wiredump_device
|
42
|
-
attr_accessor :logger
|
43
|
-
attr_accessor :tag
|
44
|
-
|
45
|
-
def initialize(endpoint)
|
46
|
-
@endpoint = endpoint.is_a?(URI) ? endpoint : URI.parse(endpoint)
|
47
|
-
@open_timeout = OPEN_TIMEOUT
|
48
|
-
@read_timeout = READ_TIMEOUT
|
49
|
-
@retry_safe = RETRY_SAFE
|
50
|
-
@verify_peer = VERIFY_PEER
|
51
|
-
end
|
52
|
-
|
53
|
-
def request(method, body, headers = {})
|
54
|
-
retry_exceptions do
|
55
|
-
begin
|
56
|
-
info "#{method.to_s.upcase} #{endpoint}", tag
|
57
|
-
|
58
|
-
result = nil
|
59
|
-
|
60
|
-
realtime = Benchmark.realtime do
|
61
|
-
result = case method
|
62
|
-
when :get
|
63
|
-
raise ArgumentError, "GET requests do not support a request body" if body
|
64
|
-
http.get(endpoint.request_uri, headers)
|
65
|
-
when :post
|
66
|
-
debug body
|
67
|
-
http.post(endpoint.request_uri, body, RUBY_184_POST_HEADERS.merge(headers))
|
68
|
-
else
|
69
|
-
raise ArgumentError, "Unsupported request method #{method.to_s.upcase}"
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
info "--> %d %s (%d %.4fs)" % [result.code, result.message, result.body ? result.body.length : 0, realtime], tag
|
74
|
-
debug result.body
|
75
|
-
result
|
76
|
-
rescue EOFError => e
|
77
|
-
raise ConnectionError, "The remote server dropped the connection"
|
78
|
-
rescue Errno::ECONNRESET => e
|
79
|
-
raise ConnectionError, "The remote server reset the connection"
|
80
|
-
rescue Errno::ECONNREFUSED => e
|
81
|
-
raise RetriableConnectionError, "The remote server refused the connection"
|
82
|
-
rescue OpenSSL::X509::CertificateError => e
|
83
|
-
raise ClientCertificateError, "The remote server did not accept the provided SSL certificate"
|
84
|
-
rescue Timeout::Error, Errno::ETIMEDOUT => e
|
85
|
-
raise ConnectionError, "The connection to the remote server timed out"
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
private
|
91
|
-
def http
|
92
|
-
http = Net::HTTP.new(endpoint.host, endpoint.port)
|
93
|
-
configure_debugging(http)
|
94
|
-
configure_timeouts(http)
|
95
|
-
configure_ssl(http)
|
96
|
-
configure_cert(http)
|
97
|
-
http
|
98
|
-
end
|
99
|
-
|
100
|
-
def configure_debugging(http)
|
101
|
-
http.set_debug_output(wiredump_device)
|
102
|
-
end
|
103
|
-
|
104
|
-
def configure_timeouts(http)
|
105
|
-
http.open_timeout = open_timeout
|
106
|
-
http.read_timeout = read_timeout
|
107
|
-
end
|
108
|
-
|
109
|
-
def configure_ssl(http)
|
110
|
-
return unless endpoint.scheme == "https"
|
111
|
-
|
112
|
-
http.use_ssl = true
|
113
|
-
|
114
|
-
if verify_peer
|
115
|
-
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
116
|
-
http.ca_file = File.dirname(__FILE__) + '/../../certs/cacert.pem'
|
117
|
-
else
|
118
|
-
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
def configure_cert(http)
|
123
|
-
return if pem.blank?
|
124
|
-
|
125
|
-
http.cert = OpenSSL::X509::Certificate.new(pem)
|
126
|
-
|
127
|
-
if pem_password
|
128
|
-
http.key = OpenSSL::PKey::RSA.new(pem, pem_password)
|
129
|
-
else
|
130
|
-
http.key = OpenSSL::PKey::RSA.new(pem)
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
def retry_exceptions
|
135
|
-
retries = MAX_RETRIES
|
136
|
-
begin
|
137
|
-
yield
|
138
|
-
rescue RetriableConnectionError => e
|
139
|
-
retries -= 1
|
140
|
-
retry unless retries.zero?
|
141
|
-
raise ConnectionError, e.message
|
142
|
-
rescue ConnectionError
|
143
|
-
retries -= 1
|
144
|
-
retry if retry_safe && !retries.zero?
|
145
|
-
raise
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
|
-
def debug(message, tag = nil)
|
150
|
-
log(:debug, message, tag)
|
151
|
-
end
|
152
|
-
|
153
|
-
def info(message, tag = nil)
|
154
|
-
log(:info, message, tag)
|
155
|
-
end
|
156
|
-
|
157
|
-
def log(level, message, tag)
|
158
|
-
message = "[#{tag}] #{message}" if tag
|
159
|
-
logger.send(level, message) if logger
|
160
|
-
end
|
161
|
-
end
|
162
|
-
end
|