justifi 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Justifi
4
+ module PaymentIntent
5
+ class << self
6
+ def list(params: {}, headers: {}, seller_account_id: nil)
7
+ headers[:seller_account] = seller_account_id if seller_account_id
8
+ JustifiOperations.execute_get_request("/v1/payment_intents", params, headers)
9
+ end
10
+
11
+ def list_payments(id:, params: {}, headers: {}, seller_account_id: nil)
12
+ headers[:seller_account] = seller_account_id if seller_account_id
13
+ JustifiOperations.execute_get_request("/v1/payment_intents/#{id}/payments", params, headers)
14
+ end
15
+
16
+ def get(id:, headers: {})
17
+ JustifiOperations.execute_get_request("/v1/payment_intents/#{id}",
18
+ {},
19
+ headers)
20
+ end
21
+
22
+ def update(id:, params: {}, headers: {}, idempotency_key: nil)
23
+ JustifiOperations.idempotently_request("/v1/payment_intents/#{id}",
24
+ method: :patch,
25
+ params: params,
26
+ headers: headers,
27
+ idempotency_key: idempotency_key)
28
+ end
29
+
30
+ def create(params: {}, headers: {}, idempotency_key: nil, seller_account_id: nil)
31
+ headers[:seller_account] = seller_account_id if seller_account_id
32
+ JustifiOperations.idempotently_request("/v1/payment_intents",
33
+ method: :post,
34
+ params: params,
35
+ headers: headers,
36
+ idempotency_key: idempotency_key)
37
+ end
38
+
39
+ def capture(id:, params:, headers: {}, idempotency_key: nil)
40
+ JustifiOperations.idempotently_request("/v1/payment_intents/#{id}/capture",
41
+ method: :post,
42
+ params: params,
43
+ headers: headers,
44
+ idempotency_key: idempotency_key)
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Justifi
4
+ module PaymentMethod
5
+ class << self
6
+ def create(params: {}, headers: {}, idempotency_key: nil, seller_account_id: nil)
7
+ headers[:seller_account] = seller_account_id if seller_account_id
8
+ JustifiOperations.idempotently_request("/v1/payment_methods",
9
+ method: :post,
10
+ params: params,
11
+ headers: headers,
12
+ idempotency_key: idempotency_key)
13
+ end
14
+
15
+ def list(params: {}, headers: {}, seller_account_id: nil)
16
+ headers[:seller_account] = seller_account_id if seller_account_id
17
+ JustifiOperations.list("/v1/payment_methods", params, headers)
18
+ end
19
+
20
+ def get(token:, headers: {})
21
+ JustifiOperations.execute_get_request("/v1/payment_methods/#{token}",
22
+ {},
23
+ headers)
24
+ end
25
+
26
+ def update(token:, card_params:, headers: {})
27
+ JustifiOperations.idempotently_request("/v1/payment_methods/#{token}",
28
+ method: :patch,
29
+ params: card_params,
30
+ headers: {})
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Justifi
4
+ module Payout
5
+ class << self
6
+ def list(params: {}, headers: {}, seller_account_id: nil)
7
+ headers[:seller_account] = seller_account_id if seller_account_id
8
+ JustifiOperations.execute_get_request("/v1/payouts", params, headers)
9
+ end
10
+
11
+ def get(payout_id:, headers: {})
12
+ JustifiOperations.execute_get_request("/v1/payouts/#{payout_id}",
13
+ {},
14
+ headers)
15
+ end
16
+
17
+ def update(payout_id:, params: {}, headers: {}, idempotency_key: nil)
18
+ JustifiOperations.idempotently_request("/v1/payouts/#{payout_id}",
19
+ method: :patch,
20
+ params: params,
21
+ headers: {})
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Justifi
4
+ module Refund
5
+ class << self
6
+ def list(params: {}, headers: {}, seller_account_id: nil)
7
+ headers[:seller_account] = seller_account_id if seller_account_id
8
+ JustifiOperations.execute_get_request("/v1/refunds", params, headers)
9
+ end
10
+
11
+ def get(refund_id:, headers: {})
12
+ JustifiOperations.execute_get_request("/v1/refunds/#{refund_id}",
13
+ {},
14
+ headers)
15
+ end
16
+
17
+ def update(refund_id:, params: {}, headers: {}, idempotency_key: nil)
18
+ JustifiOperations.idempotently_request("/v1/refunds/#{refund_id}",
19
+ method: :patch,
20
+ params: params,
21
+ headers: {})
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+ require "cgi"
5
+
6
+ module Justifi
7
+ module Util
8
+ def self.normalize_params(params)
9
+ case params
10
+ when Hash
11
+ params.dup.to_json
12
+ else
13
+ raise TypeError, "normalize_params expects a hash"
14
+ end
15
+ end
16
+
17
+ # Normalizes header keys so that they're all lower case and each
18
+ # hyphen-delimited section starts with a single capitalized letter. For
19
+ # example, `request-id` becomes `Request-Id`. This is useful for extracting
20
+ # certain key values when the user could have set them with a variety of
21
+ # diffent naming schemes.
22
+ def self.normalize_headers(headers)
23
+ headers.each_with_object({}) do |(k, v), new_headers|
24
+ k = k.to_s.tr("_", "-") if k.is_a?(Symbol)
25
+ k = k.split("-").reject(&:empty?).map(&:capitalize).join("-")
26
+
27
+ new_headers[k] = v
28
+ end
29
+ end
30
+
31
+ # Encodes a hash of parameters in a way that's suitable for use as query
32
+ # parameters in a URI.
33
+ def self.encode_parameters(params)
34
+ Util.flatten_params(params)
35
+ .map { |k, v| "#{url_encode(k)}=#{url_encode(v)}" }.join("&")
36
+ end
37
+
38
+ # Encodes a string in a way that makes it suitable for use in a set of
39
+ # query parameters in a URI or in a set of form parameters in a request
40
+ # body.
41
+ def self.url_encode(key)
42
+ CGI.escape(key.to_s).
43
+ # Don't use strict form encoding by changing the square bracket control
44
+ # characters back to their literals. This is fine by the server, and
45
+ # makes these parameter strings easier to read.
46
+ gsub("%5B", "[").gsub("%5D", "]")
47
+ end
48
+
49
+ def self.flatten_params(params, parent_key = nil)
50
+ result = []
51
+
52
+ # do not sort the final output because arrays (and arrays of hashes
53
+ # especially) can be order sensitive, but do sort incoming parameters
54
+ params.each do |key, value|
55
+ calculated_key = parent_key ? "#{parent_key}[#{key}]" : key.to_s
56
+ if value.is_a?(Hash)
57
+ result += flatten_params(value, calculated_key)
58
+ elsif value.is_a?(Array)
59
+ result += flatten_params_array(value, calculated_key)
60
+ else
61
+ result << [calculated_key, value]
62
+ end
63
+ end
64
+
65
+ result
66
+ end
67
+
68
+ def self.flatten_params_array(value, calculated_key)
69
+ result = []
70
+ value.each_with_index do |elem, i|
71
+ if elem.is_a?(Hash)
72
+ result += flatten_params(elem, "#{calculated_key}[#{i}]")
73
+ elsif elem.is_a?(Array)
74
+ result += flatten_params_array(elem, calculated_key)
75
+ else
76
+ result << ["#{calculated_key}[#{i}]", elem]
77
+ end
78
+ end
79
+ result
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Justifi
4
+ VERSION = "0.5.0"
5
+ end
data/lib/justifi.rb ADDED
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "justifi/api_operations"
4
+
5
+ require "justifi/util"
6
+ require "justifi/justifi_response"
7
+ require "justifi/justifi_operations"
8
+ require "justifi/justifi_object"
9
+ require "justifi/list_object"
10
+ require "justifi/justifi_error"
11
+
12
+ require "justifi/version"
13
+ require "justifi/configuration"
14
+ require "justifi/oauth"
15
+ require "justifi/payment"
16
+ require "justifi/refund"
17
+ require "justifi/payout"
18
+ require "justifi/dispute"
19
+ require "justifi/payment_method"
20
+ require "justifi/payment_intent"
21
+ require "justifi/in_memory_cache"
22
+
23
+ module Justifi
24
+ @config = Justifi::Configuration.setup
25
+ @cache = Justifi::InMemoryCache.new
26
+
27
+ REFUND_REASONS = %w[duplicate fraudulent customer_request]
28
+
29
+ class << self
30
+ extend Forwardable
31
+
32
+ attr_reader :config, :cache
33
+
34
+ def_delegators :@config, :client_id=, :client_id
35
+ def_delegators :@config, :client_secret=, :client_secret
36
+ def_delegators :@config, :access_token=, :access_token
37
+ def_delegators :@config, :credentials, :credentials
38
+ def_delegators :@config, :credentials=, :credentials=
39
+ def_delegators :@config, :max_attempts=, :max_attempts
40
+ def_delegators :@config, :max_attempts, :max_attempts
41
+ def_delegators :@config, :clear_credentials, :clear_credentials
42
+ def_delegators :@config, :environment=, :environment
43
+ def_delegators :@config, :use_staging, :use_staging
44
+ def_delegators :@config, :use_production, :use_production
45
+ def_delegators :@config, :api_url, :api_url
46
+
47
+ def_delegators :@cache, :clear_cache, :clear_cache
48
+
49
+ def clear
50
+ Justifi.clear_cache
51
+ Justifi.clear_credentials
52
+ end
53
+
54
+ def setup(client_id:, client_secret:, environment: "production")
55
+ @config = Justifi::Configuration.setup { |config|
56
+ config.client_id = client_id
57
+ config.client_secret = client_secret
58
+ config.environment = environment
59
+ }
60
+ end
61
+
62
+ def token
63
+ Justifi.cache.get(:access_token)
64
+ end
65
+
66
+ def get_idempotency_key
67
+ SecureRandom.uuid
68
+ end
69
+ end
70
+
71
+ class BadCredentialsError < StandardError; end
72
+ end
metadata ADDED
@@ -0,0 +1,206 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: justifi
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.0
5
+ platform: ruby
6
+ authors:
7
+ - JustiFi
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2022-04-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: byebug
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: dotenv
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rubocop
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: standard
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: webmock
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: 3.8.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 3.8.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '13.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '13.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '3.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '3.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: simplecov
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: simplecov-small-badge
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ description: Used to communicate with JustiFi APIs
140
+ email:
141
+ - support@justifi.ai
142
+ executables: []
143
+ extensions: []
144
+ extra_rdoc_files: []
145
+ files:
146
+ - ".env.template"
147
+ - ".github/PULL_REQUEST_TEMPLATE.md"
148
+ - ".github/workflows/build_and_release.yml"
149
+ - ".github/workflows/publish_coverage.yml"
150
+ - ".github/workflows/verify.yml"
151
+ - ".gitignore"
152
+ - ".rspec"
153
+ - ".rubocop.yml"
154
+ - CODE_OF_CONDUCT.md
155
+ - Gemfile
156
+ - Gemfile.lock
157
+ - README.md
158
+ - Rakefile
159
+ - bin/console
160
+ - bin/setup
161
+ - justifi.gemspec
162
+ - lib/justifi.rb
163
+ - lib/justifi/api_operations.rb
164
+ - lib/justifi/configuration.rb
165
+ - lib/justifi/dispute.rb
166
+ - lib/justifi/in_memory_cache.rb
167
+ - lib/justifi/justifi_error.rb
168
+ - lib/justifi/justifi_object.rb
169
+ - lib/justifi/justifi_operations.rb
170
+ - lib/justifi/justifi_response.rb
171
+ - lib/justifi/list_object.rb
172
+ - lib/justifi/oauth.rb
173
+ - lib/justifi/payment.rb
174
+ - lib/justifi/payment_intent.rb
175
+ - lib/justifi/payment_method.rb
176
+ - lib/justifi/payout.rb
177
+ - lib/justifi/refund.rb
178
+ - lib/justifi/util.rb
179
+ - lib/justifi/version.rb
180
+ homepage: https://justifi.ai
181
+ licenses: []
182
+ metadata:
183
+ homepage_uri: https://justifi.ai
184
+ source_code_uri: https://github.com/justifi-tech/justifi-ruby
185
+ github_repo: ssh://github.com/justifi-tech/justifi-ruby
186
+ changelog_uri: https://github.com/justifi-tech/justifi-ruby/changelog
187
+ post_install_message:
188
+ rdoc_options: []
189
+ require_paths:
190
+ - lib
191
+ required_ruby_version: !ruby/object:Gem::Requirement
192
+ requirements:
193
+ - - ">="
194
+ - !ruby/object:Gem::Version
195
+ version: '2.4'
196
+ required_rubygems_version: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - ">="
199
+ - !ruby/object:Gem::Version
200
+ version: '0'
201
+ requirements: []
202
+ rubygems_version: 3.2.32
203
+ signing_key:
204
+ specification_version: 4
205
+ summary: JustiFi API wrapper gem
206
+ test_files: []