xendify 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 94231b8a9cae2090e114b0d2867af3c6900d28c5b9b9b81883e00a9d68ce474b
4
+ data.tar.gz: 41f98577d7a2999e8ade5dda54c7f664a2b098139d299ce230e68161031bec81
5
+ SHA512:
6
+ metadata.gz: 3e9de0b6116060686415868a3420bef6ab768af64c5823ce51e09f8863160ad6a0b4b167fdeed0d19574b10a1e4cc6e9378a1e70a031463f661f554538ab9d23
7
+ data.tar.gz: 5ecee006018315e549ead2827ca5bf75ac00ebfde64905a124b382e4d6b274b3ff0d9f90e23a1b1df865bae2b0fb914493c6d50a486afca6dc145ba34a0ef937
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ gem 'pry'
6
+ gem "rake", ">= 13.0"
7
+
data/Gemfile.lock ADDED
@@ -0,0 +1,54 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ xend_it (0.1.0)
5
+ faraday (~> 1.0)
6
+ faraday_middleware (~> 1.0)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ coderay (1.1.3)
12
+ faraday (1.10.2)
13
+ faraday-em_http (~> 1.0)
14
+ faraday-em_synchrony (~> 1.0)
15
+ faraday-excon (~> 1.1)
16
+ faraday-httpclient (~> 1.0)
17
+ faraday-multipart (~> 1.0)
18
+ faraday-net_http (~> 1.0)
19
+ faraday-net_http_persistent (~> 1.0)
20
+ faraday-patron (~> 1.0)
21
+ faraday-rack (~> 1.0)
22
+ faraday-retry (~> 1.0)
23
+ ruby2_keywords (>= 0.0.4)
24
+ faraday-em_http (1.0.0)
25
+ faraday-em_synchrony (1.0.0)
26
+ faraday-excon (1.1.0)
27
+ faraday-httpclient (1.0.1)
28
+ faraday-multipart (1.0.4)
29
+ multipart-post (~> 2)
30
+ faraday-net_http (1.0.1)
31
+ faraday-net_http_persistent (1.2.0)
32
+ faraday-patron (1.0.0)
33
+ faraday-rack (1.0.0)
34
+ faraday-retry (1.0.3)
35
+ faraday_middleware (1.2.0)
36
+ faraday (~> 1.0)
37
+ method_source (1.0.0)
38
+ multipart-post (2.2.3)
39
+ pry (0.14.1)
40
+ coderay (~> 1.1)
41
+ method_source (~> 1.0)
42
+ rake (13.0.6)
43
+ ruby2_keywords (0.0.5)
44
+
45
+ PLATFORMS
46
+ x86_64-darwin-21
47
+
48
+ DEPENDENCIES
49
+ pry
50
+ rake (>= 13.0)
51
+ xend_it!
52
+
53
+ BUNDLED WITH
54
+ 2.3.21
@@ -0,0 +1,25 @@
1
+ module Xendify
2
+ class APIResource
3
+ def initialize(attributes = {})
4
+ assign_attributes(attributes) if attributes
5
+ end
6
+
7
+ private
8
+
9
+ def assign_attributes(new_attributes)
10
+ error_message = "When assigning attributes, you must pass a hash as an argument, #{new_attributes.class} passed."
11
+ raise ArgumentError, error_message unless new_attributes.respond_to?(:each_pair)
12
+ return if new_attributes.empty?
13
+
14
+ new_attributes.each do |key, value|
15
+ assign_attribute(key, value)
16
+ end
17
+ end
18
+
19
+ # Private: Set attribute with only defined resource attribute
20
+ def assign_attribute(key, value)
21
+ setter = :"#{key}="
22
+ public_send(setter, value) if respond_to?(setter)
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,29 @@
1
+ module Xendify
2
+ class Base
3
+ attr_reader :client
4
+
5
+ class << self
6
+ def model_name
7
+ name.sub('Api', 'Model')
8
+ end
9
+
10
+ def model_class
11
+ Object.const_get(model_name)
12
+ end
13
+
14
+ def allowed_methods
15
+ @allowed_methods ||= []
16
+ end
17
+
18
+ private
19
+
20
+ def allow_method(*methods)
21
+ @allowed_methods = methods
22
+ end
23
+ end
24
+
25
+ def initialize(client)
26
+ @client = client
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,47 @@
1
+ require 'faraday_middleware'
2
+ require 'xendify/middleware'
3
+ require 'xendify/resources/invoice'
4
+
5
+ module Xendify
6
+ BASE_URL = 'https://api.xendit.co'.freeze
7
+
8
+ class Client
9
+ def initialize(authorization = nil, options = {})
10
+ @connection = Faraday.new(url: BASE_URL) do |connection|
11
+ connection.request :basic_auth, authorization, ''
12
+ connection.request :json
13
+ connection.response :json
14
+
15
+ # logger = find_logger(options[:logger])
16
+ # if logger
17
+ # connection.response :logger, logger, { headers: false, bodies: true } do |log|
18
+ # filtered_logs = options[:filtered_logs]
19
+ # if filtered_logs.respond_to?(:each)
20
+ # filtered_logs.each do |filter|
21
+ # log.filter(%r{(#{filter}=)([\w+-.?@:/]+)}, '\1[FILTERED]')
22
+ # log.filter(%r{(#{filter}":")([\w+-.?@:/]+)}, '\1[FILTERED]')
23
+ # log.filter(%r{(#{filter}":)([\w+-.?@:/]+)}, '\1[FILTERED]')
24
+ # end
25
+ # end
26
+ # end
27
+ # end
28
+ connection.use Xendify::Middleware::HandleResponseException
29
+ connection.adapter Faraday.default_adapter
30
+ end
31
+ end
32
+
33
+ def get(url, params = nil)
34
+ response = @connection.get(url, params)
35
+ response.body
36
+ end
37
+
38
+ def post(url, params)
39
+ response = @connection.post(url, params)
40
+ response.body
41
+ end
42
+
43
+ def invoice
44
+ @invoice ||= Xendify::Invoice.new(self)
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,46 @@
1
+ module Xendify
2
+ module Errors
3
+ module CreditCard
4
+ class ResponseError < Xendify::Errors::ResponseError; end
5
+
6
+ class ChargeError < ResponseError; end
7
+
8
+ class CardDeclined < ResponseError
9
+ def message
10
+ 'The card you are trying to capture has been declined by the issuing bank.'
11
+ end
12
+ end
13
+
14
+ class ExpiredCard < ResponseError
15
+ def message
16
+ 'The card you are trying to capture is expired.'
17
+ end
18
+ end
19
+
20
+ class InsufficientBalance < ResponseError
21
+ def message
22
+ 'The card you are trying to capture does not have enough balance to complete the capture.'
23
+ end
24
+ end
25
+
26
+ class StolenCard < ResponseError
27
+ def message
28
+ 'The card you are trying to capture has been marked as stolen.'
29
+ end
30
+ end
31
+
32
+ class InactiveCard < ResponseError
33
+ def message
34
+ 'The card you are trying to capture is inactive.'
35
+ end
36
+ end
37
+
38
+ class InvalidCvn < ResponseError
39
+ def message
40
+ 'Invalid CVN number'
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+
@@ -0,0 +1,15 @@
1
+ module Xendify
2
+ module Errors
3
+ module Disbursement
4
+ class Error < Xendify::Errors::ResponseError; end
5
+ class DescriptionNotFound < Error; end
6
+ class NotEnoughBalance < Error; end
7
+ class DuplicateTransactionError < Error; end
8
+ class RecipientAccountNumberError < Error; end
9
+ class RecipientAmountError < Error; end
10
+ class MaximumTransferLimitError < Error; end
11
+ class BankCodeNotSupported < Error; end
12
+ class DirectDisbursementNotFound < Error; end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,8 @@
1
+ module Xendify
2
+ module Errors
3
+ module Invoice
4
+ class ResponseError < Xendify::Errors::ResponseError; end
5
+ end
6
+ end
7
+ end
8
+
@@ -0,0 +1,40 @@
1
+ module Xendify
2
+ module Errors
3
+ module VirtualAccount
4
+ class ResponseError < Xendify::Errors::ResponseError; end
5
+
6
+ class CallbackNotFound < ResponseError; end
7
+
8
+ class BankNotSupported < ResponseError; end
9
+
10
+ class ApiValidation < ResponseError; end
11
+
12
+ class InvalidJsonFormat < ResponseError; end
13
+
14
+ class VirtualAccountNumberOutsideRange < ResponseError; end
15
+
16
+ class ExpirationDateNotSupported < ResponseError; end
17
+
18
+ class ExpirationInvalid < ResponseError; end
19
+
20
+ class SuggestedAmountNotSupported < ResponseError; end
21
+
22
+ class ExpectedAmountRequired < ResponseError; end
23
+
24
+ class MinimumExpectedAmount < ResponseError; end
25
+
26
+ class MaximumExpectedAmount < ResponseError; end
27
+
28
+ class CallbackVirtualAccountNameNotAllowed < ResponseError; end
29
+
30
+ class DescriptionNotSupported < ResponseError; end
31
+
32
+ class RequestForbidden < ResponseError; end
33
+
34
+ class ClosedVaNotSupported < ResponseError; end
35
+
36
+ class DuplicateCallbackVirtualAccount < ResponseError; end
37
+ end
38
+ end
39
+ end
40
+
@@ -0,0 +1,20 @@
1
+ module Xendify
2
+ module Errors
3
+ class ResponseError < StandardError
4
+ attr_reader :payload
5
+
6
+ def initialize(message = nil, payload = nil)
7
+ @message = message
8
+ @payload = payload
9
+ super(@message) unless @message.nil?
10
+ end
11
+ end
12
+
13
+ class ApiValidation < ResponseError; end
14
+ class UnknownError < ResponseError; end
15
+ class ServerError < ResponseError; end
16
+ class DuplicateError < ResponseError; end
17
+ class DataNotFound < ResponseError; end
18
+ end
19
+ end
20
+
@@ -0,0 +1,112 @@
1
+ module Xendify
2
+ module Middleware
3
+ class HandleResponseException < Faraday::Middleware
4
+ def call(env)
5
+ @app.call(env).on_complete do |response|
6
+ raise Xendify::Errors::ServerError, 'An unexpected error occurred, our team has been notified and will troubleshoot the issue.' if response.status.to_s.start_with?('5')
7
+
8
+ validate_response(response.body)
9
+ end
10
+ end
11
+
12
+ private
13
+
14
+ # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/AbcSize, Metrics/MethodLength
15
+ def validate_response(response)
16
+ return true if response.nil?
17
+
18
+ json_response = JSON.parse(response)
19
+ json_response = json_response.first if json_response.is_a? Array
20
+
21
+ return true if json_response.nil?
22
+ return true if json_response['error_code'].nil?
23
+
24
+ error_message = json_response['message']
25
+
26
+ case json_response['error_code']
27
+ when 'USER_DID_NOT_AUTHORIZE_THE_PAYMENT'
28
+ raise Xendify::Errors::OVO::PaymentTimeout.new(error_message, json_response)
29
+ when 'DUPLICATE_PAYMENT'
30
+ raise Xendify::Errors::OVO::DuplicatePayment.new(error_message, json_response)
31
+ when 'SENDING_TRANSACTION_ERROR'
32
+ raise Xendify::Errors::OVO::SendingRequest.new(error_message, json_response)
33
+ when 'USER_DECLINED_THE_TRANSACTION'
34
+ raise Xendify::Errors::OVO::TransactionDeclined.new(error_message, json_response)
35
+ when 'PHONE_NUMBER_NOT_REGISTERED'
36
+ raise Xendify::Errors::OVO::PhoneNumberNotRegistered.new(error_message, json_response)
37
+ when 'EWALLET_APP_UNREACHABLE'
38
+ raise Xendify::Errors::OVO::EwalletAppUnreacable.new(error_message, json_response)
39
+ when 'EXTERNAL_ERROR'
40
+ raise Xendify::Errors::OVO::ExternalError.new(error_message, json_response)
41
+ when 'PAYMENT_NOT_FOUND_ERROR'
42
+ raise Xendify::Errors::OVO::PaymentNotFound.new(error_message, json_response)
43
+ when 'CHANNEL_NOT_ACTIVATED'
44
+ raise Xendify::Errors::V1::Ewallet::ChannelNotActivated.new(error_message, json_response)
45
+ when 'DUPLICATE_ERROR'
46
+ raise Xendify::Errors::DuplicateError.new(error_message, json_response)
47
+ when 'DATA_NOT_FOUND'
48
+ raise Xendify::Errors::DataNotFound.new(error_message, json_response)
49
+ when 'API_VALIDATION_ERROR'
50
+ # In this exception with custom the title since, the message from
51
+ # could returns arrays (see the payload for the full messages)
52
+ raise Xendify::Errors::ApiValidation.new('Validation error', json_response)
53
+ when 'CALLBACK_VIRTUAL_ACCOUNT_NOT_FOUND_ERROR'
54
+ raise Xendify::Errors::VirtualAccount::CallbackNotFound.new(error_message, json_response)
55
+ when 'BANK_NOT_SUPPORTED_ERROR'
56
+ raise Xendify::Errors::VirtualAccount::BankNotSupported.new(error_message, json_response)
57
+ when 'INVALID_JSON_FORMAT'
58
+ raise Xendify::Errors::VirtualAccount::InvalidJsonFormat.new(error_message, json_response)
59
+ when 'VIRTUAL_ACCOUNT_NUMBER_OUTSIDE_RANGE'
60
+ raise Xendify::Errors::VirtualAccount::VirtualAccountNumberOutsideRange.new(error_message, json_response)
61
+ when 'EXPIRATION_DATE_NOT_SUPPORTED_ERROR'
62
+ raise Xendify::Errors::VirtualAccount::ExpirationDateNotSupported.new(error_message, json_response)
63
+ when 'EXPIRATION_DATE_INVALID_ERROR'
64
+ raise Xendify::Errors::VirtualAccount::ExpirationInvalid.new(error_message, json_response)
65
+ when 'SUGGESTED_AMOUNT_NOT_SUPPORTED_ERROR'
66
+ raise Xendify::Errors::VirtualAccount::SuggestedAmountNotSupported.new(error_message, json_response)
67
+ when 'EXPECTED_AMOUNT_REQUIRED_ERROR'
68
+ raise Xendify::Errors::VirtualAccount::ExpectedAmountRequired.new(error_message, json_response)
69
+ when 'CLOSED_VA_NOT_SUPPORTED_ERROR'
70
+ raise Xendify::Errors::VirtualAccount::ClosedVaNotSupported.new(error_message, json_response)
71
+ when 'DUPLICATE_CALLBACK_VIRTUAL_ACCOUNT_ERROR'
72
+ raise Xendify::Errors::VirtualAccount::DuplicateCallbackVirtualAccount.new(error_message, json_response)
73
+ when 'MAXIMUM_EXPECTED_AMOUNT_ERROR'
74
+ raise Xendify::Errors::VirtualAccount::MaximumExpectedAmount.new(error_message, json_response)
75
+ when 'CALLBACK_VIRTUAL_ACCOUNT_NAME_NOT_ALLOWED_ERROR'
76
+ raise Xendify::Errors::VirtualAccount::CallbackVirtualAccountNameNotAllowed.new(error_message, json_response)
77
+ when 'DESCRIPTION_NOT_SUPPORTED_ERROR'
78
+ raise Xendify::Errors::VirtualAccount::DescriptionNotSupported.new(error_message, json_response)
79
+ when 'MINIMUM_EXPECTED_AMOUNT_ERROR'
80
+ raise Xendify::Errors::VirtualAccount::MinimumExpectedAmount.new(error_message, json_response)
81
+ when 'REQUEST_FORBIDDEN_ERROR'
82
+ raise Xendify::Errors::VirtualAccount::RequestForbidden.new(error_message, json_response)
83
+ # credit cards
84
+ when 'INVALID_TOKEN_ID_ERROR'
85
+ raise Xendify::Errors::CreditCard::ChargeError.new(error_message, json_response)
86
+ # disbursements
87
+ when 'DISBURSEMENT_DESCRIPTION_NOT_FOUND_ERROR'
88
+ raise Xendify::Errors::Disbursement::DescriptionNotFound.new(error_message, json_response)
89
+ when 'DIRECT_DISBURSEMENT_BALANCE_INSUFFICIENT_ERROR'
90
+ raise Xendify::Errors::Disbursement::NotEnoughBalance.new(error_message, json_response)
91
+ when 'DIRECT_DISBURSEMENT_NOT_FOUND_ERROR'
92
+ raise Xendify::Errors::Disbursement::DirectDisbursementNotFound.new(error_message, json_response)
93
+ when 'DUPLICATE_TRANSACTION_ERROR'
94
+ raise Xendify::Errors::Disbursement::DuplicateTransactionError.new(error_message, json_response)
95
+ when 'RECIPIENT_ACCOUNT_NUMBER_ERROR'
96
+ raise Xendify::Errors::Disbursement::RecipientAccountNumberError.new(error_message, json_response)
97
+ when 'RECIPIENT_AMOUNT_ERROR'
98
+ raise Xendify::Errors::Disbursement::RecipientAmountError.new(error_message, json_response)
99
+ when 'MAXIMUM_TRANSFER_LIMIT_ERROR'
100
+ raise Xendify::Errors::Disbursement::MaximumTransferLimitError.new(error_message, json_response)
101
+ when 'BANK_CODE_NOT_SUPPORTED_ERROR'
102
+ raise Xendify::Errors::Disbursement::BankCodeNotSupported.new(error_message, json_response)
103
+ when 'SERVER_ERROR'
104
+ raise Xendify::Errors::ServerError.new(error_message, json_response)
105
+ else
106
+ raise Xendify::Errors::UnknownError.new(error_message, json_response)
107
+ end
108
+ end
109
+ # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/AbcSize, Metrics/MethodLength
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,47 @@
1
+ require 'xendify/base'
2
+ require 'xendify/api_resource'
3
+ require 'xendify/resources/invoice'
4
+ require 'pry'
5
+
6
+ module Xendify
7
+ POST_PATH = '/v2/invoices'.freeze
8
+ GET_PATH = '/v2/invoices'.freeze
9
+
10
+ class InvoiceModel < APIResource
11
+ attr_accessor :id,
12
+ :user_id,
13
+ :external_id,
14
+ :status,
15
+ :merchant_name,
16
+ :merchant_profile_picture_url,
17
+ :amount,
18
+ :payer_email,
19
+ :description,
20
+ :invoice_url,
21
+ :expiry_date,
22
+ :available_banks,
23
+ :available_retail_outlets,
24
+ :should_exclude_credit_card,
25
+ :should_send_email,
26
+ :created,
27
+ :updated,
28
+ :mid_label,
29
+ :currency,
30
+ :fixed_va,
31
+ :items,
32
+ :fees
33
+
34
+ end
35
+
36
+ class Invoice < Base
37
+ def get(id:)
38
+ response = client.get("#{GET_PATH}/#{id}")
39
+ Xendify::InvoiceModel.new(response)
40
+ end
41
+
42
+ def post(params:)
43
+ response = client.post(POST_PATH, params)
44
+ Xendify::InvoiceModel.new(response)
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,3 @@
1
+ module Xendify
2
+ VERSION = '0.1.0'
3
+ end
data/lib/xendify.rb ADDED
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'xendify/version'
4
+ require 'xendify/client'
5
+
6
+ # require errors
7
+ require 'xendify/errors'
8
+ require 'xendify/errors/disbursement'
9
+ require 'xendify/errors/credit_card'
10
+ require 'xendify/errors/virtual_account'
11
+
12
+ module Xendify
13
+ class << self
14
+ attr_accessor :configuration
15
+ end
16
+
17
+ def self.configure
18
+ self.configuration ||= Configuration.new
19
+ yield(configuration)
20
+ end
21
+
22
+ class Configuration
23
+ attr_accessor :logger
24
+ end
25
+ end
data/xendify.gemspec ADDED
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ $LOAD_PATH.unshift(::File.join(::File.dirname(__FILE__), "lib"))
4
+
5
+ require "xendify/version"
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = "xendify"
9
+ s.version = Xendify::VERSION
10
+ s.required_ruby_version = ">= 2.3.0"
11
+ s.summary = "Xen wrapper"
12
+ s.description = "Handle xen API with ease."
13
+ s.authors = ["calmhacker"]
14
+ s.email = "be@calmhacker.com"
15
+ ignored = Regexp.union(
16
+ /\A\.editorconfig/,
17
+ /\A\.git/,
18
+ /\A\.rubocop/,
19
+ /\A\.travis.yml/,
20
+ /\A\.vscode/,
21
+ /\Atest/
22
+ )
23
+
24
+ s.files = `git ls-files`.split("\n").reject { |f| ignored.match(f) }
25
+ s.executables = `git ls-files -- bin/*`.split("\n")
26
+ .map { |f| ::File.basename(f) }
27
+ s.require_paths = ["lib"]
28
+
29
+ s.homepage = "https://rubygems.org/gems/xendit"
30
+ s.license = "MIT"
31
+
32
+ s.add_dependency 'faraday', '~> 1.0'
33
+ s.add_dependency 'faraday_middleware', '~> 1.0'
34
+ end
metadata ADDED
@@ -0,0 +1,85 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: xendify
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - calmhacker
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-12-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: faraday_middleware
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.0'
41
+ description: Handle xen API with ease.
42
+ email: be@calmhacker.com
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files: []
46
+ files:
47
+ - Gemfile
48
+ - Gemfile.lock
49
+ - lib/xendify.rb
50
+ - lib/xendify/api_resource.rb
51
+ - lib/xendify/base.rb
52
+ - lib/xendify/client.rb
53
+ - lib/xendify/errors.rb
54
+ - lib/xendify/errors/credit_card.rb
55
+ - lib/xendify/errors/disbursement.rb
56
+ - lib/xendify/errors/invoice.rb
57
+ - lib/xendify/errors/virtual_account.rb
58
+ - lib/xendify/middleware.rb
59
+ - lib/xendify/resources/invoice.rb
60
+ - lib/xendify/version.rb
61
+ - xendify.gemspec
62
+ homepage: https://rubygems.org/gems/xendit
63
+ licenses:
64
+ - MIT
65
+ metadata: {}
66
+ post_install_message:
67
+ rdoc_options: []
68
+ require_paths:
69
+ - lib
70
+ required_ruby_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 2.3.0
75
+ required_rubygems_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ requirements: []
81
+ rubygems_version: 3.3.7
82
+ signing_key:
83
+ specification_version: 4
84
+ summary: Xen wrapper
85
+ test_files: []