k2-connect-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.
- checksums.yaml +7 -0
- data/.gitignore +75 -0
- data/.gitmodules +6 -0
- data/.rspec +3 -0
- data/.travis.yml +7 -0
- data/CHANGELOG.md +0 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +127 -0
- data/Guardfile +80 -0
- data/LICENSE +21 -0
- data/README.md +542 -0
- data/Rakefile +8 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/k2-connect-ruby.gemspec +51 -0
- data/lib/k2-connect-ruby.rb +34 -0
- data/lib/k2-connect-ruby/k2_errors.rb +77 -0
- data/lib/k2-connect-ruby/k2_financial_entity/entities/k2_pay.rb +100 -0
- data/lib/k2-connect-ruby/k2_financial_entity/entities/k2_settlement.rb +49 -0
- data/lib/k2-connect-ruby/k2_financial_entity/entities/k2_stk.rb +48 -0
- data/lib/k2-connect-ruby/k2_financial_entity/entities/k2_transfer.rb +45 -0
- data/lib/k2-connect-ruby/k2_financial_entity/entity.rb +6 -0
- data/lib/k2-connect-ruby/k2_financial_entity/k2_entity.rb +34 -0
- data/lib/k2-connect-ruby/k2_financial_entity/k2_subscribe.rb +42 -0
- data/lib/k2-connect-ruby/k2_financial_entity/k2_token.rb +37 -0
- data/lib/k2-connect-ruby/k2_services/client/k2_client.rb +24 -0
- data/lib/k2-connect-ruby/k2_services/payload_process.rb +14 -0
- data/lib/k2-connect-ruby/k2_services/payloads/k2_transaction.rb +48 -0
- data/lib/k2-connect-ruby/k2_services/payloads/k2_webhooks.rb +59 -0
- data/lib/k2-connect-ruby/k2_services/payloads/transactions/incoming_payment.rb +46 -0
- data/lib/k2-connect-ruby/k2_services/payloads/transactions/outgoing_payment.rb +15 -0
- data/lib/k2-connect-ruby/k2_services/payloads/transactions/transfer.rb +12 -0
- data/lib/k2-connect-ruby/k2_services/payloads/webhooks/b2b_received.rb +10 -0
- data/lib/k2-connect-ruby/k2_services/payloads/webhooks/buygoods_received.rb +5 -0
- data/lib/k2-connect-ruby/k2_services/payloads/webhooks/buygoods_reversal.rb +5 -0
- data/lib/k2-connect-ruby/k2_services/payloads/webhooks/customer_created.rb +14 -0
- data/lib/k2-connect-ruby/k2_services/payloads/webhooks/m2m_transaction.rb +8 -0
- data/lib/k2-connect-ruby/k2_services/payloads/webhooks/settlement_webhook.rb +36 -0
- data/lib/k2-connect-ruby/k2_utilities/config/k2_config.rb +51 -0
- data/lib/k2-connect-ruby/k2_utilities/config/k2_config.yml +14 -0
- data/lib/k2-connect-ruby/k2_utilities/k2_authorize.rb +14 -0
- data/lib/k2-connect-ruby/k2_utilities/k2_connection.rb +38 -0
- data/lib/k2-connect-ruby/k2_utilities/k2_process_result.rb +43 -0
- data/lib/k2-connect-ruby/k2_utilities/k2_process_webhook.rb +55 -0
- data/lib/k2-connect-ruby/k2_utilities/k2_url_parse.rb +7 -0
- data/lib/k2-connect-ruby/k2_utilities/k2_validation.rb +126 -0
- data/lib/k2-connect-ruby/k2_utilities/spec_modules/spec_config.rb +41 -0
- data/lib/k2-connect-ruby/utilities.rb +19 -0
- data/lib/k2-connect-ruby/version.rb +3 -0
- metadata +265 -0
@@ -0,0 +1,51 @@
|
|
1
|
+
# TODO: try to see if you can implement Environment variables
|
2
|
+
module K2Config
|
3
|
+
@config = YAML.load_file(File.join(File.dirname(__FILE__), 'k2_config.yml')).with_indifferent_access
|
4
|
+
|
5
|
+
class << self
|
6
|
+
# Set the Host Url
|
7
|
+
def set_base_url(base_url)
|
8
|
+
raise ArgumentError, 'Invalid URL Format.' unless base_url =~ /\A#{URI.regexp(%w[http https])}\z/
|
9
|
+
@config[:base_url] = base_url
|
10
|
+
File.open("lib/k2-connect-ruby/k2_utilities/config/k2_config.yml", 'w') { |f| YAML.dump(@config, f) }
|
11
|
+
end
|
12
|
+
|
13
|
+
# TODO: Versioning
|
14
|
+
def set_version(version_number)
|
15
|
+
raise ArgumentError, 'Invalid Format: Version Number input should be Numeric' unless version_number.is_a?(Numeric)
|
16
|
+
@config[:version] = "v#{version_number}"
|
17
|
+
File.open("lib/k2-connect-ruby/k2_utilities/config/k2_config.yml", 'w') { |f| YAML.dump(@config, f) }
|
18
|
+
end
|
19
|
+
|
20
|
+
def version
|
21
|
+
@config[:version]
|
22
|
+
end
|
23
|
+
|
24
|
+
def path_endpoint(key)
|
25
|
+
unless key.eql?('oauth_token')
|
26
|
+
return "api/#{version}/#{@config[:endpoints][:"#{key}"]}"
|
27
|
+
end
|
28
|
+
@config[:endpoints][:"#{key}"]
|
29
|
+
end
|
30
|
+
|
31
|
+
def path_endpoints
|
32
|
+
@config[:endpoints]
|
33
|
+
end
|
34
|
+
|
35
|
+
def path_url(key)
|
36
|
+
# TODO: Custom error/exception message
|
37
|
+
base_url + path_endpoint(key)
|
38
|
+
end
|
39
|
+
|
40
|
+
def network_operators
|
41
|
+
@config[:network_operators]
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def base_url
|
47
|
+
@config[:base_url]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
--- !ruby/hash:ActiveSupport::HashWithIndifferentAccess
|
2
|
+
version: v1
|
3
|
+
base_url: http://127.0.0.1:3000/
|
4
|
+
endpoints: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
|
5
|
+
oauth_token: oauth/token
|
6
|
+
webhook_subscriptions: webhook_subscriptions
|
7
|
+
pay_recipient: pay_recipients
|
8
|
+
payments: payments
|
9
|
+
incoming_payments: incoming_payments
|
10
|
+
settlement_mobile_wallet: merchant_wallets
|
11
|
+
settlement_bank_account: merchant_bank_accounts
|
12
|
+
transfers: settlement_transfers
|
13
|
+
network_operators:
|
14
|
+
- SAFARICOM
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'openssl'
|
2
|
+
require 'active_support/security_utils'
|
3
|
+
# Module for Authenticating the Kopo Kopo Signature via HMAC
|
4
|
+
module K2Authenticator
|
5
|
+
# Compares HMAC signature with the key.
|
6
|
+
def self.authenticate(body, api_secret_key, signature)
|
7
|
+
raise ArgumentError, "Nil Authentication Argument!\n Check whether your Input is Empty" if body.blank? || api_secret_key.blank? || signature.blank?
|
8
|
+
|
9
|
+
digest = OpenSSL::Digest.new('sha256')
|
10
|
+
hmac = OpenSSL::HMAC.hexdigest(digest, api_secret_key, body.to_json)
|
11
|
+
raise ArgumentError, "Invalid Details Given!\n Ensure that your the Arguments Given are correct, namely:\n\t- The Response Body\n\t- Secret Key\n\t- Signature" unless ActiveSupport::SecurityUtils.secure_compare(hmac, signature)
|
12
|
+
true
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module K2Connect
|
2
|
+
# Method for sending the request to K2 sandbox or Mock Server
|
3
|
+
def self.make_request(connection_hash)
|
4
|
+
access_token = connection_hash[:access_token]
|
5
|
+
class_type = connection_hash[:class_type]
|
6
|
+
path_url = connection_hash[:path_url]
|
7
|
+
request_type = connection_hash[:request_type]
|
8
|
+
|
9
|
+
unless class_type.eql?('Access Token') || access_token.present?
|
10
|
+
raise ArgumentError, 'No Access Token in Arguments!'
|
11
|
+
end
|
12
|
+
|
13
|
+
# Set up Headers
|
14
|
+
headers = { 'Content-Type': 'application/json', Accept: 'application/vnd.kopokopo.v1.hal+json', Authorization: "Bearer #{access_token}" }
|
15
|
+
if path_url.include?('oauth/token')
|
16
|
+
headers = { 'Content-Type': 'application/json' }
|
17
|
+
end
|
18
|
+
|
19
|
+
k2_response = RestClient::Request.execute(method: request_type, url: path_url, headers: headers, payload: connection_hash[:params].to_json)
|
20
|
+
|
21
|
+
# Response Body
|
22
|
+
response_body = Yajl::Parser.parse(k2_response.body)
|
23
|
+
response_headers = Yajl::Parser.parse(k2_response.headers.to_json)
|
24
|
+
response_code = k2_response.code.to_s
|
25
|
+
raise K2ConnectionError.new(response_code) && k2_request.shutdown unless response_code[0].eql?(2.to_s)
|
26
|
+
|
27
|
+
unless request_type.eql?('get')
|
28
|
+
# Returns the access token for authorization
|
29
|
+
return response_body['access_token'] if path_url.include?('oauth/token')
|
30
|
+
|
31
|
+
# Return the location url for post Requests
|
32
|
+
return response_headers["location"]
|
33
|
+
end
|
34
|
+
|
35
|
+
# Return the result of the Query
|
36
|
+
return response_body
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# Processes Results
|
2
|
+
module K2ProcessResult
|
3
|
+
def self.process(payload, secret_key, signature)
|
4
|
+
raise ArgumentError, 'Empty/Nil Request Body Argument!' if payload.blank?
|
5
|
+
self.check_type(payload) if K2Authenticator.authenticate(payload, secret_key, signature)
|
6
|
+
end
|
7
|
+
|
8
|
+
# Check the Event Type.
|
9
|
+
def self.check_type(payload)
|
10
|
+
result_type = payload.dig('data', 'type')
|
11
|
+
case result_type
|
12
|
+
# Incoming Payments
|
13
|
+
when 'incoming_payment'
|
14
|
+
incoming_payments = IncomingPayments.new(payload)
|
15
|
+
return incoming_payments
|
16
|
+
# Outgoing Payments
|
17
|
+
when 'payment'
|
18
|
+
outgoing_payments = OutgoingPayment.new(payload)
|
19
|
+
return outgoing_payments
|
20
|
+
when 'settlement_transfer'
|
21
|
+
transfer = Transfer.new(payload)
|
22
|
+
return transfer
|
23
|
+
else
|
24
|
+
raise ArgumentError, 'No Other Specified Payment Type!'
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Returns a Hash Object
|
29
|
+
def self.return_obj_hash(instance_hash = HashWithIndifferentAccess.new, obj)
|
30
|
+
obj.instance_variables.each do |value|
|
31
|
+
instance_hash[:"#{value.to_s.tr('@', '')}"] = obj.instance_variable_get(value)
|
32
|
+
end
|
33
|
+
instance_hash.each(&:freeze).freeze
|
34
|
+
end
|
35
|
+
|
36
|
+
# Returns an Array Object
|
37
|
+
def self.return_obj_array(instance_array = [], obj)
|
38
|
+
obj.instance_variables.each do |value|
|
39
|
+
instance_array << obj.instance_variable_get(value)
|
40
|
+
end
|
41
|
+
instance_array.each(&:freeze).freeze
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# Processes Webhook
|
2
|
+
module K2ProcessWebhook
|
3
|
+
def self.process(payload, secret_key, signature)
|
4
|
+
raise ArgumentError, 'Empty/Nil Request Body Argument!' if payload.blank?
|
5
|
+
self.check_topic(payload) if K2Authenticator.authenticate(payload, secret_key, signature)
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.check_topic(payload)
|
9
|
+
result_topic = payload.dig('topic')
|
10
|
+
case result_topic
|
11
|
+
# Buygoods Transaction Received
|
12
|
+
when 'buygoods_transaction_received'
|
13
|
+
buygoods_received = BuygoodsTransactionReceived.new(payload)
|
14
|
+
return buygoods_received
|
15
|
+
# Buygoods Transaction Reversed
|
16
|
+
when 'buygoods_transaction_reversed'
|
17
|
+
buygoods_reversed = BuygoodsTransactionReversed.new(payload)
|
18
|
+
return buygoods_reversed
|
19
|
+
# B2b Transaction
|
20
|
+
when 'b2b_transaction_received'
|
21
|
+
b2b_transaction = B2b.new(payload)
|
22
|
+
return b2b_transaction
|
23
|
+
# Merchant to Merchant
|
24
|
+
when 'm2m_transaction_received'
|
25
|
+
m2m_transaction_received = MerchantToMerchant.new(payload)
|
26
|
+
return m2m_transaction_received
|
27
|
+
# Settlement Transfer
|
28
|
+
when 'settlement_transfer_completed'
|
29
|
+
settlement_transfer = SettlementWebhook.new(payload)
|
30
|
+
return settlement_transfer
|
31
|
+
# Customer Created
|
32
|
+
when 'customer_created'
|
33
|
+
customer_created = CustomerCreated.new(payload)
|
34
|
+
return customer_created
|
35
|
+
else
|
36
|
+
raise ArgumentError, 'No Other Specified Event!'
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# Returns a Hash Object
|
41
|
+
def self.return_obj_hash(instance_hash = HashWithIndifferentAccess.new, obj)
|
42
|
+
obj.instance_variables.each do |value|
|
43
|
+
instance_hash[:"#{value.to_s.tr('@', '')}"] = obj.instance_variable_get(value)
|
44
|
+
end
|
45
|
+
instance_hash.each(&:freeze).freeze
|
46
|
+
end
|
47
|
+
|
48
|
+
# Returns an Array Object
|
49
|
+
def self.return_obj_array(instance_array = [], obj)
|
50
|
+
obj.instance_variables.each do |value|
|
51
|
+
instance_array << obj.instance_variable_get(value)
|
52
|
+
end
|
53
|
+
instance_array.each(&:freeze).freeze
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
# Module for Validating Input
|
2
|
+
# TODO: Correct validation of url so that it only accepts https
|
3
|
+
module K2Validation
|
4
|
+
ALL_EVENT_TYPES = %[buygoods_transaction_received b2b_transaction_received buygoods_transaction_reversed customer_created settlement_transfer_completed m2m_transaction_received]
|
5
|
+
TILL_SCOPE_EVENT_TYPES = %[buygoods_transaction_received b2b_transaction_received buygoods_transaction_reversed]
|
6
|
+
|
7
|
+
# Validating Method
|
8
|
+
def validate_input(the_input, the_array)
|
9
|
+
if the_input.blank?
|
10
|
+
raise ArgumentError, "Empty or Nil Input!\n No Input Content has been given."
|
11
|
+
else
|
12
|
+
unless !!the_input == the_input
|
13
|
+
if the_input.is_a?(Hash)
|
14
|
+
validate_hash(the_input.with_indifferent_access, the_array)
|
15
|
+
else
|
16
|
+
begin
|
17
|
+
if the_input.is_a?(String)
|
18
|
+
raise ArgumentError, "Wrong Input Format.\n The Input is a String."
|
19
|
+
elsif the_input.is_a?(Integer)
|
20
|
+
raise ArgumentError, "Wrong Input Format.\n The Input is an Integer."
|
21
|
+
elsif the_input.key?(:authenticity_token)
|
22
|
+
nil_values(the_input.permit(the_array).to_hash.with_indifferent_access)
|
23
|
+
else
|
24
|
+
raise ArgumentError, "Undefined Input Format.\n The Input is Neither a Hash nor an ActionController::Parameter Object."
|
25
|
+
end
|
26
|
+
rescue NoMethodError => nme
|
27
|
+
if nme.message.include?('has_key?')
|
28
|
+
raise ArgumentError, "Undefined Input Format.\n The Input is Neither a Hash nor an ActionController::Parameter Object."
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
to_indifferent_access(the_input)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Validate the Hash Input Parameters
|
38
|
+
def validate_hash(the_input, the_array)
|
39
|
+
nil_values(the_input)
|
40
|
+
incorrect_keys(the_input, the_array)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Return Incorrect Key Symbols for Hashes
|
44
|
+
def incorrect_keys(the_input, invalid_hash = [], the_array)
|
45
|
+
the_input.each_key do |key|
|
46
|
+
validate_network(the_input[:network]) if key.eql?("network")
|
47
|
+
validate_settlement_method(the_input[:settlement_method]) if key.eql?("settlement_method")
|
48
|
+
invalid_hash << key unless the_array.include?(key.to_s)
|
49
|
+
end
|
50
|
+
raise K2IncorrectParams, invalid_hash if invalid_hash.present?
|
51
|
+
end
|
52
|
+
|
53
|
+
# Return Key Symbols with Blank Values
|
54
|
+
def nil_values(the_input, nil_keys_array = [])
|
55
|
+
the_input.select { |_, v| v.blank? }.each_key do |key|
|
56
|
+
nil_keys_array << key.to_s
|
57
|
+
end
|
58
|
+
raise K2EmptyParams, nil_keys_array unless nil_keys_array.blank?
|
59
|
+
end
|
60
|
+
|
61
|
+
# Validate Phone Number
|
62
|
+
def validate_phone(phone)
|
63
|
+
raise ArgumentError, "No Phone Number given." if phone.blank?
|
64
|
+
# Kenyan Phone Numbers
|
65
|
+
unless phone.blank?
|
66
|
+
if phone[-(number = phone.to_i.to_s.size).to_i, 3].eql?(254.to_s)
|
67
|
+
raise ArgumentError, 'Invalid Kenyan Phone Number.' unless phone[-9, 9][0].eql?(7.to_s)
|
68
|
+
else
|
69
|
+
raise ArgumentError, 'Invalid Phone Number.' unless number.eql?(9)
|
70
|
+
end
|
71
|
+
phone.tr('+', '')
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# Validate Email Format
|
76
|
+
def validate_email(email)
|
77
|
+
unless email.blank?
|
78
|
+
raise ArgumentError, 'Invalid Email Address.' unless email.match(URI::MailTo::EMAIL_REGEXP).present?
|
79
|
+
end
|
80
|
+
email
|
81
|
+
end
|
82
|
+
|
83
|
+
# Validate the Network Operator
|
84
|
+
def validate_network(network)
|
85
|
+
raise ArgumentError, "Invalid Network Operator." unless K2Config.network_operators.include?(network.to_s.upcase)
|
86
|
+
end
|
87
|
+
|
88
|
+
def validate_settlement_method(settlement_method)
|
89
|
+
raise ArgumentError, "Wrong Settlement Method" unless settlement_method.eql?("EFT") || settlement_method.eql?("RTS")
|
90
|
+
end
|
91
|
+
|
92
|
+
# Converts Hash Objects to HashWithIndifferentAccess Objects
|
93
|
+
def to_indifferent_access(params)
|
94
|
+
params.with_indifferent_access
|
95
|
+
end
|
96
|
+
|
97
|
+
def validate_url(url)
|
98
|
+
raise ArgumentError, 'Invalid URL Format.' unless url =~ /\A#{URI.regexp(%w[https http])}\z/
|
99
|
+
url
|
100
|
+
end
|
101
|
+
|
102
|
+
def validate_till_number_prefix(till_number)
|
103
|
+
raise ArgumentError, "No Till Number given." if till_number.blank?
|
104
|
+
raise ArgumentError, "Invalid Till Number format." unless till_number[0, 1].eql?('K')
|
105
|
+
till_number
|
106
|
+
end
|
107
|
+
|
108
|
+
def validate_webhook(params)
|
109
|
+
raise ArgumentError, 'Subscription Service does not Exist!' unless params[:event_type].in?(ALL_EVENT_TYPES)
|
110
|
+
determine_scope_details(params)
|
111
|
+
end
|
112
|
+
|
113
|
+
def validate_webhook_input(params)
|
114
|
+
if params[:event_type].in?(TILL_SCOPE_EVENT_TYPES)
|
115
|
+
validate_input(params, %w[event_type scope scope_reference url])
|
116
|
+
else
|
117
|
+
validate_input(params.except(:scope_reference), %w[event_type scope url])
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def determine_scope_details(params)
|
122
|
+
if params[:scope].eql?('till')
|
123
|
+
raise ArgumentError, "Invalid scope till for the event type" unless params[:event_type].in?(TILL_SCOPE_EVENT_TYPES)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module SpecConfig
|
2
|
+
TILL_SCOPE_EVENT_TYPES = %[buygoods_transaction_received b2b_transaction_received buygoods_transaction_reversed]
|
3
|
+
|
4
|
+
@specs = YAML.load_file(File.join('lib', 'k2-connect-ruby', 'k2_utilities', 'spec_modules', 'test_config.yml')).with_indifferent_access
|
5
|
+
|
6
|
+
def subscription_stub_request(event_type, url)
|
7
|
+
request_body = { event_type: event_type, url: url, secret: 'webhook_secret' }
|
8
|
+
SpecConfig.custom_stub_request('post', K2Config.path_url('webhook_subscriptions'), request_body, 200)
|
9
|
+
end
|
10
|
+
|
11
|
+
def webhook_structure(event_type, scope, scope_reference = nil)
|
12
|
+
{
|
13
|
+
event_type: event_type,
|
14
|
+
url: @callback_url,
|
15
|
+
scope: scope,
|
16
|
+
scope_reference: scope_reference,
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
class << self
|
21
|
+
def callback_url(context)
|
22
|
+
@specs[:callback_url][:"#{context}"]
|
23
|
+
end
|
24
|
+
|
25
|
+
def custom_stub_request(request_type, path_url, request_body, response_code)
|
26
|
+
request_body = request_body.to_s
|
27
|
+
request_uri = path_url
|
28
|
+
request_headers = { Authorization: "Bearer access_token", Accept: "application/vnd.kopokopo.v1.hal+json" }
|
29
|
+
|
30
|
+
if request_type.eql?('post')
|
31
|
+
request_headers['Content-Type'] = 'application/json'
|
32
|
+
end
|
33
|
+
|
34
|
+
# Stub Request
|
35
|
+
WebMock.stub_request(:"#{request_type}", request_uri)
|
36
|
+
.with(headers: request_headers, body: request_body)
|
37
|
+
.to_return(status: response_code)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'k2-connect-ruby/k2_utilities/k2_url_parse'
|
2
|
+
require 'k2-connect-ruby/k2_utilities/k2_authorize'
|
3
|
+
require 'k2-connect-ruby/k2_utilities/k2_connection'
|
4
|
+
require 'k2-connect-ruby/k2_utilities/k2_validation'
|
5
|
+
require 'k2-connect-ruby/k2_utilities/config/k2_config'
|
6
|
+
require 'k2-connect-ruby/k2_utilities/k2_process_result'
|
7
|
+
require 'k2-connect-ruby/k2_utilities/k2_process_webhook'
|
8
|
+
|
9
|
+
module K2Utilities
|
10
|
+
def make_hash(path_url, request, access_token, class_type, body)
|
11
|
+
{
|
12
|
+
path_url: path_url,
|
13
|
+
access_token: access_token,
|
14
|
+
request_type: request,
|
15
|
+
class_type: class_type,
|
16
|
+
params: body
|
17
|
+
}.with_indifferent_access
|
18
|
+
end
|
19
|
+
end
|
metadata
ADDED
@@ -0,0 +1,265 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: k2-connect-ruby
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- DavidKar1uk1
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-04-06 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 6.1.3.1
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 6.1.3.1
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activemodel
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 6.1.3.1
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 6.1.3.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '2.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: guard
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.16.2
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 2.16.2
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: guard-rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 4.7.3
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 4.7.3
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rest-client
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 2.1.0
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 2.1.0
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rake
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 13.0.3
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 13.0.3
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rspec
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 3.10.0
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 3.10.0
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rspec-nc
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 0.3.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.3.0
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: vcr
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: 6.0.0
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 6.0.0
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: webmock
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: 3.12.2
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: 3.12.2
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: yajl-ruby
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - "~>"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: 1.4.1
|
174
|
+
type: :runtime
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - "~>"
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: 1.4.1
|
181
|
+
description: Ruby SDK for connection to the Kopo Kopo API, with webhook handling and
|
182
|
+
JSON request parsing with the Ruby on Rails framework.
|
183
|
+
email:
|
184
|
+
- David.mwangi@kopokopo.com
|
185
|
+
executables: []
|
186
|
+
extensions: []
|
187
|
+
extra_rdoc_files: []
|
188
|
+
files:
|
189
|
+
- ".gitignore"
|
190
|
+
- ".gitmodules"
|
191
|
+
- ".rspec"
|
192
|
+
- ".travis.yml"
|
193
|
+
- CHANGELOG.md
|
194
|
+
- CODE_OF_CONDUCT.md
|
195
|
+
- Gemfile
|
196
|
+
- Gemfile.lock
|
197
|
+
- Guardfile
|
198
|
+
- LICENSE
|
199
|
+
- README.md
|
200
|
+
- Rakefile
|
201
|
+
- bin/console
|
202
|
+
- bin/setup
|
203
|
+
- k2-connect-ruby.gemspec
|
204
|
+
- lib/k2-connect-ruby.rb
|
205
|
+
- lib/k2-connect-ruby/k2_errors.rb
|
206
|
+
- lib/k2-connect-ruby/k2_financial_entity/entities/k2_pay.rb
|
207
|
+
- lib/k2-connect-ruby/k2_financial_entity/entities/k2_settlement.rb
|
208
|
+
- lib/k2-connect-ruby/k2_financial_entity/entities/k2_stk.rb
|
209
|
+
- lib/k2-connect-ruby/k2_financial_entity/entities/k2_transfer.rb
|
210
|
+
- lib/k2-connect-ruby/k2_financial_entity/entity.rb
|
211
|
+
- lib/k2-connect-ruby/k2_financial_entity/k2_entity.rb
|
212
|
+
- lib/k2-connect-ruby/k2_financial_entity/k2_subscribe.rb
|
213
|
+
- lib/k2-connect-ruby/k2_financial_entity/k2_token.rb
|
214
|
+
- lib/k2-connect-ruby/k2_services/client/k2_client.rb
|
215
|
+
- lib/k2-connect-ruby/k2_services/payload_process.rb
|
216
|
+
- lib/k2-connect-ruby/k2_services/payloads/k2_transaction.rb
|
217
|
+
- lib/k2-connect-ruby/k2_services/payloads/k2_webhooks.rb
|
218
|
+
- lib/k2-connect-ruby/k2_services/payloads/transactions/incoming_payment.rb
|
219
|
+
- lib/k2-connect-ruby/k2_services/payloads/transactions/outgoing_payment.rb
|
220
|
+
- lib/k2-connect-ruby/k2_services/payloads/transactions/transfer.rb
|
221
|
+
- lib/k2-connect-ruby/k2_services/payloads/webhooks/b2b_received.rb
|
222
|
+
- lib/k2-connect-ruby/k2_services/payloads/webhooks/buygoods_received.rb
|
223
|
+
- lib/k2-connect-ruby/k2_services/payloads/webhooks/buygoods_reversal.rb
|
224
|
+
- lib/k2-connect-ruby/k2_services/payloads/webhooks/customer_created.rb
|
225
|
+
- lib/k2-connect-ruby/k2_services/payloads/webhooks/m2m_transaction.rb
|
226
|
+
- lib/k2-connect-ruby/k2_services/payloads/webhooks/settlement_webhook.rb
|
227
|
+
- lib/k2-connect-ruby/k2_utilities/config/k2_config.rb
|
228
|
+
- lib/k2-connect-ruby/k2_utilities/config/k2_config.yml
|
229
|
+
- lib/k2-connect-ruby/k2_utilities/k2_authorize.rb
|
230
|
+
- lib/k2-connect-ruby/k2_utilities/k2_connection.rb
|
231
|
+
- lib/k2-connect-ruby/k2_utilities/k2_process_result.rb
|
232
|
+
- lib/k2-connect-ruby/k2_utilities/k2_process_webhook.rb
|
233
|
+
- lib/k2-connect-ruby/k2_utilities/k2_url_parse.rb
|
234
|
+
- lib/k2-connect-ruby/k2_utilities/k2_validation.rb
|
235
|
+
- lib/k2-connect-ruby/k2_utilities/spec_modules/spec_config.rb
|
236
|
+
- lib/k2-connect-ruby/utilities.rb
|
237
|
+
- lib/k2-connect-ruby/version.rb
|
238
|
+
homepage: https://github.com/kopokopo/k2-connect-ruby.git
|
239
|
+
licenses:
|
240
|
+
- MIT
|
241
|
+
metadata:
|
242
|
+
allowed_push_host: https://rubygems.org
|
243
|
+
homepage_uri: https://github.com/kopokopo/k2-connect-ruby.git
|
244
|
+
source_code_uri: https://github.com/kopokopo/k2-connect-ruby.git
|
245
|
+
changelog_uri: https://github.com/kopokopo/k2-connect-ruby.git/CHANGELOG.MD
|
246
|
+
post_install_message:
|
247
|
+
rdoc_options: []
|
248
|
+
require_paths:
|
249
|
+
- lib
|
250
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
251
|
+
requirements:
|
252
|
+
- - ">="
|
253
|
+
- !ruby/object:Gem::Version
|
254
|
+
version: '0'
|
255
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
256
|
+
requirements:
|
257
|
+
- - ">="
|
258
|
+
- !ruby/object:Gem::Version
|
259
|
+
version: '0'
|
260
|
+
requirements: []
|
261
|
+
rubygems_version: 3.0.6
|
262
|
+
signing_key:
|
263
|
+
specification_version: 4
|
264
|
+
summary: Ruby SDK for connection to the Kopo Kopo API.
|
265
|
+
test_files: []
|