paysio 1.0.0 → 1.0.2
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/.travis.yml +0 -4
- data/Gemfile.lock +4 -18
- data/README.rdoc +20 -3
- data/Rakefile +0 -10
- data/lib/paysio.rb +32 -245
- data/lib/paysio/actions/create.rb +17 -0
- data/lib/paysio/actions/destroy.rb +10 -0
- data/lib/paysio/actions/find.rb +16 -0
- data/lib/paysio/actions/list.rb +28 -0
- data/lib/paysio/actions/update.rb +11 -0
- data/lib/paysio/client.rb +55 -0
- data/lib/paysio/json.rb +7 -15
- data/lib/paysio/resource.rb +98 -0
- data/lib/paysio/resources/charge.rb +18 -0
- data/lib/paysio/resources/coupon.rb +13 -0
- data/lib/paysio/resources/customer.rb +13 -0
- data/lib/paysio/resources/event.rb +7 -0
- data/lib/paysio/resources/list.rb +19 -0
- data/lib/paysio/resources/log.rb +7 -0
- data/lib/paysio/resources/reward.rb +13 -0
- data/lib/paysio/resources/wallet.rb +13 -0
- data/lib/paysio/version.rb +1 -1
- data/paysio.gemspec +2 -4
- metadata +26 -79
- data/gemfiles/default-with-activesupport.gemfile +0 -3
- data/gemfiles/json.gemfile +0 -4
- data/gemfiles/yajl.gemfile +0 -4
- data/lib/data/ca-certificates.crt +0 -3918
- data/lib/paysio/account.rb +0 -4
- data/lib/paysio/api_operations/create.rb +0 -16
- data/lib/paysio/api_operations/delete.rb +0 -11
- data/lib/paysio/api_operations/list.rb +0 -16
- data/lib/paysio/api_operations/update.rb +0 -15
- data/lib/paysio/api_resource.rb +0 -33
- data/lib/paysio/charge.rb +0 -39
- data/lib/paysio/coupon.rb +0 -7
- data/lib/paysio/customer.rb +0 -51
- data/lib/paysio/errors/api_connection_error.rb +0 -4
- data/lib/paysio/errors/api_error.rb +0 -4
- data/lib/paysio/errors/authentication_error.rb +0 -4
- data/lib/paysio/errors/card_error.rb +0 -11
- data/lib/paysio/errors/invalid_request_error.rb +0 -10
- data/lib/paysio/errors/paysio_error.rb +0 -20
- data/lib/paysio/event.rb +0 -5
- data/lib/paysio/list_object.rb +0 -14
- data/lib/paysio/paysio_object.rb +0 -159
- data/lib/paysio/singleton_api_resource.rb +0 -20
- data/lib/paysio/util.rb +0 -100
- data/test/test_helper.rb +0 -162
- data/test/test_paysio.rb +0 -479
- data/test/test_paysio_with_active_support.rb +0 -2
data/.travis.yml
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
paysio (1.0.
|
5
|
-
|
4
|
+
paysio (1.0.1)
|
5
|
+
activesupport
|
6
|
+
oj (> 2)
|
6
7
|
rest-client (~> 1.4)
|
7
8
|
|
8
9
|
GEM
|
@@ -11,32 +12,17 @@ GEM
|
|
11
12
|
activesupport (3.2.12)
|
12
13
|
i18n (~> 0.6)
|
13
14
|
multi_json (~> 1.0)
|
14
|
-
bourne (1.1.2)
|
15
|
-
mocha (= 0.10.5)
|
16
15
|
i18n (0.6.1)
|
17
|
-
metaclass (0.0.1)
|
18
16
|
mime-types (1.21)
|
19
|
-
mocha (0.10.5)
|
20
|
-
metaclass (~> 0.0.1)
|
21
17
|
multi_json (1.6.0)
|
18
|
+
oj (2.0.4)
|
22
19
|
rake (10.0.3)
|
23
20
|
rest-client (1.6.7)
|
24
21
|
mime-types (>= 1.16)
|
25
|
-
shoulda (3.3.2)
|
26
|
-
shoulda-context (~> 1.0.1)
|
27
|
-
shoulda-matchers (~> 1.4.1)
|
28
|
-
shoulda-context (1.0.2)
|
29
|
-
shoulda-matchers (1.4.2)
|
30
|
-
activesupport (>= 3.0.0)
|
31
|
-
bourne (~> 1.1.2)
|
32
|
-
test-unit (2.5.4)
|
33
22
|
|
34
23
|
PLATFORMS
|
35
24
|
ruby
|
36
25
|
|
37
26
|
DEPENDENCIES
|
38
|
-
mocha
|
39
27
|
paysio!
|
40
28
|
rake
|
41
|
-
shoulda
|
42
|
-
test-unit
|
data/README.rdoc
CHANGED
@@ -5,8 +5,25 @@
|
|
5
5
|
== Usage
|
6
6
|
|
7
7
|
Paysio.api_key = 'YOUR_API_KEY'
|
8
|
-
Paysio::
|
8
|
+
Paysio::Charge.all
|
9
9
|
|
10
|
-
==
|
10
|
+
== Paysio Objects
|
11
|
+
Paysio::Charge.all # get list of charges
|
12
|
+
Paysio::Wallet.all # get list of wallets
|
13
|
+
Paysio::Coupon.all # get list of coupons
|
14
|
+
Paysio::Reward.all # get list of rewards
|
15
|
+
Paysio::Event.all # get list of events
|
16
|
+
Paysio::Log.all # get list of logs
|
17
|
+
Paysio::Customer.all # get list of customers
|
11
18
|
|
12
|
-
|
19
|
+
== Actions: update
|
20
|
+
customer = Paysio::Customer.find("cs_1111111")
|
21
|
+
customer.update(description: "test user")
|
22
|
+
|
23
|
+
== Actions: destroy
|
24
|
+
customer = Paysio::Customer.find("cs_1111111")
|
25
|
+
customer.destroy
|
26
|
+
|
27
|
+
== Actions: refund charge
|
28
|
+
charge = Paysio::Charge.find("ch_1111111")
|
29
|
+
charge.refund
|
data/Rakefile
CHANGED
data/lib/paysio.rb
CHANGED
@@ -1,252 +1,39 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require '
|
4
|
-
require '
|
5
|
-
require '
|
6
|
-
require '
|
7
|
-
|
8
|
-
|
9
|
-
require '
|
10
|
-
require 'multi_json'
|
11
|
-
|
12
|
-
# Version
|
13
|
-
require 'paysio/version'
|
14
|
-
|
15
|
-
# API operations
|
16
|
-
require 'paysio/api_operations/create'
|
17
|
-
require 'paysio/api_operations/update'
|
18
|
-
require 'paysio/api_operations/delete'
|
19
|
-
require 'paysio/api_operations/list'
|
20
|
-
|
21
|
-
# Resources
|
22
|
-
require 'paysio/util'
|
1
|
+
require 'active_support/deprecation'
|
2
|
+
require 'active_support/core_ext/module'
|
3
|
+
require 'active_support/core_ext/hash'
|
4
|
+
require 'active_support/inflector'
|
5
|
+
require 'rest-client'
|
6
|
+
require 'oj'
|
7
|
+
|
8
|
+
# utils
|
9
|
+
require 'paysio/client'
|
23
10
|
require 'paysio/json'
|
24
|
-
require 'paysio/
|
25
|
-
|
26
|
-
|
27
|
-
require 'paysio/
|
28
|
-
require 'paysio/
|
29
|
-
require 'paysio/
|
30
|
-
require 'paysio/
|
31
|
-
require 'paysio/
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
require 'paysio/
|
36
|
-
require 'paysio/
|
37
|
-
require 'paysio/
|
38
|
-
require 'paysio/
|
39
|
-
require 'paysio/
|
40
|
-
require 'paysio/
|
11
|
+
require 'paysio/resource'
|
12
|
+
|
13
|
+
# actions
|
14
|
+
require 'paysio/actions/list'
|
15
|
+
require 'paysio/actions/create'
|
16
|
+
require 'paysio/actions/update'
|
17
|
+
require 'paysio/actions/destroy'
|
18
|
+
require 'paysio/actions/find'
|
19
|
+
|
20
|
+
# resources
|
21
|
+
require 'paysio/resources/list'
|
22
|
+
require 'paysio/resources/charge'
|
23
|
+
require 'paysio/resources/wallet'
|
24
|
+
require 'paysio/resources/customer'
|
25
|
+
require 'paysio/resources/reward'
|
26
|
+
require 'paysio/resources/coupon'
|
27
|
+
require 'paysio/resources/event'
|
28
|
+
require 'paysio/resources/log'
|
41
29
|
|
42
30
|
module Paysio
|
43
|
-
@@ssl_bundle_path = File.join(File.dirname(__FILE__), 'data/ca-certificates.crt')
|
44
31
|
@@api_key = nil
|
45
32
|
@@api_base = 'api.paysio.com'
|
46
|
-
@@
|
47
|
-
|
48
|
-
|
49
|
-
def self.api_url(url='')
|
50
|
-
"https://#{api_key}@#{api_base}/#{url}"
|
51
|
-
end
|
52
|
-
|
53
|
-
def self.api_key=(api_key)
|
54
|
-
@@api_key = api_key
|
55
|
-
end
|
56
|
-
|
57
|
-
def self.api_key
|
58
|
-
@@api_key
|
59
|
-
end
|
60
|
-
|
61
|
-
def self.api_base=(api_base)
|
62
|
-
@@api_base = api_base
|
63
|
-
end
|
64
|
-
|
65
|
-
def self.api_base
|
66
|
-
@@api_base
|
67
|
-
end
|
68
|
-
|
69
|
-
def self.verify_ssl_certs=(verify)
|
70
|
-
@@verify_ssl_certs = verify
|
71
|
-
end
|
72
|
-
|
73
|
-
def self.verify_ssl_certs
|
74
|
-
@@verify_ssl_certs
|
75
|
-
end
|
76
|
-
|
77
|
-
def self.api_version=(version)
|
78
|
-
@@api_version = version
|
79
|
-
end
|
80
|
-
|
81
|
-
def self.api_version
|
82
|
-
@@api_version
|
83
|
-
end
|
84
|
-
|
85
|
-
def self.request(method, url, api_key, params={}, headers={})
|
86
|
-
api_key ||= @@api_key
|
87
|
-
raise AuthenticationError.new('No API key provided. (HINT: set your API key using "Paysio.api_key = <API-KEY>". You can generate API keys from the Paysio web interface. See https://paysio.com/api for details, or email support@paysio.com if you have any questions.)') unless api_key
|
88
|
-
|
89
|
-
if !verify_ssl_certs
|
90
|
-
unless @no_verify
|
91
|
-
$stderr.puts "WARNING: Running without SSL cert verification. Execute 'Paysio.verify_ssl_certs = true' to enable verification."
|
92
|
-
@no_verify = true
|
93
|
-
end
|
94
|
-
ssl_opts = { :verify_ssl => false }
|
95
|
-
elsif !Util.file_readable(@@ssl_bundle_path)
|
96
|
-
unless @no_bundle
|
97
|
-
$stderr.puts "WARNING: Running without SSL cert verification because #{@@ssl_bundle_path} isn't readable"
|
98
|
-
@no_bundle = true
|
99
|
-
end
|
100
|
-
ssl_opts = { :verify_ssl => false }
|
101
|
-
else
|
102
|
-
ssl_opts = {
|
103
|
-
:verify_ssl => OpenSSL::SSL::VERIFY_PEER,
|
104
|
-
:ssl_ca_file => @@ssl_bundle_path
|
105
|
-
}
|
106
|
-
end
|
107
|
-
uname = (@@uname ||= RUBY_PLATFORM =~ /linux|darwin/i ? `uname -a 2>/dev/null`.strip : nil)
|
108
|
-
lang_version = "#{RUBY_VERSION} p#{RUBY_PATCHLEVEL} (#{RUBY_RELEASE_DATE})"
|
109
|
-
ua = {
|
110
|
-
:bindings_version => Paysio::VERSION,
|
111
|
-
:lang => 'ruby',
|
112
|
-
:lang_version => lang_version,
|
113
|
-
:platform => RUBY_PLATFORM,
|
114
|
-
:publisher => 'paysio',
|
115
|
-
:uname => uname
|
116
|
-
}
|
117
|
-
|
118
|
-
params = Util.objects_to_ids(params)
|
119
|
-
url = self.api_url(url)
|
120
|
-
case method.to_s.downcase.to_sym
|
121
|
-
when :get, :head, :delete
|
122
|
-
# Make params into GET parameters
|
123
|
-
if params && params.count > 0
|
124
|
-
query_string = Util.flatten_params(params).collect{|key, value| "#{key}=#{Util.url_encode(value)}"}.join('&')
|
125
|
-
url += "?#{query_string}"
|
126
|
-
end
|
127
|
-
payload = nil
|
128
|
-
else
|
129
|
-
payload = Util.flatten_params(params).collect{|(key, value)| "#{key}=#{Util.url_encode(value)}"}.join('&')
|
130
|
-
end
|
131
|
-
|
132
|
-
begin
|
133
|
-
headers = { :x_paysio_client_user_agent => Paysio::JSON.dump(ua) }.merge(headers)
|
134
|
-
rescue => e
|
135
|
-
headers = {
|
136
|
-
:x_paysio_client_raw_user_agent => ua.inspect,
|
137
|
-
:error => "#{e} (#{e.class})"
|
138
|
-
}.merge(headers)
|
139
|
-
end
|
140
|
-
|
141
|
-
headers = {
|
142
|
-
:user_agent => "Paysio/v1 RubyBindings/#{Paysio::VERSION}",
|
143
|
-
:content_type => 'application/x-www-form-urlencoded'
|
144
|
-
}.merge(headers)
|
145
|
-
|
146
|
-
if self.api_version
|
147
|
-
headers[:paysio_version] = self.api_version
|
148
|
-
end
|
149
|
-
|
150
|
-
opts = {
|
151
|
-
:method => method,
|
152
|
-
:url => url,
|
153
|
-
:headers => headers,
|
154
|
-
:open_timeout => 30,
|
155
|
-
:payload => payload,
|
156
|
-
:timeout => 80
|
157
|
-
}.merge(ssl_opts)
|
158
|
-
|
159
|
-
begin
|
160
|
-
response = execute_request(opts)
|
161
|
-
rescue SocketError => e
|
162
|
-
self.handle_restclient_error(e)
|
163
|
-
rescue NoMethodError => e
|
164
|
-
# Work around RestClient bug
|
165
|
-
if e.message =~ /\WRequestFailed\W/
|
166
|
-
e = APIConnectionError.new('Unexpected HTTP response code')
|
167
|
-
self.handle_restclient_error(e)
|
168
|
-
else
|
169
|
-
raise
|
170
|
-
end
|
171
|
-
rescue RestClient::ExceptionWithResponse => e
|
172
|
-
if rcode = e.http_code and rbody = e.http_body
|
173
|
-
self.handle_api_error(rcode, rbody)
|
174
|
-
else
|
175
|
-
self.handle_restclient_error(e)
|
176
|
-
end
|
177
|
-
rescue RestClient::Exception, Errno::ECONNREFUSED => e
|
178
|
-
self.handle_restclient_error(e)
|
179
|
-
end
|
180
|
-
|
181
|
-
rbody = response.body
|
182
|
-
rcode = response.code
|
183
|
-
begin
|
184
|
-
# Would use :symbolize_names => true, but apparently there is
|
185
|
-
# some library out there that makes symbolize_names not work.
|
186
|
-
resp = Paysio::JSON.load(rbody)
|
187
|
-
rescue MultiJson::DecodeError
|
188
|
-
raise APIError.new("Invalid response object from API: #{rbody.inspect} (HTTP response code was #{rcode})", rcode, rbody)
|
189
|
-
end
|
190
|
-
|
191
|
-
resp = Util.symbolize_names(resp)
|
192
|
-
[resp, api_key]
|
193
|
-
end
|
194
|
-
|
195
|
-
private
|
196
|
-
|
197
|
-
def self.execute_request(opts)
|
198
|
-
RestClient::Request.execute(opts)
|
199
|
-
end
|
200
|
-
|
201
|
-
def self.handle_api_error(rcode, rbody)
|
202
|
-
begin
|
203
|
-
error_obj = Paysio::JSON.load(rbody)
|
204
|
-
error_obj = Util.symbolize_names(error_obj)
|
205
|
-
error = error_obj[:error] or raise PaysioError.new # escape from parsing
|
206
|
-
rescue MultiJson::DecodeError, PaysioError
|
207
|
-
raise APIError.new("Invalid response object from API: #{rbody.inspect} (HTTP response code was #{rcode})", rcode, rbody)
|
208
|
-
end
|
209
|
-
|
210
|
-
case rcode
|
211
|
-
when 400, 404 then
|
212
|
-
raise invalid_request_error(error, rcode, rbody, error_obj)
|
213
|
-
when 401
|
214
|
-
raise authentication_error(error, rcode, rbody, error_obj)
|
215
|
-
when 402
|
216
|
-
raise card_error(error, rcode, rbody, error_obj)
|
217
|
-
else
|
218
|
-
raise api_error(error, rcode, rbody, error_obj)
|
219
|
-
end
|
220
|
-
end
|
221
|
-
|
222
|
-
def self.invalid_request_error(error, rcode, rbody, error_obj)
|
223
|
-
InvalidRequestError.new(error[:message], error[:param], rcode, rbody, error_obj)
|
224
|
-
end
|
225
|
-
|
226
|
-
def self.authentication_error(error, rcode, rbody, error_obj)
|
227
|
-
AuthenticationError.new(error[:message], rcode, rbody, error_obj)
|
228
|
-
end
|
229
|
-
|
230
|
-
def self.card_error(error, rcode, rbody, error_obj)
|
231
|
-
CardError.new(error[:message], error[:param], error[:code], rcode, rbody, error_obj)
|
232
|
-
end
|
233
|
-
|
234
|
-
def self.api_error(error, rcode, rbody, error_obj)
|
235
|
-
APIError.new(error[:message], rcode, rbody, error_obj)
|
236
|
-
end
|
33
|
+
@@api_version = 'v1'
|
34
|
+
mattr_accessor :api_key, :api_base, :api_version
|
237
35
|
|
238
|
-
def self.
|
239
|
-
|
240
|
-
when RestClient::ServerBrokeConnection, RestClient::RequestTimeout
|
241
|
-
message = "Could not connect to Paysio (#{@@api_base}). Please check your internet connection and try again. If this problem persists, you should check Paysio's service status at https://twitter.com/paysiostatus, or let us know at support@paysio.com."
|
242
|
-
when RestClient::SSLCertificateNotVerified
|
243
|
-
message = "Could not verify Paysio's SSL certificate. Please make sure that your network is not intercepting certificates. (Try going to https://api.paysio.com/v1 in your browser.) If this problem persists, let us know at support@paysio.com."
|
244
|
-
when SocketError
|
245
|
-
message = "Unexpected error communicating when trying to connect to Paysio. HINT: You may be seeing this message because your DNS is not working. To check, try running 'host paysio.com' from the command line."
|
246
|
-
else
|
247
|
-
message = "Unexpected error communicating with Paysio. If this problem persists, let us know at support@paysio.com."
|
248
|
-
end
|
249
|
-
message += "\n\n(Network error: #{e.message})"
|
250
|
-
raise APIConnectionError.new(message)
|
36
|
+
def self.api_url(path = '')
|
37
|
+
"https://#{api_key}@#{api_base}/#{api_version}#{path}"
|
251
38
|
end
|
252
|
-
end
|
39
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Paysio
|
2
|
+
module Actions
|
3
|
+
module Create
|
4
|
+
module ClassMethods
|
5
|
+
def create(attrs = {})
|
6
|
+
validate!(attrs)
|
7
|
+
response = Paysio::Client.request(:post, path, attrs)
|
8
|
+
Resource.build_from(response)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.included(base)
|
13
|
+
base.extend(ClassMethods)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Paysio
|
2
|
+
module Actions
|
3
|
+
module Find
|
4
|
+
module ClassMethods
|
5
|
+
def find(id)
|
6
|
+
response = Paysio::Client.request(:get, "#{path}/#{id}")
|
7
|
+
Resource.build_from(response)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.included(base)
|
12
|
+
base.extend(ClassMethods)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Paysio
|
2
|
+
module Actions
|
3
|
+
module List
|
4
|
+
module ClassMethods
|
5
|
+
def all
|
6
|
+
response = Paysio::Client.request(:get, path)
|
7
|
+
Resource.build_from(response)
|
8
|
+
end
|
9
|
+
|
10
|
+
def count
|
11
|
+
all.count
|
12
|
+
end
|
13
|
+
|
14
|
+
def first
|
15
|
+
all.first
|
16
|
+
end
|
17
|
+
|
18
|
+
def last
|
19
|
+
all.last
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.included(base)
|
24
|
+
base.extend(ClassMethods)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|