affirm-ruby 0.0.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c4208863e40741f394c027dd416dd1a170ba2b1a
4
+ data.tar.gz: cce5e6bc2320398a1ceb86e25236752a883d7ff6
5
+ SHA512:
6
+ metadata.gz: e96e16fc8fcccae57a39622b4349bf7c1e327ebb01816dca846fd1274719709d39cbc0fbc7d8d6cb6670d9acfd85790ecf5799c00141e6d8ea89647db9efc2ff
7
+ data.tar.gz: 0ca26687b5b56f9340beb1d2bae268a66d955cca443c93742e70a45c7a7ea3dd9a7676fbdff1b3e592758e200ec1b80ea01548498983f1953a8b38e1707d12ef
@@ -0,0 +1,13 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+ *.bundle
10
+ *.so
11
+ *.o
12
+ *.a
13
+ mkmf.log
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.0
4
+ - 2.2.0
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in affirm.gemspec
4
+ gemspec
5
+
6
+ gem "bundler", "~> 1.7"
7
+ gem "rake", "~> 10.0"
8
+ gem "rspec", "~> 3.2.0"
9
+ gem "byebug"
@@ -0,0 +1,60 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ affirm-ruby (0.0.1)
5
+ faraday (~> 0.9.1)
6
+ faraday_middleware (~> 0.9.1)
7
+ virtus (~> 1.0, >= 1.0.0)
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ axiom-types (0.1.1)
13
+ descendants_tracker (~> 0.0.4)
14
+ ice_nine (~> 0.11.0)
15
+ thread_safe (~> 0.3, >= 0.3.1)
16
+ byebug (5.0.0)
17
+ columnize (= 0.9.0)
18
+ coercible (1.0.0)
19
+ descendants_tracker (~> 0.0.1)
20
+ columnize (0.9.0)
21
+ descendants_tracker (0.0.4)
22
+ thread_safe (~> 0.3, >= 0.3.1)
23
+ diff-lcs (1.2.5)
24
+ equalizer (0.0.11)
25
+ faraday (0.9.1)
26
+ multipart-post (>= 1.2, < 3)
27
+ faraday_middleware (0.9.1)
28
+ faraday (>= 0.7.4, < 0.10)
29
+ ice_nine (0.11.1)
30
+ multipart-post (2.0.0)
31
+ rake (10.4.2)
32
+ rspec (3.2.0)
33
+ rspec-core (~> 3.2.0)
34
+ rspec-expectations (~> 3.2.0)
35
+ rspec-mocks (~> 3.2.0)
36
+ rspec-core (3.2.3)
37
+ rspec-support (~> 3.2.0)
38
+ rspec-expectations (3.2.1)
39
+ diff-lcs (>= 1.2.0, < 2.0)
40
+ rspec-support (~> 3.2.0)
41
+ rspec-mocks (3.2.1)
42
+ diff-lcs (>= 1.2.0, < 2.0)
43
+ rspec-support (~> 3.2.0)
44
+ rspec-support (3.2.2)
45
+ thread_safe (0.3.5)
46
+ virtus (1.0.5)
47
+ axiom-types (~> 0.1)
48
+ coercible (~> 1.0)
49
+ descendants_tracker (~> 0.0, >= 0.0.3)
50
+ equalizer (~> 0.0, >= 0.0.9)
51
+
52
+ PLATFORMS
53
+ ruby
54
+
55
+ DEPENDENCIES
56
+ affirm-ruby!
57
+ bundler (~> 1.7)
58
+ byebug
59
+ rake (~> 10.0)
60
+ rspec (~> 3.2.0)
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 Yury Velikanau
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.
@@ -0,0 +1,108 @@
1
+ [![Build Status](https://travis-ci.org/spectator/affirm.svg?branch=master)](http://travis-ci.org/spectator/affirm)
2
+ [![Code Climate](https://codeclimate.com/github/spectator/affirm/badges/gpa.svg)](https://codeclimate.com/github/spectator/affirm)
3
+
4
+ # Affirm
5
+
6
+ Affirm gem is a simple Ruby wrapper for Affirm.com API. Please check Affirm API
7
+ [documentation](http://docs.affirm.com/v2/api/#sandbox-api-keys) for more
8
+ details.
9
+
10
+ ## Installation
11
+
12
+ Add this line to your application's Gemfile:
13
+
14
+ ```ruby
15
+ gem 'affirm'
16
+ ```
17
+
18
+ And then execute:
19
+
20
+ $ bundle
21
+
22
+ Or install it yourself as:
23
+
24
+ $ gem install affirm
25
+
26
+ ## Configuration
27
+
28
+ ```ruby
29
+ Affirm.configure do |config|
30
+ config.public_api_key = "ABC"
31
+ config.private_api_key = "XYZ"
32
+ config.environment = :sandbox # or :production (default if not specified)
33
+ end
34
+ ```
35
+
36
+ ## Usage
37
+
38
+ To authorize a charge `checkout_token` is required. This token gets `POST`ed to
39
+ `user_confirmation_url` that is setup in Checkout JavaScript object.
40
+
41
+ ```ruby
42
+ Affirm::Charge.authorize(checkout_token)
43
+ ```
44
+
45
+ The rest of the API uses `charge_id` which is received as `id` after charge is
46
+ authorized.
47
+
48
+ #### Read charge
49
+
50
+ ```ruby
51
+ Affirm::Charge.find("TEST-AL04-UVGR")
52
+ ```
53
+
54
+ #### Capture charge
55
+
56
+ ```ruby
57
+ Affirm::Charge.capture("TEST-ALO4-UVGR")
58
+ ```
59
+
60
+ #### Void charge
61
+
62
+ ```ruby
63
+ Affirm::Charge.void("TEST-ALO4-UVGR")
64
+ ```
65
+
66
+ #### Refund charge
67
+
68
+ ```ruby
69
+ Affirm::Charge.refund("TEST-ALO4-UVGR", amount: 500)
70
+ ```
71
+
72
+ #### Update charge
73
+
74
+ ```ruby
75
+ Affirm::Charge.update("TEST-ALO4-UVGR",
76
+ order_id: "CUSTOM_ORDER_ID",
77
+ shipping_carrier: "USPS",
78
+ shipping_confirmation: "1Z23223"
79
+ )
80
+ ```
81
+
82
+ Failed response will return [error
83
+ object](http://docs.affirm.com/v2/api/errors/#error-object) as a plain ruby
84
+ object with values coerced in corresponding types.
85
+
86
+ The same will happen for all successful responses described (not in full) in
87
+ [server integration](http://docs.affirm.com/v2/api/charges/#authentication)
88
+ guide.
89
+
90
+ #### Example
91
+
92
+ ```ruby
93
+ response = Affirm::Charge.authorize(checkout_token)
94
+ if response.success?
95
+ charge_id = response.id
96
+ # save charge_id
97
+ else
98
+ puts response.error.message
99
+ end
100
+ ```
101
+
102
+ ## Contributing
103
+
104
+ 1. Fork it ( https://github.com/spectator/affirm/fork )
105
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
106
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
107
+ 4. Push to the branch (`git push origin my-new-feature`)
108
+ 5. Create a new Pull Request
@@ -0,0 +1,19 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ desc "Run specs"
5
+ RSpec::Core::RakeTask.new("spec") do |task|
6
+ task.verbose = false
7
+ end
8
+
9
+ desc "Console"
10
+ task :console do
11
+ require "irb"
12
+ require "irb/completion"
13
+ require "affirm"
14
+ require "byebug"
15
+ ARGV.clear
16
+ IRB.start
17
+ end
18
+
19
+ task default: :spec
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'affirm/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "affirm-ruby"
8
+ spec.version = Affirm::VERSION
9
+ spec.authors = ["Yury Velikanau", "Igor Pstyga"]
10
+ spec.email = ["yury.velikanau@gmail.com"]
11
+ spec.summary = %q{Ruby wrapper for Affirm.com API}
12
+ spec.description = %q{Ruby client library for Affirm.com API}
13
+ spec.homepage = "https://github.com/spectator/affirm"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.required_ruby_version = "~> 2.1"
22
+ spec.add_dependency "faraday", "~> 0.9.1"
23
+ spec.add_dependency "faraday_middleware", "~> 0.9.1"
24
+ spec.add_dependency "virtus", "~> 1.0", ">= 1.0.0"
25
+ end
@@ -0,0 +1,27 @@
1
+ require "forwardable"
2
+
3
+ require "faraday"
4
+ require "faraday_middleware"
5
+ require "virtus"
6
+
7
+ require "affirm/client"
8
+ require "affirm/charge"
9
+ require "affirm/configuration"
10
+ require "affirm/success_result"
11
+ require "affirm/failure_result"
12
+ require "affirm/objects/event"
13
+ require "affirm/objects/contact"
14
+ require "affirm/objects/address"
15
+ require "affirm/objects/billing"
16
+ require "affirm/objects/shipping"
17
+ require "affirm/objects/discount"
18
+ require "affirm/objects/item"
19
+ require "affirm/objects/order"
20
+ require "affirm/responses/auth"
21
+ require "affirm/responses/capture"
22
+ require "affirm/responses/void"
23
+ require "affirm/responses/refund"
24
+ require "affirm/responses/update"
25
+ require "affirm/responses/error"
26
+
27
+ require "affirm/version"
@@ -0,0 +1,45 @@
1
+ module Affirm
2
+ module Charge
3
+ extend self
4
+
5
+ def authorize(token)
6
+ respond Client.request(:post, "charges", checkout_token: token)
7
+ end
8
+
9
+ def find(charge_id)
10
+ respond Client.request(:get, "charges/#{charge_id}")
11
+ end
12
+
13
+ def capture(charge_id)
14
+ respond Client.request(:post, "charges/#{charge_id}/capture")
15
+ end
16
+
17
+ def void(charge_id)
18
+ respond Client.request(:post, "charges/#{charge_id}/void")
19
+ end
20
+
21
+ def refund(charge_id, amount:)
22
+ respond Client.request(:post, "charges/#{charge_id}/refund", amount: amount)
23
+ end
24
+
25
+ def update(charge_id, **updates)
26
+ respond Client.request(:post, "charges/#{charge_id}/update", updates)
27
+ end
28
+
29
+ private
30
+
31
+ def respond(response)
32
+ return FailureResult.new(response) unless response.success?
33
+
34
+ type = response.body["type"]
35
+ klass = case type
36
+ when *%w(capture void refund update)
37
+ Object.const_get("Affirm::Responses::#{type.capitalize}")
38
+ else
39
+ Affirm::Responses::Auth
40
+ end
41
+
42
+ SuccessResult.new(klass.new(response.body))
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,50 @@
1
+ module Affirm
2
+ class Client
3
+ attr_reader :connection
4
+
5
+ attr_reader :url_prefix
6
+ private :url_prefix
7
+
8
+ class << self
9
+ def request(method, path, **data)
10
+ new.public_send(method, path, data)
11
+ end
12
+ end
13
+
14
+ def initialize
15
+ @url_prefix = "/api/v2"
16
+ @connection = Faraday.new(Affirm.configuration.endpoint) do |conn|
17
+ conn.basic_auth(basic_auth_user, basic_auth_password)
18
+ conn.request :json
19
+ conn.response :json, content_type: /\bjson$/
20
+ conn.adapter Faraday.default_adapter
21
+ end
22
+ end
23
+
24
+ def get(path, **data)
25
+ connection.get(normalized_path(path), data)
26
+ end
27
+
28
+ def post(path, **data)
29
+ connection.post(normalized_path(path), data)
30
+ end
31
+
32
+ private
33
+
34
+ def basic_auth_user
35
+ Affirm.configuration.public_api_key
36
+ end
37
+
38
+ def basic_auth_password
39
+ Affirm.configuration.private_api_key
40
+ end
41
+
42
+ def normalized_path(path)
43
+ url_prefix + normalize_path(path)
44
+ end
45
+
46
+ def normalize_path(path)
47
+ Faraday::Utils.normalize_path(path)
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,34 @@
1
+ module Affirm
2
+ class Configuration
3
+ attr_accessor :public_api_key
4
+ attr_accessor :private_api_key
5
+ attr_accessor :environment
6
+
7
+ ENDPOINTS = {
8
+ production: "api.affirm.com",
9
+ sandbox: "sandbox.affirm.com"
10
+ }
11
+
12
+ def initialize
13
+ @environment = :production
14
+ end
15
+
16
+ def endpoint
17
+ "https://#{ENDPOINTS[environment]}"
18
+ end
19
+ end
20
+
21
+ class << self
22
+ def configuration
23
+ @configuration ||= Configuration.new
24
+ end
25
+
26
+ def configuration=(config)
27
+ @configuration = config
28
+ end
29
+
30
+ def configure
31
+ yield configuration
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,16 @@
1
+ module Affirm
2
+ class FailureResult
3
+ extend Forwardable
4
+ def_delegators :response, :status, :success?
5
+
6
+ attr_reader :error
7
+
8
+ attr_reader :response
9
+ private :response
10
+
11
+ def initialize(response)
12
+ @response = response
13
+ @error = Affirm::Responses::Error.new(response.body)
14
+ end
15
+ end
16
+ end