genesis_ruby 0.1.0 → 0.1.2
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 +4 -4
- data/CHANGELOG.md +27 -0
- data/Gemfile.lock +24 -25
- data/README.md +401 -2
- data/VERSION +1 -1
- data/genesis_ruby.gemspec +7 -4
- data/lib/genesis_ruby/api/constants/date_time_formats.rb +1 -1
- data/lib/genesis_ruby/api/constants/transactions/parameters/refund/bank_account_types.rb +27 -0
- data/lib/genesis_ruby/api/notification.rb +156 -0
- data/lib/genesis_ruby/api/requests/base/financials/credit_card.rb +0 -2
- data/lib/genesis_ruby/api/requests/base/reference.rb +29 -0
- data/lib/genesis_ruby/api/requests/financial/capture.rb +30 -0
- data/lib/genesis_ruby/api/requests/financial/cards/threeds/v2/method_continue.rb +145 -0
- data/lib/genesis_ruby/api/requests/financial/refund.rb +48 -0
- data/lib/genesis_ruby/api/requests/financial/void.rb +28 -0
- data/lib/genesis_ruby/api/requests/non_financial/reconcile/date_range.rb +95 -0
- data/lib/genesis_ruby/api/requests/non_financial/reconcile/transaction.rb +37 -0
- data/lib/genesis_ruby/api/requests/wpf/reconcile.rb +33 -0
- data/lib/genesis_ruby/api/response.rb +6 -5
- data/lib/genesis_ruby/builder.rb +3 -2
- data/lib/genesis_ruby/builders/form.rb +44 -0
- data/lib/genesis_ruby/dependencies.rb +8 -0
- data/lib/genesis_ruby/network/adapter/base_adapter.rb +10 -0
- data/lib/genesis_ruby/network/adapter/net_http_adapter.rb +30 -8
- data/lib/genesis_ruby/network/base_network.rb +16 -0
- data/lib/genesis_ruby/network/net_http.rb +5 -0
- data/lib/genesis_ruby/utils/common.rb +8 -1
- data/lib/genesis_ruby/utils/options/api_config.rb +15 -12
- data/lib/genesis_ruby/utils/options/network_adapter_config.rb +3 -4
- data/lib/genesis_ruby/utils/threeds/v2.rb +21 -0
- data/lib/genesis_ruby/version.rb +1 -1
- data/lib/genesis_ruby.rb +5 -2
- metadata +20 -7
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'genesis_ruby/builders/base'
|
2
|
+
require 'uri'
|
3
|
+
|
4
|
+
module GenesisRuby
|
5
|
+
module Builders
|
6
|
+
# XML, Nokogiri Builder Implementation
|
7
|
+
class Form < Base
|
8
|
+
|
9
|
+
# Initialize Nokogiri XML Builder
|
10
|
+
def initialize
|
11
|
+
@builder = URI
|
12
|
+
super
|
13
|
+
end
|
14
|
+
|
15
|
+
# Generated HTTP Query Document
|
16
|
+
def output
|
17
|
+
document
|
18
|
+
end
|
19
|
+
|
20
|
+
def populate_nodes(structure)
|
21
|
+
self.document = @builder.encode_www_form(transform_structure(structure))
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
attr_accessor :buffer, :document
|
27
|
+
|
28
|
+
# Transform structure from hash to array
|
29
|
+
# { key: 'value' } -> [[key, value]]
|
30
|
+
def transform_structure(structure)
|
31
|
+
self.buffer = []
|
32
|
+
structure.each { |key, value| add_buffer [key, value] }
|
33
|
+
|
34
|
+
buffer
|
35
|
+
end
|
36
|
+
|
37
|
+
# Fill up parameters
|
38
|
+
def add_buffer(value)
|
39
|
+
@buffer.push(value)
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -12,6 +12,14 @@ require 'genesis_ruby/api/mixins/requests/restricted_setter'
|
|
12
12
|
# Load API Attributes
|
13
13
|
Dir["#{File.dirname(__FILE__)}/api/mixins/**/*_attributes.rb"].sort.each { |file| require file }
|
14
14
|
|
15
|
+
# =================================
|
16
|
+
# Transaction Requests Bases
|
17
|
+
# =================================
|
18
|
+
require 'genesis_ruby/api/requests/base/financial'
|
19
|
+
require 'genesis_ruby/api/requests/base/financials/credit_card'
|
20
|
+
require 'genesis_ruby/api/requests/base/reference'
|
21
|
+
require 'genesis_ruby/api/notification'
|
22
|
+
|
15
23
|
# Load Financial and Non Financial API Requests
|
16
24
|
Dir["#{File.dirname(__FILE__)}/api/requests/*financial/**/*.rb"].sort.each { |file| require file }
|
17
25
|
|
@@ -25,6 +25,16 @@ module GenesisRuby
|
|
25
25
|
raise NotImplementedError, 'Execute method must be implemented'
|
26
26
|
end
|
27
27
|
|
28
|
+
# Whether the response is an error (HTTP Code != 200)
|
29
|
+
def error?
|
30
|
+
raise NotImplementedError, 'Error? method must be implemented'
|
31
|
+
end
|
32
|
+
|
33
|
+
# Response server message
|
34
|
+
def server_message
|
35
|
+
raise NotImplementedError, 'Server Message method must be implemented'
|
36
|
+
end
|
37
|
+
|
28
38
|
end
|
29
39
|
end
|
30
40
|
end
|
@@ -25,14 +25,13 @@ module GenesisRuby
|
|
25
25
|
def execute
|
26
26
|
raise NetworkError, 'Request is not initialized' unless @request
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
@response = @request.post
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
@request.finish
|
28
|
+
safe_execute do
|
29
|
+
case request_data.type
|
30
|
+
when Api::Request::METHOD_POST then @response = @request.post path, request_data.body, headers
|
31
|
+
when Api::Request::METHOD_PUT then @response = @request.put path, request_data.body, headers
|
32
|
+
else
|
33
|
+
raise 'Invalid Request Type!'
|
34
|
+
end
|
36
35
|
end
|
37
36
|
end
|
38
37
|
|
@@ -46,6 +45,19 @@ module GenesisRuby
|
|
46
45
|
@response_headers ||= @response ? @response.each_header.to_h : {}
|
47
46
|
end
|
48
47
|
|
48
|
+
# Whether the response is an error (HTTP Code != 200)
|
49
|
+
def error?
|
50
|
+
!@response.is_a? Net::HTTPSuccess
|
51
|
+
end
|
52
|
+
|
53
|
+
# Response server message
|
54
|
+
def server_message
|
55
|
+
message = status
|
56
|
+
message += " #{@response.message}" if @response.message
|
57
|
+
|
58
|
+
message
|
59
|
+
end
|
60
|
+
|
49
61
|
private
|
50
62
|
|
51
63
|
attr_reader :uri, :request, :response, :request_data
|
@@ -86,6 +98,16 @@ module GenesisRuby
|
|
86
98
|
}
|
87
99
|
end
|
88
100
|
|
101
|
+
# Safe Request execution
|
102
|
+
def safe_execute(&block)
|
103
|
+
block.call
|
104
|
+
rescue StandardError => e
|
105
|
+
raise NetworkError, "Network error raised by #{e.class.name}: #{e.message}"
|
106
|
+
ensure
|
107
|
+
# Close the request
|
108
|
+
@request.finish
|
109
|
+
end
|
110
|
+
|
89
111
|
end
|
90
112
|
end
|
91
113
|
end
|
@@ -9,6 +9,7 @@ module GenesisRuby
|
|
9
9
|
|
10
10
|
XML_HEADER = 'application/xml'.freeze
|
11
11
|
JSON_HEADER = 'application/json'.freeze
|
12
|
+
HTML_HEADER = 'text/html'.freeze
|
12
13
|
|
13
14
|
# Base constructor
|
14
15
|
def initialize(configuration)
|
@@ -27,6 +28,16 @@ module GenesisRuby
|
|
27
28
|
@context.response_headers
|
28
29
|
end
|
29
30
|
|
31
|
+
# Whether returned response is an error response
|
32
|
+
def error?
|
33
|
+
@context.error?
|
34
|
+
end
|
35
|
+
|
36
|
+
# Returns the server message
|
37
|
+
def server_message
|
38
|
+
@context.server_message
|
39
|
+
end
|
40
|
+
|
30
41
|
# Send the request
|
31
42
|
def send_request
|
32
43
|
@context.execute
|
@@ -47,6 +58,11 @@ module GenesisRuby
|
|
47
58
|
raise NotImplementedError, 'Is JSON method must be implemented'
|
48
59
|
end
|
49
60
|
|
61
|
+
# Every child defines is HTML Response Type
|
62
|
+
def html?
|
63
|
+
raise NotImplementedError, 'Is HTML method must be implemented'
|
64
|
+
end
|
65
|
+
|
50
66
|
protected
|
51
67
|
|
52
68
|
# GenesisRuby::Configuration, Adapter Context, Network Adapter Config mapper
|
@@ -16,6 +16,11 @@ module GenesisRuby
|
|
16
16
|
response_headers['content-type'].downcase.include?(BaseNetwork::JSON_HEADER)
|
17
17
|
end
|
18
18
|
|
19
|
+
# HTML Response Type
|
20
|
+
def html?
|
21
|
+
response_headers['content-type'].downcase.include?(BaseNetwork::HTML_HEADER)
|
22
|
+
end
|
23
|
+
|
19
24
|
protected
|
20
25
|
|
21
26
|
# Adapter Initialization
|
@@ -93,7 +93,7 @@ module GenesisRuby
|
|
93
93
|
parsed_date = nil
|
94
94
|
|
95
95
|
formats.each do |format|
|
96
|
-
return
|
96
|
+
return DateTime.strptime(date, format)
|
97
97
|
rescue StandardError
|
98
98
|
parsed_date = nil
|
99
99
|
end
|
@@ -101,6 +101,13 @@ module GenesisRuby
|
|
101
101
|
parsed_date
|
102
102
|
end
|
103
103
|
|
104
|
+
# Check if the given string contain time
|
105
|
+
def date_has_time?(value)
|
106
|
+
return true if value =~ /(?:\d|[01]\d|2[0-3]):[0-5]\d:[0-5]\d/
|
107
|
+
|
108
|
+
false
|
109
|
+
end
|
110
|
+
|
104
111
|
end
|
105
112
|
|
106
113
|
end
|
@@ -8,26 +8,29 @@ module GenesisRuby
|
|
8
8
|
|
9
9
|
# Load pre-defined XML configuration
|
10
10
|
def load_xml_config
|
11
|
-
self.protocol
|
12
|
-
self.port
|
13
|
-
self.type
|
14
|
-
self.format
|
11
|
+
self.protocol = GenesisRuby::Api::Request::PROTOCOL_HTTPS
|
12
|
+
self.port = GenesisRuby::Api::Request::PORT_HTTPS
|
13
|
+
self.type = GenesisRuby::Api::Request::METHOD_POST
|
14
|
+
self.format = Builder::XML
|
15
|
+
self.parser_skip_root_node = true
|
15
16
|
end
|
16
17
|
|
17
18
|
# Load pre-defined JSON configuration
|
18
19
|
def load_json_config
|
19
|
-
self.protocol
|
20
|
-
self.port
|
21
|
-
self.type
|
22
|
-
self.format
|
20
|
+
self.protocol = GenesisRuby::Api::Request::PROTOCOL_HTTPS
|
21
|
+
self.port = GenesisRuby::Api::Request::PORT_HTTPS
|
22
|
+
self.type = GenesisRuby::Api::Request::METHOD_POST
|
23
|
+
self.format = Builder::JSON
|
24
|
+
self.parser_skip_root_node = false
|
23
25
|
end
|
24
26
|
|
25
27
|
# Load pre-defined FORM configuration
|
26
28
|
def load_form_config
|
27
|
-
self.protocol
|
28
|
-
self.port
|
29
|
-
self.type
|
30
|
-
self.format
|
29
|
+
self.protocol = GenesisRuby::Api::Request::PROTOCOL_HTTPS
|
30
|
+
self.port = GenesisRuby::Api::Request::PORT_HTTPS
|
31
|
+
self.type = GenesisRuby::Api::Request::METHOD_POST
|
32
|
+
self.format = Builder::FORM
|
33
|
+
self.parser_skip_root_node = true
|
31
34
|
end
|
32
35
|
|
33
36
|
end
|
@@ -22,13 +22,12 @@ module GenesisRuby
|
|
22
22
|
|
23
23
|
# Retrieve the Request data format that must be used as Content-Type header
|
24
24
|
def fetch_content_type(data_format)
|
25
|
-
# TODO: Builder Constants
|
26
25
|
case data_format
|
27
|
-
when
|
26
|
+
when Builder::XML
|
28
27
|
'text/xml'
|
29
|
-
when
|
28
|
+
when Builder::JSON
|
30
29
|
'application/json'
|
31
|
-
when
|
30
|
+
when Builder::FORM
|
32
31
|
'application/x-www-form-urlencoded'
|
33
32
|
else
|
34
33
|
raise InvalidArgumentError, 'Invalid request format type. Allowed are XML, JSON and FORM'
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'digest'
|
2
|
+
|
3
|
+
module GenesisRuby
|
4
|
+
module Utils
|
5
|
+
module Threeds
|
6
|
+
# Threeds V2 Utils
|
7
|
+
class V2
|
8
|
+
|
9
|
+
class << self
|
10
|
+
|
11
|
+
# Generate 3DSV2 signature
|
12
|
+
def generate_signature(unique_id:, amount:, timestamp:, merchant_password:)
|
13
|
+
Digest::SHA512.hexdigest "#{unique_id}#{amount}#{timestamp}#{merchant_password}"
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/genesis_ruby/version.rb
CHANGED
data/lib/genesis_ruby.rb
CHANGED
@@ -12,7 +12,7 @@ module GenesisRuby
|
|
12
12
|
|
13
13
|
# Transaction Request Initializer
|
14
14
|
def self.for(config:, request:)
|
15
|
-
unless request.is_a?(Class)
|
15
|
+
unless request.is_a?(Class) && request < GenesisRuby::Api::Request
|
16
16
|
raise InvalidArgumentError, 'Given Request is invalid'
|
17
17
|
end
|
18
18
|
|
@@ -31,7 +31,10 @@ module GenesisRuby
|
|
31
31
|
def initialize(configuration, request = nil)
|
32
32
|
@configuration = configuration
|
33
33
|
@request = request
|
34
|
-
@response = GenesisRuby::Api::Response.new(
|
34
|
+
@response = GenesisRuby::Api::Response.new(
|
35
|
+
configuration,
|
36
|
+
request&.api_config || GenesisRuby::Utils::Options::ApiConfig.new
|
37
|
+
)
|
35
38
|
@network = GenesisRuby::Connection.for(configuration)
|
36
39
|
end
|
37
40
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: genesis_ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- emerchantpay Ltd.
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-11-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: net-http
|
@@ -42,16 +42,16 @@ dependencies:
|
|
42
42
|
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '2.1'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '2.1'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: faker
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -232,6 +232,7 @@ files:
|
|
232
232
|
- lib/genesis_ruby/api/constants/transactions/parameters/business/payment_types.rb
|
233
233
|
- lib/genesis_ruby/api/constants/transactions/parameters/recurring/categories.rb
|
234
234
|
- lib/genesis_ruby/api/constants/transactions/parameters/recurring/types.rb
|
235
|
+
- lib/genesis_ruby/api/constants/transactions/parameters/refund/bank_account_types.rb
|
235
236
|
- lib/genesis_ruby/api/constants/transactions/parameters/sca_exemptions.rb
|
236
237
|
- lib/genesis_ruby/api/constants/transactions/parameters/threeds/version2/browser/color_depths.rb
|
237
238
|
- lib/genesis_ruby/api/constants/transactions/parameters/threeds/version2/card_holder_account/password_change_indicators.rb
|
@@ -291,17 +292,27 @@ files:
|
|
291
292
|
- lib/genesis_ruby/api/mixins/requests/financial/threeds/version2/sdk.rb
|
292
293
|
- lib/genesis_ruby/api/mixins/requests/financial/threeds/version2/wpf_attributes.rb
|
293
294
|
- lib/genesis_ruby/api/mixins/requests/restricted_setter.rb
|
295
|
+
- lib/genesis_ruby/api/notification.rb
|
294
296
|
- lib/genesis_ruby/api/request.rb
|
295
297
|
- lib/genesis_ruby/api/requests/base/financial.rb
|
296
298
|
- lib/genesis_ruby/api/requests/base/financials/credit_card.rb
|
299
|
+
- lib/genesis_ruby/api/requests/base/reference.rb
|
300
|
+
- lib/genesis_ruby/api/requests/financial/capture.rb
|
297
301
|
- lib/genesis_ruby/api/requests/financial/cards/authorize.rb
|
298
302
|
- lib/genesis_ruby/api/requests/financial/cards/authorize3d.rb
|
299
303
|
- lib/genesis_ruby/api/requests/financial/cards/sale.rb
|
300
304
|
- lib/genesis_ruby/api/requests/financial/cards/sale3d.rb
|
305
|
+
- lib/genesis_ruby/api/requests/financial/cards/threeds/v2/method_continue.rb
|
306
|
+
- lib/genesis_ruby/api/requests/financial/refund.rb
|
307
|
+
- lib/genesis_ruby/api/requests/financial/void.rb
|
308
|
+
- lib/genesis_ruby/api/requests/non_financial/reconcile/date_range.rb
|
309
|
+
- lib/genesis_ruby/api/requests/non_financial/reconcile/transaction.rb
|
301
310
|
- lib/genesis_ruby/api/requests/wpf/create.rb
|
311
|
+
- lib/genesis_ruby/api/requests/wpf/reconcile.rb
|
302
312
|
- lib/genesis_ruby/api/response.rb
|
303
313
|
- lib/genesis_ruby/builder.rb
|
304
314
|
- lib/genesis_ruby/builders/base.rb
|
315
|
+
- lib/genesis_ruby/builders/form.rb
|
305
316
|
- lib/genesis_ruby/builders/xml.rb
|
306
317
|
- lib/genesis_ruby/configuration.rb
|
307
318
|
- lib/genesis_ruby/connection.rb
|
@@ -337,6 +348,7 @@ files:
|
|
337
348
|
- lib/genesis_ruby/utils/options/api_config.rb
|
338
349
|
- lib/genesis_ruby/utils/options/base.rb
|
339
350
|
- lib/genesis_ruby/utils/options/network_adapter_config.rb
|
351
|
+
- lib/genesis_ruby/utils/threeds/v2.rb
|
340
352
|
- lib/genesis_ruby/utils/transactions/financial_types.rb
|
341
353
|
- lib/genesis_ruby/utils/transactions/references/capturable_types.rb
|
342
354
|
- lib/genesis_ruby/utils/transactions/references/refundable_types.rb
|
@@ -349,7 +361,8 @@ licenses:
|
|
349
361
|
metadata:
|
350
362
|
homepage_uri: https://github.com/GenesisGateway/genesis_ruby
|
351
363
|
source_code_uri: https://github.com/GenesisGateway/genesis_ruby
|
352
|
-
changelog_uri: https://github.com/GenesisGateway/genesis_ruby/CHANGELOG.md
|
364
|
+
changelog_uri: https://github.com/GenesisGateway/genesis_ruby/blob/main/CHANGELOG.md
|
365
|
+
documentation_uri: https://github.com/GenesisGateway/genesis_ruby/blob/main/README.md
|
353
366
|
post_install_message:
|
354
367
|
rdoc_options: []
|
355
368
|
require_paths:
|