pr-pin 0.2.0 → 0.3.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.
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.