paysio 1.0.0 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. data/.travis.yml +0 -4
  2. data/Gemfile.lock +4 -18
  3. data/README.rdoc +20 -3
  4. data/Rakefile +0 -10
  5. data/lib/paysio.rb +32 -245
  6. data/lib/paysio/actions/create.rb +17 -0
  7. data/lib/paysio/actions/destroy.rb +10 -0
  8. data/lib/paysio/actions/find.rb +16 -0
  9. data/lib/paysio/actions/list.rb +28 -0
  10. data/lib/paysio/actions/update.rb +11 -0
  11. data/lib/paysio/client.rb +55 -0
  12. data/lib/paysio/json.rb +7 -15
  13. data/lib/paysio/resource.rb +98 -0
  14. data/lib/paysio/resources/charge.rb +18 -0
  15. data/lib/paysio/resources/coupon.rb +13 -0
  16. data/lib/paysio/resources/customer.rb +13 -0
  17. data/lib/paysio/resources/event.rb +7 -0
  18. data/lib/paysio/resources/list.rb +19 -0
  19. data/lib/paysio/resources/log.rb +7 -0
  20. data/lib/paysio/resources/reward.rb +13 -0
  21. data/lib/paysio/resources/wallet.rb +13 -0
  22. data/lib/paysio/version.rb +1 -1
  23. data/paysio.gemspec +2 -4
  24. metadata +26 -79
  25. data/gemfiles/default-with-activesupport.gemfile +0 -3
  26. data/gemfiles/json.gemfile +0 -4
  27. data/gemfiles/yajl.gemfile +0 -4
  28. data/lib/data/ca-certificates.crt +0 -3918
  29. data/lib/paysio/account.rb +0 -4
  30. data/lib/paysio/api_operations/create.rb +0 -16
  31. data/lib/paysio/api_operations/delete.rb +0 -11
  32. data/lib/paysio/api_operations/list.rb +0 -16
  33. data/lib/paysio/api_operations/update.rb +0 -15
  34. data/lib/paysio/api_resource.rb +0 -33
  35. data/lib/paysio/charge.rb +0 -39
  36. data/lib/paysio/coupon.rb +0 -7
  37. data/lib/paysio/customer.rb +0 -51
  38. data/lib/paysio/errors/api_connection_error.rb +0 -4
  39. data/lib/paysio/errors/api_error.rb +0 -4
  40. data/lib/paysio/errors/authentication_error.rb +0 -4
  41. data/lib/paysio/errors/card_error.rb +0 -11
  42. data/lib/paysio/errors/invalid_request_error.rb +0 -10
  43. data/lib/paysio/errors/paysio_error.rb +0 -20
  44. data/lib/paysio/event.rb +0 -5
  45. data/lib/paysio/list_object.rb +0 -14
  46. data/lib/paysio/paysio_object.rb +0 -159
  47. data/lib/paysio/singleton_api_resource.rb +0 -20
  48. data/lib/paysio/util.rb +0 -100
  49. data/test/test_helper.rb +0 -162
  50. data/test/test_paysio.rb +0 -479
  51. data/test/test_paysio_with_active_support.rb +0 -2
@@ -3,7 +3,3 @@ rvm:
3
3
  - 1.8.7
4
4
  - 1.9.2
5
5
  - 1.9.3
6
- gemfile:
7
- - gemfiles/default-with-activesupport.gemfile
8
- - gemfiles/json.gemfile
9
- - gemfiles/yajl.gemfile
@@ -1,8 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- paysio (1.0.0)
5
- multi_json (>= 1.0.4, < 2)
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
@@ -5,8 +5,25 @@
5
5
  == Usage
6
6
 
7
7
  Paysio.api_key = 'YOUR_API_KEY'
8
- Paysio::Charges.all
8
+ Paysio::Charge.all
9
9
 
10
- == Development
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
- Test cases can be run with: `bundle exec rake test`
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
@@ -1,12 +1,2 @@
1
- task :default => [:test]
2
-
3
- task :test do
4
- ret = true
5
- Dir["test/**/*.rb"].each do |f|
6
- ret = ret && ruby(f, '')
7
- end
8
- exit(ret)
9
- end
10
-
11
1
  require 'bundler'
12
2
  Bundler::GemHelper.install_tasks
@@ -1,252 +1,39 @@
1
- # Paysio Ruby bindings
2
- # API spec at https://paysio.com/docs/api
3
- require 'cgi'
4
- require 'set'
5
- require 'rubygems'
6
- require 'openssl'
7
-
8
- gem 'rest-client', '~> 1.4'
9
- require 'rest_client'
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/paysio_object'
25
- require 'paysio/api_resource'
26
- require 'paysio/singleton_api_resource'
27
- require 'paysio/list_object'
28
- require 'paysio/account'
29
- require 'paysio/customer'
30
- require 'paysio/charge'
31
- require 'paysio/coupon'
32
- require 'paysio/event'
33
-
34
- # Errors
35
- require 'paysio/errors/paysio_error'
36
- require 'paysio/errors/api_error'
37
- require 'paysio/errors/api_connection_error'
38
- require 'paysio/errors/card_error'
39
- require 'paysio/errors/invalid_request_error'
40
- require 'paysio/errors/authentication_error'
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
- @@verify_ssl_certs = true
47
- @@api_version = nil
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.handle_restclient_error(e)
239
- case e
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,10 @@
1
+ module Paysio
2
+ module Actions
3
+ module Destroy
4
+ def destroy(attrs = {})
5
+ response = Paysio::Client.request(:delete, path)
6
+ refresh_from(response.to_hash)
7
+ end
8
+ end
9
+ end
10
+ 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