pr-pin 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e52cacf6c475aff3f5bce1ae540a40311d62907bb7384b797a63daa8e064434d
4
- data.tar.gz: 8f45f062ed9148fb0a8c3e85b6d8ce3b3176193404b2479d4fc3404421457b48
3
+ metadata.gz: 915ba4a1b62cee7806b8e50335d40bc7b5ae6ad5f3feb54147eef6112d3a46a2
4
+ data.tar.gz: cb6e578f737a1102a284e9f6cb18bc2be0ec119c9dcad5287506529a413c0a11
5
5
  SHA512:
6
- metadata.gz: 7647fc611ae51dd161fa406344f7fed7dca217aba9779e01ef06287f556a1f9ac2a29a5163183bd8dd8421c471ee06f123e1fe3121b8aec3b49061e8b88c72a2
7
- data.tar.gz: b6a18bd913ec606128be3a7db21dddc3a42d62bd4cc24cfaec6a2158670811bb4d27eb2955353ea09b026a64f7e0afe04a64eb1243825cc77446d1a597571bee
6
+ metadata.gz: 1b4e1ca34d765ae2d152e58c37495940a00335cbd4b18dea237e9a0c9a310497733a2604d98d9b0bc65a530862dcb4a88b5f1fdf0f9e805227b5f7e12c484c25
7
+ data.tar.gz: 1d415283974aecc4a07cce0b69c5757c359dab4665a091b5a6bad9a3507897c0c36e3a282ca705c300b212dd95c0a8d0a92a1837282331db13362aa2b686ed53
data/README.md CHANGED
@@ -114,7 +114,7 @@ Coverage of https://pinpayments.com/developers/api-reference
114
114
  | Charges | POST /charges | Creates a new charge | [:link:](https://pinpayments.com/developers/api-reference/charges#post-charges) | :heavy_check_mark: |
115
115
  | Charges | PUT /charges/charge-token/capture | Captures a previously authorised charge | [:link:](https://pinpayments.com/developers/api-reference/charges#put-charges) | :x: |
116
116
  | Charges | GET /charges | Returns a paginated list of all charges | [:link:](https://pinpayments.com/developers/api-reference/charges#get-charges) | :heavy_check_mark: |
117
- | Charges | GET /charges/search | Returns a paginated list of charges matching the search criteria | [:link:](https://pinpayments.com/developers/api-reference/charges#search-charges) | :x: |
117
+ | Charges | GET /charges/search | Returns a paginated list of charges matching the search criteria | [:link:](https://pinpayments.com/developers/api-reference/charges#search-charges) | :heavy_check_mark: |
118
118
  | Charges | GET /charges/charge-token | Returns the details of a charge | [:link:](https://pinpayments.com/developers/api-reference/charges#get-charge) | :x: |
119
119
  | Customers | POST /customers | Creates a new customer | [:link:](https://pinpayments.com/developers/api-reference/customers#post-customers) | :heavy_check_mark: |
120
120
  | Customers | GET /customers | Returns a paginated list of all customers | [:link:](https://pinpayments.com/developers/api-reference/customers#get-customers) | :heavy_check_mark: |
@@ -1,3 +1,4 @@
1
+ require 'concurrent'
1
2
  require 'dry-container'
2
3
  require 'pr/pin/version'
3
4
  require 'pr/pin/adapter'
@@ -13,7 +14,7 @@ module PR
13
14
  extend Dry::Container::Mixin
14
15
 
15
16
  register(:environments, memoize: true) do
16
- Concurrent::Hash.new
17
+ {}
17
18
  end
18
19
 
19
20
  register(:default_error_handler) { |error| error }
@@ -2,8 +2,8 @@ module PR
2
2
  module Pin
3
3
  module Adapter
4
4
  class Dataset < ROM::HTTP::Dataset
5
- config.default_request_handler = Handlers::JSONRequest
6
- config.default_response_handler = Handlers::JSONResponse
5
+ config.default_request_handler = Handlers::JSONRequest.new
6
+ config.default_response_handler = Handlers::JSONResponse.new
7
7
 
8
8
  option :secret_key, type: ROM::Types::Strict::String
9
9
  option :error_handler
@@ -3,41 +3,32 @@ module PR
3
3
  module Adapter
4
4
  class Handlers
5
5
  class JSONRequest
6
- class << self
7
- def client(host, port)
8
- clients["#{host}:#{port}"] ||= Net::HTTP.new(
9
- host,
10
- port
11
- ).tap do |client|
6
+ SSL_PORT = 443
7
+
8
+ def call(dataset)
9
+ uri = dataset.uri
10
+
11
+ http = Net::HTTP.new(uri.host, uri.port).tap do |client|
12
+ if SSL_PORT == client.port
12
13
  client.use_ssl = true
13
14
  client.verify_mode = OpenSSL::SSL::VERIFY_PEER
14
15
  end
15
16
  end
16
17
 
17
- def call(dataset)
18
- uri = dataset.uri
18
+ request_class = Net::HTTP.const_get(
19
+ PR::Pin::Inflector.classify(dataset.request_method)
20
+ )
19
21
 
20
- request_class = Net::HTTP.const_get(
21
- PR::Pin::Inflector.classify(dataset.request_method)
22
- )
22
+ request = request_class.new(uri.request_uri)
23
+ request.basic_auth(dataset.secret_key, '')
23
24
 
24
- request = request_class.new(uri.request_uri)
25
- request.basic_auth(dataset.secret_key, '')
26
-
27
- dataset.headers.each_with_object(request) do |(header, value), request|
28
- request[header.to_s] = value
29
- end
30
-
31
- request.body = dataset.params.to_json if dataset.params.any?
32
-
33
- client(uri.host, uri.port).request(request)
25
+ dataset.headers.each_with_object(request) do |(header, value), request|
26
+ request[header.to_s] = value
34
27
  end
35
28
 
36
- private
29
+ request.body = dataset.params.to_json if dataset.params.any?
37
30
 
38
- def clients
39
- @clients ||= Concurrent::Hash.new
40
- end
31
+ http.request(request)
41
32
  end
42
33
  end
43
34
  end
@@ -5,11 +5,12 @@ module PR
5
5
  class JSONResponse
6
6
  SUCCESS_CODES = %w(200 201).freeze
7
7
 
8
- def self.call(response, dataset)
8
+ def call(response, dataset)
9
9
  result = JSON.parse(
10
10
  response.body,
11
11
  symbolize_names: true
12
12
  )
13
+
13
14
  pagination_result = result.fetch(:pagination, false)
14
15
 
15
16
  if SUCCESS_CODES.include?(response.code)
@@ -0,0 +1,39 @@
1
+ module PR
2
+ module Pin
3
+ module API
4
+ class PaginatedResult < Result
5
+ def each_page(&_block)
6
+ return enum_for(:each_page) unless block_given?
7
+
8
+ page = self
9
+
10
+ loop do
11
+ yield(page)
12
+
13
+ break unless page.next_page
14
+
15
+ relation = __relation__.add_params(page: page.next_page)
16
+ page = self.class.wrap(relation) { relation.paginate }
17
+ end
18
+ end
19
+
20
+ def pages
21
+ page = self
22
+
23
+ return [page] unless page.next_page
24
+
25
+ to_fetch = page.next_page..page.total_pages
26
+
27
+ remaining_pages = to_fetch.map do |page_num|
28
+ Concurrent::Promises.future do
29
+ relation = __relation__.add_params(page: page_num)
30
+ self.class.wrap(relation) { relation.paginate }
31
+ end
32
+ end
33
+
34
+ [page, *remaining_pages.map(&:value!)]
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -2,12 +2,20 @@ module PR
2
2
  module Pin
3
3
  module API
4
4
  class Result < SimpleDelegator
5
+ attr_reader :__relation__
6
+ private :__relation__
7
+
5
8
  def self.wrap(relation, &block)
6
- new(block.call)
9
+ new(block.call, relation)
7
10
  rescue PR::Pin::Adapter::ResponseError => error
8
11
  relation.dataset.error_handler.(Error.new(error))
9
12
  end
10
13
 
14
+ def initialize(result, relation)
15
+ @__relation__ = relation
16
+ super(result)
17
+ end
18
+
11
19
  def success?
12
20
  true
13
21
  end
@@ -16,8 +16,8 @@ module PR
16
16
  attribute :card, Types::JSON::Hash
17
17
  attribute :transfer, Types::Array.of(Types::JSON::Hash)
18
18
  attribute :amount_refunded, Types::Strict::Integer
19
- attribute :total_fees, Types::Strict::Integer
20
- attribute :merchant_entitlement, Types::Strict::Integer
19
+ attribute :total_fees, Types::Strict::Integer.optional
20
+ attribute :merchant_entitlement, Types::Strict::Integer.optional
21
21
  attribute :refund_pending, Types::Strict::Bool
22
22
  attribute :authorisation_expired, Types::Strict::Bool
23
23
  attribute :captured, Types::Strict::Bool
@@ -1,6 +1,7 @@
1
1
  require 'rom-repository'
2
2
  require 'pr/pin/api/error'
3
3
  require 'pr/pin/api/result'
4
+ require 'pr/pin/api/paginated_result'
4
5
  require 'pr/pin/struct'
5
6
  require 'pr/pin/repositories/concerns/common'
6
7
  require 'pr/pin/repositories/charges'
@@ -3,6 +3,14 @@ module PR
3
3
  module Repositories
4
4
  class Charges < ROM::Repository[:charges]
5
5
  include Concerns::Common
6
+
7
+ def search(**params)
8
+ relation = root.append_path('search').with_params(params)
9
+
10
+ API::PaginatedResult.wrap(relation) do
11
+ relation.paginate
12
+ end
13
+ end
6
14
  end
7
15
  end
8
16
  end
@@ -14,12 +14,12 @@ module PR
14
14
  end
15
15
 
16
16
  def list(page: 1, per_page: nil)
17
- API::Result.wrap(root) do
18
- root.with_params(
19
- page: page,
20
- per_page: per_page
21
- ).paginate
22
- end
17
+ relation = root.with_params(
18
+ page: page,
19
+ per_page: per_page
20
+ )
21
+
22
+ API::PaginatedResult.wrap(relation) { relation.paginate }
23
23
  end
24
24
  end
25
25
  end
@@ -1,5 +1,5 @@
1
1
  module PR
2
2
  module Pin
3
- VERSION = '0.2.0'.freeze
3
+ VERSION = '0.3.0'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pr-pin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - AMHOL
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-11-20 00:00:00.000000000 Z
11
+ date: 2020-02-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.17'
19
+ version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.17'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: concurrent-ruby
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: dry-container
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -172,6 +186,7 @@ files:
172
186
  - lib/pr/pin/adapter/relation.rb
173
187
  - lib/pr/pin/adapter/response.rb
174
188
  - lib/pr/pin/api/error.rb
189
+ - lib/pr/pin/api/paginated_result.rb
175
190
  - lib/pr/pin/api/result.rb
176
191
  - lib/pr/pin/error.rb
177
192
  - lib/pr/pin/inflector.rb
@@ -210,7 +225,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
210
225
  - !ruby/object:Gem::Version
211
226
  version: '0'
212
227
  requirements: []
213
- rubygems_version: 3.0.3
228
+ rubygems_version: 3.1.2
214
229
  signing_key:
215
230
  specification_version: 4
216
231
  summary: Pin Payments API wrapper inplemented using rom-rb HTTP adapter.