apruve 0.9.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/.gitignore +42 -0
- data/.rspec +2 -0
- data/Gemfile +29 -0
- data/Gemfile.lock +98 -0
- data/LICENSE.txt +22 -0
- data/README.md +44 -0
- data/Rakefile +13 -0
- data/apruve.gemspec +27 -0
- data/lib/apruve.rb +101 -0
- data/lib/apruve/client.rb +102 -0
- data/lib/apruve/error.rb +116 -0
- data/lib/apruve/faraday_error_handler.rb +16 -0
- data/lib/apruve/resources.rb +10 -0
- data/lib/apruve/resources/apruve_object.rb +44 -0
- data/lib/apruve/resources/line_item.rb +13 -0
- data/lib/apruve/resources/payment.rb +43 -0
- data/lib/apruve/resources/payment_item.rb +7 -0
- data/lib/apruve/resources/payment_request.rb +60 -0
- data/lib/apruve/resources/subscription.rb +26 -0
- data/lib/apruve/resources/subscription_adjustment.rb +33 -0
- data/lib/apruve/resources/validation_error.rb +12 -0
- data/lib/apruve/response/apruve_exception_middleware.rb +39 -0
- data/lib/apruve/response/apruve_parse_json.rb +11 -0
- data/lib/apruve/utils.rb +108 -0
- data/lib/apruve/version.rb +3 -0
- data/spec/apruve/apruve_spec.rb +96 -0
- data/spec/apruve/client_spec.rb +17 -0
- data/spec/apruve/config_spec.rb +7 -0
- data/spec/apruve/resources/line_item_spec.rb +39 -0
- data/spec/apruve/resources/payment_item_spec.rb +17 -0
- data/spec/apruve/resources/payment_request_spec.rb +133 -0
- data/spec/apruve/resources/payment_spec.rb +129 -0
- data/spec/apruve/resources/subscription_spec.rb +141 -0
- data/spec/apruve/response/apruve_exception_middleware_spec.rb +43 -0
- data/spec/spec_helper.rb +34 -0
- metadata +180 -0
data/.gitignore
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
.bundle
|
4
|
+
.config
|
5
|
+
.yardoc
|
6
|
+
InstalledFiles
|
7
|
+
_yardoc
|
8
|
+
coverage
|
9
|
+
doc/
|
10
|
+
lib/bundler/man
|
11
|
+
pkg
|
12
|
+
rdoc
|
13
|
+
spec/reports
|
14
|
+
test/tmp
|
15
|
+
test/version_tmp
|
16
|
+
tmp
|
17
|
+
|
18
|
+
# Mac finder artifacts
|
19
|
+
.DS_Store
|
20
|
+
|
21
|
+
# Eclipse-based IDE project files
|
22
|
+
.project
|
23
|
+
|
24
|
+
# Idea-based IDE project files
|
25
|
+
.idea
|
26
|
+
.idea/*
|
27
|
+
|
28
|
+
# Textmate project files
|
29
|
+
/*.tmproj
|
30
|
+
|
31
|
+
# vim artifacts
|
32
|
+
**.swp
|
33
|
+
|
34
|
+
# rbenv ruby version for local directory
|
35
|
+
.ruby-version
|
36
|
+
.rbenv-version
|
37
|
+
|
38
|
+
#ctags file for vim.
|
39
|
+
tags
|
40
|
+
|
41
|
+
# aptana studio 3
|
42
|
+
.settings/*
|
data/.rspec
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
# Specify your gem's dependencies in apruve.gemspec
|
4
|
+
gemspec
|
5
|
+
|
6
|
+
gem 'faraday'
|
7
|
+
gem 'faraday_middleware'
|
8
|
+
gem 'addressable'
|
9
|
+
gem 'json'
|
10
|
+
|
11
|
+
group :development do
|
12
|
+
gem 'yard'
|
13
|
+
gem 'guard', '~> 1.6.2'
|
14
|
+
gem 'listen', '~> 1.3.1' # 2.x requires celluloid, not 1.8.7 friendly
|
15
|
+
gem 'guard-rspec', '~> 2.4.1'
|
16
|
+
end
|
17
|
+
|
18
|
+
group :test do
|
19
|
+
|
20
|
+
gem 'ruby-debug-base19x'
|
21
|
+
gem 'ruby-debug-ide'
|
22
|
+
|
23
|
+
gem 'faker'
|
24
|
+
gem 'net-http-persistent'
|
25
|
+
gem 'rspec', '~> 2.14.1'
|
26
|
+
gem 'rake', '~> 10.0.3'
|
27
|
+
gem 'vcr', '~> 2.4.0'
|
28
|
+
gem 'webmock'
|
29
|
+
end
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
apruve (0.0.1)
|
5
|
+
addressable (~> 2.3.5)
|
6
|
+
faraday (>= 0.8.6, <= 0.9.0)
|
7
|
+
faraday_middleware (~> 0.9.0)
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: https://rubygems.org/
|
11
|
+
specs:
|
12
|
+
addressable (2.3.6)
|
13
|
+
coderay (1.1.0)
|
14
|
+
crack (0.4.2)
|
15
|
+
safe_yaml (~> 1.0.0)
|
16
|
+
debugger-ruby_core_source (1.3.2)
|
17
|
+
diff-lcs (1.2.5)
|
18
|
+
faker (1.3.0)
|
19
|
+
i18n (~> 0.5)
|
20
|
+
faraday (0.9.0)
|
21
|
+
multipart-post (>= 1.2, < 3)
|
22
|
+
faraday_middleware (0.9.1)
|
23
|
+
faraday (>= 0.7.4, < 0.10)
|
24
|
+
ffi (1.9.3)
|
25
|
+
guard (1.6.2)
|
26
|
+
listen (>= 0.6.0)
|
27
|
+
lumberjack (>= 1.0.2)
|
28
|
+
pry (>= 0.9.10)
|
29
|
+
terminal-table (>= 1.4.3)
|
30
|
+
thor (>= 0.14.6)
|
31
|
+
guard-rspec (2.4.1)
|
32
|
+
guard (>= 1.1)
|
33
|
+
rspec (~> 2.11)
|
34
|
+
i18n (0.6.9)
|
35
|
+
json (1.8.1)
|
36
|
+
listen (1.3.1)
|
37
|
+
rb-fsevent (>= 0.9.3)
|
38
|
+
rb-inotify (>= 0.9)
|
39
|
+
rb-kqueue (>= 0.2)
|
40
|
+
lumberjack (1.0.5)
|
41
|
+
method_source (0.8.2)
|
42
|
+
multipart-post (2.0.0)
|
43
|
+
net-http-persistent (2.9.4)
|
44
|
+
pry (0.9.12.6)
|
45
|
+
coderay (~> 1.0)
|
46
|
+
method_source (~> 0.8)
|
47
|
+
slop (~> 3.4)
|
48
|
+
rake (10.0.4)
|
49
|
+
rb-fsevent (0.9.4)
|
50
|
+
rb-inotify (0.9.4)
|
51
|
+
ffi (>= 0.5.0)
|
52
|
+
rb-kqueue (0.2.2)
|
53
|
+
ffi (>= 0.5.0)
|
54
|
+
rspec (2.14.1)
|
55
|
+
rspec-core (~> 2.14.0)
|
56
|
+
rspec-expectations (~> 2.14.0)
|
57
|
+
rspec-mocks (~> 2.14.0)
|
58
|
+
rspec-core (2.14.8)
|
59
|
+
rspec-expectations (2.14.5)
|
60
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
61
|
+
rspec-mocks (2.14.6)
|
62
|
+
ruby-debug-base19x (0.11.30.pre15)
|
63
|
+
debugger-ruby_core_source (> 0)
|
64
|
+
rake (>= 0.8.1)
|
65
|
+
ruby-debug-ide (0.4.22)
|
66
|
+
rake (>= 0.8.1)
|
67
|
+
safe_yaml (1.0.3)
|
68
|
+
slop (3.5.0)
|
69
|
+
terminal-table (1.4.5)
|
70
|
+
thor (0.19.1)
|
71
|
+
vcr (2.4.0)
|
72
|
+
webmock (1.17.4)
|
73
|
+
addressable (>= 2.2.7)
|
74
|
+
crack (>= 0.3.2)
|
75
|
+
yard (0.8.7.4)
|
76
|
+
|
77
|
+
PLATFORMS
|
78
|
+
ruby
|
79
|
+
|
80
|
+
DEPENDENCIES
|
81
|
+
addressable
|
82
|
+
apruve!
|
83
|
+
bundler (~> 1.5)
|
84
|
+
faker
|
85
|
+
faraday
|
86
|
+
faraday_middleware
|
87
|
+
guard (~> 1.6.2)
|
88
|
+
guard-rspec (~> 2.4.1)
|
89
|
+
json
|
90
|
+
listen (~> 1.3.1)
|
91
|
+
net-http-persistent
|
92
|
+
rake (~> 10.0.3)
|
93
|
+
rspec (~> 2.14.1)
|
94
|
+
ruby-debug-base19x
|
95
|
+
ruby-debug-ide
|
96
|
+
vcr (~> 2.4.0)
|
97
|
+
webmock
|
98
|
+
yard
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Neal Tovsen
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# Apruve
|
2
|
+
|
3
|
+
Apruve helps B2B merchants by making it easier for customers to buy what they need for
|
4
|
+
their jobs. The apruve gem makes it easier for merchants on Ruby-based platforms to
|
5
|
+
integrate Apruve!
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
gem 'apruve'
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install apruve
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
### Create a store on Apruve. Use test.apruve.com for test accounts.
|
24
|
+
|
25
|
+
### Create a PaymentRequest
|
26
|
+
@pr = Apruve::PaymentRequest.new
|
27
|
+
@pr.merchant_id =
|
28
|
+
|
29
|
+
### On your web page, declare apruve.js
|
30
|
+
|
31
|
+
|
32
|
+
3. Load the PaymentRequest and it's hash into apruve.js
|
33
|
+
4. Decide where to put the Apruve button
|
34
|
+
5. Register a call-back function to get the transaction ID back to your server
|
35
|
+
6. Tell Apruve to create a payment against the transaction ID
|
36
|
+
7. Process the webhook from Apruve when payment is received
|
37
|
+
|
38
|
+
## Contributing
|
39
|
+
|
40
|
+
1. Fork it ( http://github.com/apruve/apruve_gem/fork )
|
41
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
42
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
43
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
44
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
require 'bundler/gem_tasks'
|
4
|
+
require 'rspec'
|
5
|
+
|
6
|
+
desc 'Run spec suite'
|
7
|
+
RSpec::Core::RakeTask.new(:spec) do |task|
|
8
|
+
file_list = FileList['spec/**/*_spec.rb']
|
9
|
+
task.pattern = file_list
|
10
|
+
end
|
11
|
+
|
12
|
+
desc 'Default the task to run the spec'
|
13
|
+
task :default => [:spec]
|
data/apruve.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'apruve/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = 'apruve'
|
8
|
+
gem.version = Apruve::VERSION
|
9
|
+
gem.authors = ['Apruve, Inc.', 'Neal Tovsen']
|
10
|
+
gem.email = ['support@apruve.com']
|
11
|
+
gem.summary = 'Helper library for integrating Apruve into a ruby app.'
|
12
|
+
gem.description = 'Easily integrate the Apruve B2B payment network into your ruby-based application.'
|
13
|
+
gem.homepage = 'https://www.apruve.com'
|
14
|
+
gem.license = 'MIT'
|
15
|
+
|
16
|
+
gem.files = `git ls-files -z`.split("\x0")
|
17
|
+
gem.executables = gem.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
19
|
+
gem.require_paths = ['lib']
|
20
|
+
|
21
|
+
gem.add_development_dependency 'bundler', '~> 1.5'
|
22
|
+
gem.add_development_dependency 'rake'
|
23
|
+
|
24
|
+
gem.add_dependency('faraday', ['>= 0.8.6', '<= 0.9.0'])
|
25
|
+
gem.add_dependency('faraday_middleware', '~> 0.9.0')
|
26
|
+
gem.add_dependency('addressable', '~> 2.3.5')
|
27
|
+
end
|
data/lib/apruve.rb
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
# $:.unshift File.join(File.dirname(__FILE__), 'apruve', 'resources')
|
2
|
+
# $:.unshift File.join(File.dirname(__FILE__), 'apruve', 'response')
|
3
|
+
|
4
|
+
require_relative 'apruve/client'
|
5
|
+
require_relative 'apruve/version'
|
6
|
+
require_relative 'apruve/error'
|
7
|
+
require_relative 'apruve/faraday_error_handler'
|
8
|
+
require_relative 'apruve/utils'
|
9
|
+
|
10
|
+
module Apruve
|
11
|
+
|
12
|
+
@client = nil
|
13
|
+
@config = {
|
14
|
+
:scheme => 'http',
|
15
|
+
:host => 'localhost',
|
16
|
+
:port => 3000,
|
17
|
+
:version => 'v3',
|
18
|
+
}
|
19
|
+
|
20
|
+
class << self
|
21
|
+
|
22
|
+
attr_accessor :client
|
23
|
+
attr_accessor :config
|
24
|
+
|
25
|
+
PROD = 'prod'
|
26
|
+
TEST = 'test'
|
27
|
+
LOCAL = 'local'
|
28
|
+
|
29
|
+
def configure(api_key=nil, environment=LOCAL, options={})
|
30
|
+
configure_environment environment
|
31
|
+
@config = @config.merge(options)
|
32
|
+
@client = Apruve::Client.new(api_key, @config)
|
33
|
+
end
|
34
|
+
|
35
|
+
def js(display=nil)
|
36
|
+
display_param = display.nil? ? '' : "?display=#{display}"
|
37
|
+
"<script type=\"text/javascript\" src=\"#{js_url}#{display_param}\"></script>"
|
38
|
+
end
|
39
|
+
|
40
|
+
def button
|
41
|
+
'<div id="apruveDiv"></div>'
|
42
|
+
end
|
43
|
+
|
44
|
+
def default_currency
|
45
|
+
'USD'
|
46
|
+
end
|
47
|
+
|
48
|
+
def get(*args, &block)
|
49
|
+
self.client.get *args
|
50
|
+
end
|
51
|
+
|
52
|
+
def post(*args, &block)
|
53
|
+
self.client.post *args
|
54
|
+
end
|
55
|
+
|
56
|
+
def put(*args, &block)
|
57
|
+
self.client.put *args
|
58
|
+
end
|
59
|
+
|
60
|
+
def unstore(*args, &block)
|
61
|
+
self.client.unstore *args
|
62
|
+
end
|
63
|
+
|
64
|
+
alias_method :delete, :unstore
|
65
|
+
|
66
|
+
# run configure on import so we have a default configuration
|
67
|
+
# that will run without an api-key
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
def configure_environment(env)
|
72
|
+
if env == PROD
|
73
|
+
@config[:scheme] = 'https'
|
74
|
+
@config[:host] = 'www.apruve.com'
|
75
|
+
@config[:port] = 443
|
76
|
+
elsif env == TEST
|
77
|
+
@config[:scheme] = 'https'
|
78
|
+
@config[:host] = 'test.apruve.com'
|
79
|
+
@config[:port] = 443
|
80
|
+
elsif env == LOCAL
|
81
|
+
@config[:scheme] = 'http'
|
82
|
+
@config[:host] = 'localhost'
|
83
|
+
@config[:port] = 3000
|
84
|
+
else
|
85
|
+
raise 'unknown environment'
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def js_url
|
90
|
+
port_param = [443, 80].include?(@config[:port]) ? '' : ":#{@config[:port]}"
|
91
|
+
"#{@config[:scheme]}://#{@config[:host]}#{port_param}/js/apruve.js"
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
configure
|
96
|
+
end
|
97
|
+
|
98
|
+
|
99
|
+
# require all the resources! this is needed at the end because
|
100
|
+
# the module needs to be defined first, as it contains the registry
|
101
|
+
require_relative 'apruve/resources'
|
@@ -0,0 +1,102 @@
|
|
1
|
+
require 'logger'
|
2
|
+
require 'uri'
|
3
|
+
require 'faraday'
|
4
|
+
require 'faraday_middleware'
|
5
|
+
require_relative 'response/apruve_exception_middleware'
|
6
|
+
require_relative 'response/apruve_parse_json'
|
7
|
+
|
8
|
+
module Apruve
|
9
|
+
class Client
|
10
|
+
DEFAULTS = {
|
11
|
+
:scheme => 'http',
|
12
|
+
:host => 'localhost',
|
13
|
+
:port => 3000,
|
14
|
+
:version => 'v3',
|
15
|
+
:logging_level => 'WARN',
|
16
|
+
:connection_timeout => 60,
|
17
|
+
:read_timeout => 60,
|
18
|
+
:logger => nil,
|
19
|
+
:ssl_verify => true,
|
20
|
+
:faraday_adapter => Faraday.default_adapter,
|
21
|
+
:accept_type => 'application/json'
|
22
|
+
}
|
23
|
+
|
24
|
+
# attr_reader :conn
|
25
|
+
attr_accessor :api_key, :config, :conn
|
26
|
+
|
27
|
+
def initialize(api_key, options={})
|
28
|
+
@api_key = api_key.nil? ? api_key : api_key.strip
|
29
|
+
@config = DEFAULTS.merge options
|
30
|
+
build_conn
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
def build_conn
|
35
|
+
if config[:logger]
|
36
|
+
logger = config[:logger]
|
37
|
+
else
|
38
|
+
logger = Logger.new(STDOUT)
|
39
|
+
logger.level = Logger.const_get(config[:logging_level].to_s)
|
40
|
+
config[:logger] = logger
|
41
|
+
end
|
42
|
+
|
43
|
+
Faraday::Response.register_middleware :handle_apruve_errors => lambda { Faraday::Response::RaiseApruveError }
|
44
|
+
Faraday::Response.register_middleware :apruve_json_parser => lambda { FaradayMiddleware::ApruveParseJson }
|
45
|
+
|
46
|
+
options = {
|
47
|
+
:request => {
|
48
|
+
:open_timeout => config[:connection_timeout],
|
49
|
+
:timeout => config[:read_timeout]
|
50
|
+
},
|
51
|
+
:ssl => {
|
52
|
+
:verify => @config[:ssl_verify] # Only set this to false for testing
|
53
|
+
}
|
54
|
+
}
|
55
|
+
@conn = Faraday.new(url, options) do |builder|
|
56
|
+
# Order is kinda important here...
|
57
|
+
builder.response :raise_error # raise exceptions on 40x, 50x responses
|
58
|
+
builder.use Apruve::FaradayErrorHandler
|
59
|
+
builder.request :json
|
60
|
+
builder.response :logger, logger
|
61
|
+
builder.response :handle_apruve_errors
|
62
|
+
builder.response :apruve_json_parser
|
63
|
+
builder.adapter config[:faraday_adapter]
|
64
|
+
end
|
65
|
+
conn.path_prefix = "/api/#{@config[:version]}"
|
66
|
+
conn.headers['User-Agent'] = "apruve-ruby/#{Apruve::VERSION}"
|
67
|
+
conn.headers['Content-Type'] = 'application/json'
|
68
|
+
conn.headers['Accept'] = "#{@config[:accept_type]};revision=#{@config[:version]}"
|
69
|
+
end
|
70
|
+
|
71
|
+
def url
|
72
|
+
builder = (config[:scheme] == 'http') ? URI::HTTP : URI::HTTPS
|
73
|
+
|
74
|
+
builder.build({:host => config[:host],
|
75
|
+
:port => config[:port],
|
76
|
+
:scheme => config[:scheme]})
|
77
|
+
end
|
78
|
+
|
79
|
+
def method_missing(method, *args, &block)
|
80
|
+
if is_http_method? method
|
81
|
+
conn.headers['Apruve-Api-Key'] = @api_key unless @api_key.nil?
|
82
|
+
conn.send method, *args
|
83
|
+
else
|
84
|
+
super method, *args, &block
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
private
|
89
|
+
|
90
|
+
def is_http_method? method
|
91
|
+
[:get, :post, :put, :delete].include? method
|
92
|
+
end
|
93
|
+
|
94
|
+
def respond_to?(method, include_private = false)
|
95
|
+
if is_http_method? method
|
96
|
+
true
|
97
|
+
else
|
98
|
+
super method, include_private
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|