finix 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.
- checksums.yaml +7 -0
- data/.gitignore +4 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/Gemfile +14 -0
- data/LICENSE.txt +21 -0
- data/README.md +6 -0
- data/Rakefile +8 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/circle.yml +18 -0
- data/finix.gemspec +31 -0
- data/lib/finix.rb +66 -0
- data/lib/finix/client.rb +88 -0
- data/lib/finix/error.rb +33 -0
- data/lib/finix/hal_resource.rb +39 -0
- data/lib/finix/pagination.rb +78 -0
- data/lib/finix/resources.rb +20 -0
- data/lib/finix/resources/application.rb +23 -0
- data/lib/finix/resources/authorization.rb +18 -0
- data/lib/finix/resources/bank_account.rb +9 -0
- data/lib/finix/resources/dispute.rb +14 -0
- data/lib/finix/resources/evidence.rb +8 -0
- data/lib/finix/resources/hypermedia.rb +26 -0
- data/lib/finix/resources/identity.rb +36 -0
- data/lib/finix/resources/merchant.rb +8 -0
- data/lib/finix/resources/payment_card.rb +9 -0
- data/lib/finix/resources/payment_instrument.rb +8 -0
- data/lib/finix/resources/processor.rb +8 -0
- data/lib/finix/resources/refund.rb +8 -0
- data/lib/finix/resources/resource.rb +148 -0
- data/lib/finix/resources/settlement.rb +8 -0
- data/lib/finix/resources/token.rb +8 -0
- data/lib/finix/resources/transfer.rb +12 -0
- data/lib/finix/resources/unknown_resource.rb +5 -0
- data/lib/finix/resources/user.rb +13 -0
- data/lib/finix/resources/verifiable.rb +12 -0
- data/lib/finix/resources/verification.rb +8 -0
- data/lib/finix/resources/webhook.rb +8 -0
- data/lib/finix/response/finix_error_middleware.rb +26 -0
- data/lib/finix/utils.rb +108 -0
- data/lib/finix/version.rb +3 -0
- metadata +177 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b0e8ae111ff460e0564223a26c61921e2bd835d6
|
4
|
+
data.tar.gz: 3a5b69d952123b1b18bceeb8b5a2079b1807d47b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 117ba294a0bd85a1ba0e21f608950be0601bbf7260d020b16a7bfec473dc4b4e143df522433a2451166ca19bd0f6d9c2e55bad1fcdd889154f4541c5dc6f9671
|
7
|
+
data.tar.gz: 2d021614c589cc51e93998bc2cfb6109a7d2bd18d165d3a57f92b4eca0cdaadf0483e5bf8d70c28bd37acdff3408141a8189ee318e35308a529720328d8fb74b
|
data/.gitignore
ADDED
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
finix
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby-2.1.5
|
data/Gemfile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
# Specify your gem's dependencies in processing-ruby.gemspec
|
4
|
+
gemspec
|
5
|
+
|
6
|
+
gem 'faraday'
|
7
|
+
gem 'faraday_middleware'
|
8
|
+
gem 'addressable'
|
9
|
+
gem 'json'
|
10
|
+
|
11
|
+
group :test do
|
12
|
+
gem 'minitest'
|
13
|
+
gem 'minitest-reporters'
|
14
|
+
end
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2016 Finix Payments, Inc.
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'finix'
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require 'irb'
|
14
|
+
IRB.start
|
data/bin/setup
ADDED
data/circle.yml
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
machine:
|
2
|
+
ruby:
|
3
|
+
version: 2.1.5
|
4
|
+
|
5
|
+
environment:
|
6
|
+
PROCESSING_URL: https://api-staging.finix.io/
|
7
|
+
|
8
|
+
dependencies:
|
9
|
+
override:
|
10
|
+
- gem install bundler
|
11
|
+
- bundle install
|
12
|
+
|
13
|
+
test:
|
14
|
+
override:
|
15
|
+
- rake test
|
16
|
+
|
17
|
+
post:
|
18
|
+
- cp -Rf .report $CIRCLE_ARTIFACTS
|
data/finix.gemspec
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'finix/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'finix'
|
8
|
+
spec.version = Finix::VERSION
|
9
|
+
spec.authors = ['finix-payments']
|
10
|
+
spec.email = ['support@finixpayments.com']
|
11
|
+
|
12
|
+
spec.summary = %q{Finix Ruby Client}
|
13
|
+
spec.description = %q{Finix Ruby Client}
|
14
|
+
spec.homepage = 'https://www.finixpayments.com'
|
15
|
+
spec.license = 'MIT'
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
18
|
+
f.match(%r{^(test|spec|features)/})
|
19
|
+
end
|
20
|
+
spec.bindir = 'bin'
|
21
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
22
|
+
spec.require_paths = ['lib']
|
23
|
+
|
24
|
+
spec.add_development_dependency 'bundler', '~> 1.13'
|
25
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
26
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
27
|
+
|
28
|
+
spec.add_dependency('faraday', ['>= 0.8.6', '<= 0.9.0'])
|
29
|
+
spec.add_dependency('faraday_middleware', '~> 0.9.0')
|
30
|
+
spec.add_dependency('addressable', '~> 2.3.5')
|
31
|
+
end
|
data/lib/finix.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'finix/version' unless defined? Finix::VERSION
|
2
|
+
|
3
|
+
module Finix
|
4
|
+
|
5
|
+
@client = nil
|
6
|
+
@config = {:root_url=>'https://localhost/processing'}
|
7
|
+
@hypermedia_registry = {}
|
8
|
+
|
9
|
+
class << self
|
10
|
+
|
11
|
+
attr_accessor :client
|
12
|
+
attr_accessor :config
|
13
|
+
attr_accessor :hypermedia_registry
|
14
|
+
|
15
|
+
def configure(options={})
|
16
|
+
unless options[:root_url].nil? # reset us/pass as well if user update :root_url
|
17
|
+
@config = {}
|
18
|
+
end
|
19
|
+
|
20
|
+
@config = @config.merge(options)
|
21
|
+
@config[:user] = @config[:user].strip unless @config[:user].nil?
|
22
|
+
@config[:password] = @config[:password].strip unless @config[:password].nil?
|
23
|
+
|
24
|
+
@client = Finix::Client.new @config
|
25
|
+
end
|
26
|
+
|
27
|
+
def split_the_href(href)
|
28
|
+
URI.parse(href).path.sub(/\/$/, '').split('/')
|
29
|
+
end
|
30
|
+
|
31
|
+
def from_hypermedia_registry(resource_name)
|
32
|
+
cls = Finix.hypermedia_registry[resource_name]
|
33
|
+
if cls.nil?
|
34
|
+
return Finix::UnknownResource
|
35
|
+
end
|
36
|
+
cls
|
37
|
+
end
|
38
|
+
|
39
|
+
def from_href(href)
|
40
|
+
split_uri = split_the_href(href)
|
41
|
+
split_uri.reverse!.each do |resource|
|
42
|
+
cls = Finix.hypermedia_registry[resource]
|
43
|
+
return cls unless cls.nil?
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def is_collection(href)
|
48
|
+
split_uri = split_the_href(href)
|
49
|
+
Finix.hypermedia_registry.has_key?(split_uri.last)
|
50
|
+
end
|
51
|
+
|
52
|
+
def get(*args, &block)
|
53
|
+
self.client.get *args
|
54
|
+
end
|
55
|
+
|
56
|
+
def post(*args, &block)
|
57
|
+
self.client.post *args
|
58
|
+
end
|
59
|
+
|
60
|
+
def put(*args, &block)
|
61
|
+
self.client.put *args
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
require 'finix/resources'
|
data/lib/finix/client.rb
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'logger'
|
2
|
+
require 'uri'
|
3
|
+
require 'faraday'
|
4
|
+
require 'faraday_middleware'
|
5
|
+
require 'finix/response/finix_error_middleware'
|
6
|
+
|
7
|
+
|
8
|
+
module Finix
|
9
|
+
class Client
|
10
|
+
|
11
|
+
DEFAULTS = {
|
12
|
+
:logging_level => 'WARN',
|
13
|
+
:connection_timeout => 60,
|
14
|
+
:read_timeout => 60,
|
15
|
+
:logger => nil,
|
16
|
+
:ssl_verify => true,
|
17
|
+
:faraday_adapter => Faraday.default_adapter,
|
18
|
+
}
|
19
|
+
|
20
|
+
attr_reader :conn
|
21
|
+
attr_accessor :config
|
22
|
+
|
23
|
+
def initialize(options={})
|
24
|
+
@config = DEFAULTS.merge options
|
25
|
+
build_conn
|
26
|
+
end
|
27
|
+
|
28
|
+
def build_conn
|
29
|
+
if config[:logger]
|
30
|
+
logger = config[:logger]
|
31
|
+
else
|
32
|
+
logger = Logger.new(STDOUT)
|
33
|
+
logger.level = Logger.const_get(config[:logging_level].to_s)
|
34
|
+
end
|
35
|
+
|
36
|
+
Faraday::Response.register_middleware :handle_api_errors => lambda { Faraday::Response::RaiseApiError }
|
37
|
+
|
38
|
+
options = {
|
39
|
+
:request => {
|
40
|
+
:open_timeout => config[:connection_timeout],
|
41
|
+
:timeout => config[:read_timeout]
|
42
|
+
},
|
43
|
+
:ssl => {
|
44
|
+
:verify => @config[:ssl_verify] # Only set this to false for testing
|
45
|
+
}
|
46
|
+
}
|
47
|
+
@conn = Faraday.new(@config[:url], options) do |cxn|
|
48
|
+
cxn.request :multipart
|
49
|
+
cxn.request :url_encoded
|
50
|
+
cxn.request :json
|
51
|
+
cxn.response :logger, logger
|
52
|
+
cxn.response :handle_api_errors
|
53
|
+
cxn.response :json
|
54
|
+
cxn.adapter config[:faraday_adapter]
|
55
|
+
end
|
56
|
+
conn.headers['User-Agent'] = "finix-ruby/#{Finix::VERSION}"
|
57
|
+
end
|
58
|
+
|
59
|
+
def method_missing(method, *args, &block)
|
60
|
+
href_or_uri = args[0]
|
61
|
+
args[0] = "#{@config[:root_url]}/#{href_or_uri}" unless href_or_uri =~ /\A#{URI::regexp(%w(http https))}\z/
|
62
|
+
if is_http_method? method
|
63
|
+
# TODO use auth property
|
64
|
+
conn.basic_auth(@config[:user], @config[:password]) unless @config[:user].nil? and @config[:password].nil?
|
65
|
+
conn.send method, *args do |req|
|
66
|
+
req.headers['Content-Type'] = 'application/json'
|
67
|
+
req.headers['Content-Type'] = 'multipart/form-data' if ((not req.body.nil?) and req.body.key?('file'))
|
68
|
+
end
|
69
|
+
else
|
70
|
+
super method, *args, &block
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
def is_http_method? method
|
77
|
+
[:get, :post, :put, :delete].include? method
|
78
|
+
end
|
79
|
+
|
80
|
+
def respond_to?(method, include_private = false)
|
81
|
+
if is_http_method? method
|
82
|
+
true
|
83
|
+
else
|
84
|
+
super method, include_private
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
data/lib/finix/error.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
module Finix
|
2
|
+
|
3
|
+
class ResourceErrors < ::StandardError
|
4
|
+
attr_reader :response
|
5
|
+
attr_reader :errors
|
6
|
+
|
7
|
+
def initialize(response=nil)
|
8
|
+
@response = response
|
9
|
+
@errors = []
|
10
|
+
@response[:body]['_embedded']['errors'].each { |error| @errors.push Finix::ResourceError.new error}
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_s
|
14
|
+
"#{@errors}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class ResourceError
|
19
|
+
attr_reader :attributes
|
20
|
+
|
21
|
+
def initialize(error = {})
|
22
|
+
@attributes = {}
|
23
|
+
@attributes = @attributes.merge error
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class BadRequest < ResourceErrors; end
|
28
|
+
class Unauthorized < ResourceErrors; end
|
29
|
+
class Forbidden < ResourceErrors; end
|
30
|
+
class NotFound < ResourceErrors; end
|
31
|
+
class MethodNotAllowed < ResourceErrors; end
|
32
|
+
class UnprocessableEntity < ResourceErrors; end
|
33
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Finix
|
2
|
+
module HalResource
|
3
|
+
|
4
|
+
attr_accessor :hyperlinks
|
5
|
+
attr_accessor :attributes
|
6
|
+
|
7
|
+
def method_missing(method, *args, &block)
|
8
|
+
if @attributes.has_key?(method.to_s)
|
9
|
+
return @attributes[method.to_s]
|
10
|
+
end
|
11
|
+
|
12
|
+
case method.to_s
|
13
|
+
when /(.+)=$/
|
14
|
+
attr = method.to_s.chop
|
15
|
+
@attributes[attr] = args[0]
|
16
|
+
else
|
17
|
+
if @hyperlinks.has_key? "#{method}"
|
18
|
+
value = @hyperlinks["#{method}"]
|
19
|
+
result = value.call
|
20
|
+
return result
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
if RUBY_VERSION < '1.9'
|
26
|
+
def respond_to?(method_name, include_private=false)
|
27
|
+
does_resource_respond_to?(method_name) || super
|
28
|
+
end
|
29
|
+
else
|
30
|
+
def respond_to_missing?(method_name, include_private=false)
|
31
|
+
does_resource_respond_to?(method_name) || super
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def does_resource_respond_to?(method_name)
|
36
|
+
@attributes.has_key?(method_name.to_s) or @hyperlinks.has_key?(method_name.to_s)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
require_relative 'hal_resource'
|
3
|
+
|
4
|
+
module Finix
|
5
|
+
class Pagination
|
6
|
+
|
7
|
+
include Enumerable
|
8
|
+
include HalResource
|
9
|
+
|
10
|
+
attr_accessor :resource_class
|
11
|
+
|
12
|
+
def initialize(href, opts={})
|
13
|
+
@hyperlinks = {}
|
14
|
+
@attributes = {}
|
15
|
+
|
16
|
+
@hyperlinks[:self] = href
|
17
|
+
@resource_class = nil
|
18
|
+
end
|
19
|
+
|
20
|
+
def each
|
21
|
+
return enum_for :each unless block_given?
|
22
|
+
current
|
23
|
+
loop do
|
24
|
+
items.each { |item| yield item }
|
25
|
+
fetch :next
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def current
|
30
|
+
refresh unless items
|
31
|
+
items
|
32
|
+
end
|
33
|
+
|
34
|
+
def fetch(scope) # :next, :last, :first, :prev, :self
|
35
|
+
scope = scope.to_s.to_sym
|
36
|
+
if @hyperlinks[scope]
|
37
|
+
load_from @hyperlinks[scope]
|
38
|
+
return self.items
|
39
|
+
end
|
40
|
+
|
41
|
+
raise StopIteration
|
42
|
+
end
|
43
|
+
|
44
|
+
def refresh
|
45
|
+
fetch :self
|
46
|
+
end
|
47
|
+
|
48
|
+
def create(attrs={})
|
49
|
+
attrs = attrs.attributes if attrs.is_a?(Finix::Resource)
|
50
|
+
attrs = Finix::Utils.indifferent_read_access attrs
|
51
|
+
href = @hyperlinks[:self]
|
52
|
+
if @resource_class.nil?
|
53
|
+
@resource_class = Finix.from_href(href)
|
54
|
+
end
|
55
|
+
@resource_class.new(attrs, href).save
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def load_from(url, params = {})
|
61
|
+
params ||= {}
|
62
|
+
|
63
|
+
response = Finix.get url, params
|
64
|
+
body = Finix::Utils.indifferent_read_access response.body
|
65
|
+
|
66
|
+
links = body.delete('_links')
|
67
|
+
links.each { |key, link| @hyperlinks[key.to_sym] = link[:href] }
|
68
|
+
|
69
|
+
@attributes = {} # clear attributes
|
70
|
+
if body.has_key? '_embedded'
|
71
|
+
resource_name, resources = body.delete('_embedded').first
|
72
|
+
@resource_class = Finix.from_hypermedia_registry resource_name
|
73
|
+
@attributes['items'] = resources.map { |item| @resource_class.construct_from_response item }
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'finix/resources/verifiable'
|
2
|
+
require 'finix/resources/resource'
|
3
|
+
require 'finix/resources/unknown_resource'
|
4
|
+
require 'finix/resources/hypermedia'
|
5
|
+
require 'finix/resources/user'
|
6
|
+
require 'finix/resources/application'
|
7
|
+
require 'finix/resources/identity'
|
8
|
+
require 'finix/resources/processor'
|
9
|
+
require 'finix/resources/token'
|
10
|
+
require 'finix/resources/merchant'
|
11
|
+
require 'finix/resources/payment_instrument'
|
12
|
+
require 'finix/resources/payment_card'
|
13
|
+
require 'finix/resources/bank_account'
|
14
|
+
require 'finix/resources/transfer'
|
15
|
+
require 'finix/resources/authorization'
|
16
|
+
require 'finix/resources/webhook'
|
17
|
+
require 'finix/resources/verification'
|
18
|
+
require 'finix/resources/dispute'
|
19
|
+
require 'finix/resources/evidence'
|
20
|
+
require 'finix/resources/refund'
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Finix
|
2
|
+
class Application
|
3
|
+
include Finix::Resource
|
4
|
+
include Finix::HypermediaRegistry
|
5
|
+
|
6
|
+
define_hypermedia_types [:applications]
|
7
|
+
|
8
|
+
def create_partner_user(attrs={})
|
9
|
+
attrs = attrs.attributes if attrs.is_a?(Finix::Resource)
|
10
|
+
self.users.create(attrs)
|
11
|
+
end
|
12
|
+
|
13
|
+
def create_processor(attrs={})
|
14
|
+
attrs = attrs.attributes if attrs.is_a?(Finix::Resource)
|
15
|
+
self.processors.create(attrs)
|
16
|
+
end
|
17
|
+
|
18
|
+
def create_token(attrs={})
|
19
|
+
attrs = attrs.attributes if attrs.is_a?(Finix::Resource)
|
20
|
+
self.tokens.create(attrs)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Finix
|
2
|
+
class Authorization
|
3
|
+
include Finix::Resource
|
4
|
+
include Finix::HypermediaRegistry
|
5
|
+
|
6
|
+
define_hypermedia_types [:authorizations]
|
7
|
+
|
8
|
+
def void
|
9
|
+
self['void_me'] = true
|
10
|
+
self.save
|
11
|
+
end
|
12
|
+
|
13
|
+
def capture(attrs={})
|
14
|
+
self.attributes = self.attributes.merge attrs
|
15
|
+
self.save
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Finix
|
2
|
+
class Dispute
|
3
|
+
include Finix::Resource
|
4
|
+
include Finix::HypermediaRegistry
|
5
|
+
|
6
|
+
define_hypermedia_types [:disputes]
|
7
|
+
|
8
|
+
def upload_evidence(evidence_file_path)
|
9
|
+
# self.evidence.file = Faraday::UploadIO.new(evidence_file_path, 'application/octet-stream')
|
10
|
+
# self.evidence.file = Faraday::UploadIO.new(evidence_file_path, 'application/octet-stream')
|
11
|
+
self.evidence.create :file => Faraday::UploadIO.new(evidence_file_path, 'application/octet-stream')
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Finix
|
2
|
+
|
3
|
+
module HypermediaRegistry
|
4
|
+
|
5
|
+
def self.included(base) # :nodoc:
|
6
|
+
base.extend ClassMethods
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
|
11
|
+
def define_hypermedia_types(types)
|
12
|
+
@hypermedia_types = types.map! do |t|
|
13
|
+
t.to_s
|
14
|
+
end.sort!.freeze
|
15
|
+
|
16
|
+
@hypermedia_types.each do |type|
|
17
|
+
Finix.hypermedia_registry[type] = self
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
attr_reader :hypermedia_types
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Finix
|
2
|
+
class Identity
|
3
|
+
include Finix::Resource
|
4
|
+
include Finix::HypermediaRegistry
|
5
|
+
include Finix::Verifiable
|
6
|
+
|
7
|
+
define_hypermedia_types [:identities]
|
8
|
+
|
9
|
+
def provision_merchant_on(attrs={})
|
10
|
+
self.merchants.create(attrs)
|
11
|
+
end
|
12
|
+
|
13
|
+
def create_payment_instrument(attrs={})
|
14
|
+
if attrs.is_a?(Finix::Resource)
|
15
|
+
attrs.identity = self.id
|
16
|
+
attrs = attrs.attributes
|
17
|
+
else
|
18
|
+
attrs['identity'] = self.id # TODO might be error here
|
19
|
+
end
|
20
|
+
|
21
|
+
if attrs['type'] == 'PAYMENT_CARD'
|
22
|
+
self.payment_instruments.resource_class = Finix::PaymentCard
|
23
|
+
elsif attrs['type'] == 'BANK_ACCOUNT'
|
24
|
+
self.payment_instruments.resource_class = Finix::BankAccount
|
25
|
+
end
|
26
|
+
|
27
|
+
self.payment_instruments.create(attrs)
|
28
|
+
end
|
29
|
+
|
30
|
+
def create_settlement(attrs={})
|
31
|
+
attrs = attrs.attributes if attrs.is_a?(Finix::Resource)
|
32
|
+
self.settlements.create(attrs)
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,148 @@
|
|
1
|
+
require File.expand_path('../../pagination', __FILE__)
|
2
|
+
require File.expand_path('../../utils', __FILE__)
|
3
|
+
require File.expand_path('../../hal_resource', __FILE__)
|
4
|
+
require 'addressable/template'
|
5
|
+
|
6
|
+
module Finix
|
7
|
+
|
8
|
+
module Resource
|
9
|
+
|
10
|
+
include HalResource
|
11
|
+
|
12
|
+
def initialize(attributes = {}, href = nil)
|
13
|
+
@attributes = Utils.indifferent_read_access attributes
|
14
|
+
|
15
|
+
@hyperlinks = {}
|
16
|
+
@hyperlinks[:self] = href if href =~ URI::regexp
|
17
|
+
end
|
18
|
+
|
19
|
+
def hydrate(links)
|
20
|
+
links.each do |key, link|
|
21
|
+
property = key.sub(/.*?\./, '')
|
22
|
+
|
23
|
+
if property == 'self'
|
24
|
+
@hyperlinks[:self] = link[:href]
|
25
|
+
# @attributes['href'] = link[:href]
|
26
|
+
else
|
27
|
+
@hyperlinks[property] = Finix::Utils.callable(Finix::Pagination.new(link[:href], {}))
|
28
|
+
# @hyperlinks[property] = Finix.from_hypermedia_registry(property).new 'href' => link[:href]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def fetch(*arguments)
|
34
|
+
self.class.find *arguments
|
35
|
+
end
|
36
|
+
|
37
|
+
alias find fetch
|
38
|
+
|
39
|
+
def save(options = {}, href = nil)
|
40
|
+
options = options.is_a?(Finix::Resource) ? options.attributes : options
|
41
|
+
@attributes = @attributes.merge options
|
42
|
+
href ||= @hyperlinks[:self]
|
43
|
+
# href = @attributes.delete('href')
|
44
|
+
method = :post
|
45
|
+
if href.nil?
|
46
|
+
href = Finix.hypermedia_registry.key(self.class)
|
47
|
+
elsif not @attributes[:id].nil?
|
48
|
+
method = :put
|
49
|
+
end
|
50
|
+
|
51
|
+
attributes_to_submit = self.sanitize
|
52
|
+
begin
|
53
|
+
@response = Finix.send(method, href, attributes_to_submit)
|
54
|
+
rescue Exception
|
55
|
+
raise
|
56
|
+
end
|
57
|
+
|
58
|
+
refresh @response
|
59
|
+
end
|
60
|
+
|
61
|
+
def sanitize
|
62
|
+
to_submit = {}
|
63
|
+
@attributes.each do |key, value|
|
64
|
+
if not value.is_a? Finix::Resource
|
65
|
+
to_submit[key] = value
|
66
|
+
end
|
67
|
+
end
|
68
|
+
to_submit
|
69
|
+
end
|
70
|
+
|
71
|
+
def response
|
72
|
+
@response
|
73
|
+
end
|
74
|
+
|
75
|
+
private :response
|
76
|
+
|
77
|
+
def refresh(the_response = nil)
|
78
|
+
if the_response
|
79
|
+
return if the_response.body.to_s.length.zero?
|
80
|
+
fresh = self.class.construct_from_response the_response.body
|
81
|
+
else
|
82
|
+
fresh = self.find(@hyperlinks[:self])
|
83
|
+
# fresh = self.find(@attributes[:href])
|
84
|
+
end
|
85
|
+
fresh and copy_from fresh
|
86
|
+
self
|
87
|
+
end
|
88
|
+
|
89
|
+
# alias refresh load!
|
90
|
+
|
91
|
+
def copy_from(other)
|
92
|
+
other.instance_variables.each do |ivar|
|
93
|
+
instance_variable_set ivar, other.instance_variable_get(ivar)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def self.included(base)
|
98
|
+
base.extend ClassMethods
|
99
|
+
end
|
100
|
+
|
101
|
+
module ClassMethods
|
102
|
+
|
103
|
+
def construct_from_response(payload)
|
104
|
+
payload = Finix::Utils.indifferent_read_access payload
|
105
|
+
|
106
|
+
links = payload.delete('_links') || {}
|
107
|
+
instance = self.new payload
|
108
|
+
instance.hydrate(links)
|
109
|
+
instance
|
110
|
+
end
|
111
|
+
|
112
|
+
def fetch(*arguments)
|
113
|
+
if arguments.nil? or arguments.empty? or arguments[0].nil? or arguments[0].to_s.empty? # no symbol.empty? in 1.8.7
|
114
|
+
raise Finix::NotFound
|
115
|
+
end
|
116
|
+
|
117
|
+
options = arguments.slice!(0) or {}
|
118
|
+
if options.is_a? String
|
119
|
+
href = options
|
120
|
+
else
|
121
|
+
href = Finix.hypermedia_registry.key(self) or Finix.hypermedia_registry.key(self.class)
|
122
|
+
id = options.delete(:id)
|
123
|
+
href = "#{href}/#{id}" unless id.nil?
|
124
|
+
end
|
125
|
+
|
126
|
+
response = Finix.get href
|
127
|
+
construct_from_response response.body
|
128
|
+
|
129
|
+
end
|
130
|
+
|
131
|
+
alias find fetch
|
132
|
+
|
133
|
+
# def paginate(options = {})
|
134
|
+
# Finix::Pagination.new href, options
|
135
|
+
# end
|
136
|
+
|
137
|
+
# alias scoped paginate
|
138
|
+
# alias where paginate
|
139
|
+
|
140
|
+
# def all(options = {})
|
141
|
+
# pager = paginate(options)
|
142
|
+
# pager.to_a
|
143
|
+
# end
|
144
|
+
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Finix
|
2
|
+
class User
|
3
|
+
include Finix::Resource
|
4
|
+
include Finix::HypermediaRegistry
|
5
|
+
|
6
|
+
define_hypermedia_types [:users]
|
7
|
+
|
8
|
+
def create_application(attrs = {})
|
9
|
+
attrs = attrs.attributes if attrs.is_a?(Finix::Resource)
|
10
|
+
self.applications.create(attrs)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'finix/error'
|
3
|
+
|
4
|
+
module Faraday
|
5
|
+
|
6
|
+
class Response::RaiseApiError < Response::Middleware
|
7
|
+
|
8
|
+
HTTP_STATUS_CODES = {
|
9
|
+
400 => Finix::BadRequest,
|
10
|
+
401 => Finix::Unauthorized,
|
11
|
+
403 => Finix::Forbidden,
|
12
|
+
404 => Finix::NotFound,
|
13
|
+
405 => Finix::MethodNotAllowed,
|
14
|
+
422 => Finix::UnprocessableEntity
|
15
|
+
}
|
16
|
+
|
17
|
+
def on_complete(response)
|
18
|
+
status_code = response[:status].to_i
|
19
|
+
error_class = HTTP_STATUS_CODES[status_code]
|
20
|
+
raise Finix::ResourceErrors.new(response) if error_class.nil? and status_code >= 400
|
21
|
+
raise error_class.new(response) if error_class
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
data/lib/finix/utils.rb
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
module Finix
|
2
|
+
|
3
|
+
module Utils
|
4
|
+
|
5
|
+
def callable(callable_or_not)
|
6
|
+
callable_or_not.respond_to?(:call) ? callable_or_not : lambda { callable_or_not }
|
7
|
+
end
|
8
|
+
|
9
|
+
def camelize(underscored_word)
|
10
|
+
underscored_word.to_s.gsub(/(?:^|_)(.)/) { $1.upcase }
|
11
|
+
end
|
12
|
+
|
13
|
+
def classify(table_name)
|
14
|
+
camelize singularize(table_name.to_s.sub(/.*\./, ''))
|
15
|
+
end
|
16
|
+
|
17
|
+
def demodulize(class_name_in_module)
|
18
|
+
class_name_in_module.to_s.sub(/^.*::/, '')
|
19
|
+
end
|
20
|
+
|
21
|
+
def pluralize(word)
|
22
|
+
word.to_s.sub(/([^s])$/, '\1s')
|
23
|
+
end
|
24
|
+
|
25
|
+
def singularize(word)
|
26
|
+
word.to_s.sub(/s$/, '').sub(/ie$/, 'y')
|
27
|
+
end
|
28
|
+
|
29
|
+
def underscore(camel_cased_word)
|
30
|
+
word = camel_cased_word.to_s.dup
|
31
|
+
word.gsub!(/::/, '/')
|
32
|
+
word.gsub!(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
|
33
|
+
word.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
|
34
|
+
word.tr! '-', '_'
|
35
|
+
word.downcase!
|
36
|
+
word
|
37
|
+
end
|
38
|
+
|
39
|
+
# def extract_href_from_object(object)
|
40
|
+
# object.respond_to?(:href) ? object.href : object
|
41
|
+
# end
|
42
|
+
|
43
|
+
def indifferent_read_access(base = {})
|
44
|
+
indifferent = Hash.new do |hash, key|
|
45
|
+
hash[key.to_s] if key.is_a? Symbol
|
46
|
+
end
|
47
|
+
base.each_pair do |key, value|
|
48
|
+
if value.is_a? Hash
|
49
|
+
value = indifferent_read_access value
|
50
|
+
elsif value.respond_to? :each
|
51
|
+
if value.respond_to? :map!
|
52
|
+
value.map! do |v|
|
53
|
+
if v.is_a? Hash
|
54
|
+
v = indifferent_read_access v
|
55
|
+
end
|
56
|
+
v
|
57
|
+
end
|
58
|
+
else
|
59
|
+
value.map do |v|
|
60
|
+
if v.is_a? Hash
|
61
|
+
v = indifferent_read_access v
|
62
|
+
end
|
63
|
+
v
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
indifferent[key.to_s] = value
|
68
|
+
end
|
69
|
+
indifferent
|
70
|
+
end
|
71
|
+
|
72
|
+
# def stringify_keys!(hash)
|
73
|
+
# hash.keys.each do |key|
|
74
|
+
# stringify_keys! hash[key] if hash[key].is_a? Hash
|
75
|
+
# hash[key.to_s] = hash.delete key if key.is_a? Symbol
|
76
|
+
# end
|
77
|
+
# end
|
78
|
+
|
79
|
+
# Validate all keys in a hash match *valid keys, raising ArgumentError on a mismatch.
|
80
|
+
# Note that keys are NOT treated indifferently, meaning if you use strings for keys but assert symbols
|
81
|
+
# as keys, this will fail.
|
82
|
+
#
|
83
|
+
# ==== Examples
|
84
|
+
# { :name => "Rob", :years => "28" }.assert_valid_keys(:name, :age) # => raises "ArgumentError: Unknown key(s): years"
|
85
|
+
# { :name => "Rob", :age => "28" }.assert_valid_keys("name", "age") # => raises "ArgumentError: Unknown key(s): name, age"
|
86
|
+
# { :name => "Rob", :age => "28" }.assert_valid_keys(:name, :age) # => passes, raises nothing
|
87
|
+
# def assert_valid_keys(hash, *valid_keys)
|
88
|
+
# unknown_keys = hash.keys - [valid_keys].flatten
|
89
|
+
# raise(ArgumentError, "Unknown key(s): #{unknown_keys.join(', ')}") unless unknown_keys.empty?
|
90
|
+
# end
|
91
|
+
|
92
|
+
# http://pablomanrubia.com/2011/03/extending-ruby-to-validate-required-keys-in-a-hash-table/
|
93
|
+
#def assert_required_keys(hash, params)
|
94
|
+
# params[:required] ||= []
|
95
|
+
# params[:optional] ||= []
|
96
|
+
# assert_valid_keys(hash, params[:required] + params[:optional])
|
97
|
+
# pending_keys = params[:required] - hash.keys
|
98
|
+
# raise(ArgumentError, "Required key(s) not present: #{pending_keys.join(', ')}") unless pending_keys.empty?
|
99
|
+
#end
|
100
|
+
|
101
|
+
# def assert_required_keys(hash, params)
|
102
|
+
# params[:required] ||= []
|
103
|
+
# pending_keys = params[:required] - hash.keys
|
104
|
+
# raise(ArgumentError, "Required key(s) not present: #{pending_keys.join(', ')}") unless pending_keys.empty?
|
105
|
+
# end
|
106
|
+
extend self
|
107
|
+
end
|
108
|
+
end
|
metadata
ADDED
@@ -0,0 +1,177 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: finix
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.2'
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- finix-payments
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-12-06 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.13'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.13'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: faraday
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.8.6
|
62
|
+
- - "<="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: 0.9.0
|
65
|
+
type: :runtime
|
66
|
+
prerelease: false
|
67
|
+
version_requirements: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: 0.8.6
|
72
|
+
- - "<="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 0.9.0
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: faraday_middleware
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: 0.9.0
|
82
|
+
type: :runtime
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: 0.9.0
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: addressable
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "~>"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: 2.3.5
|
96
|
+
type: :runtime
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - "~>"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 2.3.5
|
103
|
+
description: Finix Ruby Client
|
104
|
+
email:
|
105
|
+
- support@finixpayments.com
|
106
|
+
executables:
|
107
|
+
- console
|
108
|
+
- setup
|
109
|
+
extensions: []
|
110
|
+
extra_rdoc_files: []
|
111
|
+
files:
|
112
|
+
- ".gitignore"
|
113
|
+
- ".ruby-gemset"
|
114
|
+
- ".ruby-version"
|
115
|
+
- Gemfile
|
116
|
+
- LICENSE.txt
|
117
|
+
- README.md
|
118
|
+
- Rakefile
|
119
|
+
- bin/console
|
120
|
+
- bin/setup
|
121
|
+
- circle.yml
|
122
|
+
- finix.gemspec
|
123
|
+
- lib/finix.rb
|
124
|
+
- lib/finix/client.rb
|
125
|
+
- lib/finix/error.rb
|
126
|
+
- lib/finix/hal_resource.rb
|
127
|
+
- lib/finix/pagination.rb
|
128
|
+
- lib/finix/resources.rb
|
129
|
+
- lib/finix/resources/application.rb
|
130
|
+
- lib/finix/resources/authorization.rb
|
131
|
+
- lib/finix/resources/bank_account.rb
|
132
|
+
- lib/finix/resources/dispute.rb
|
133
|
+
- lib/finix/resources/evidence.rb
|
134
|
+
- lib/finix/resources/hypermedia.rb
|
135
|
+
- lib/finix/resources/identity.rb
|
136
|
+
- lib/finix/resources/merchant.rb
|
137
|
+
- lib/finix/resources/payment_card.rb
|
138
|
+
- lib/finix/resources/payment_instrument.rb
|
139
|
+
- lib/finix/resources/processor.rb
|
140
|
+
- lib/finix/resources/refund.rb
|
141
|
+
- lib/finix/resources/resource.rb
|
142
|
+
- lib/finix/resources/settlement.rb
|
143
|
+
- lib/finix/resources/token.rb
|
144
|
+
- lib/finix/resources/transfer.rb
|
145
|
+
- lib/finix/resources/unknown_resource.rb
|
146
|
+
- lib/finix/resources/user.rb
|
147
|
+
- lib/finix/resources/verifiable.rb
|
148
|
+
- lib/finix/resources/verification.rb
|
149
|
+
- lib/finix/resources/webhook.rb
|
150
|
+
- lib/finix/response/finix_error_middleware.rb
|
151
|
+
- lib/finix/utils.rb
|
152
|
+
- lib/finix/version.rb
|
153
|
+
homepage: https://www.finixpayments.com
|
154
|
+
licenses:
|
155
|
+
- MIT
|
156
|
+
metadata: {}
|
157
|
+
post_install_message:
|
158
|
+
rdoc_options: []
|
159
|
+
require_paths:
|
160
|
+
- lib
|
161
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
162
|
+
requirements:
|
163
|
+
- - ">="
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0'
|
166
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
167
|
+
requirements:
|
168
|
+
- - ">="
|
169
|
+
- !ruby/object:Gem::Version
|
170
|
+
version: '0'
|
171
|
+
requirements: []
|
172
|
+
rubyforge_project:
|
173
|
+
rubygems_version: 2.4.8
|
174
|
+
signing_key:
|
175
|
+
specification_version: 4
|
176
|
+
summary: Finix Ruby Client
|
177
|
+
test_files: []
|