nombaone 0.1.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 +7 -0
- data/CHANGELOG.md +36 -0
- data/LICENSE +21 -0
- data/README.md +230 -0
- data/lib/nombaone/client.rb +158 -0
- data/lib/nombaone/errors.rb +286 -0
- data/lib/nombaone/internal/http_client.rb +230 -0
- data/lib/nombaone/internal/util.rb +155 -0
- data/lib/nombaone/object.rb +152 -0
- data/lib/nombaone/pagination.rb +116 -0
- data/lib/nombaone/resources/base_resource.rb +40 -0
- data/lib/nombaone/resources/coupons.rb +84 -0
- data/lib/nombaone/resources/customers.rb +160 -0
- data/lib/nombaone/resources/events.rb +46 -0
- data/lib/nombaone/resources/invoices.rb +61 -0
- data/lib/nombaone/resources/mandates.rb +71 -0
- data/lib/nombaone/resources/metrics.rb +24 -0
- data/lib/nombaone/resources/organization.rb +91 -0
- data/lib/nombaone/resources/payment_methods.rb +102 -0
- data/lib/nombaone/resources/plans.rb +129 -0
- data/lib/nombaone/resources/prices.rb +53 -0
- data/lib/nombaone/resources/sandbox.rb +81 -0
- data/lib/nombaone/resources/settlements.rb +91 -0
- data/lib/nombaone/resources/subscriptions.rb +310 -0
- data/lib/nombaone/resources/webhook_endpoints.rb +140 -0
- data/lib/nombaone/version.rb +7 -0
- data/lib/nombaone/webhook_event.rb +64 -0
- data/lib/nombaone/webhooks.rb +167 -0
- data/lib/nombaone.rb +58 -0
- data/sig/nombaone/client.rbs +36 -0
- data/sig/nombaone/errors.rbs +68 -0
- data/sig/nombaone/internal.rbs +51 -0
- data/sig/nombaone/object.rbs +22 -0
- data/sig/nombaone/pagination.rbs +23 -0
- data/sig/nombaone/resources.rbs +243 -0
- data/sig/nombaone/webhooks.rbs +18 -0
- data/sig/nombaone.rbs +24 -0
- metadata +87 -0
data/lib/nombaone.rb
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "nombaone/version"
|
|
4
|
+
require_relative "nombaone/errors"
|
|
5
|
+
require_relative "nombaone/internal/util"
|
|
6
|
+
require_relative "nombaone/object"
|
|
7
|
+
require_relative "nombaone/pagination"
|
|
8
|
+
require_relative "nombaone/internal/http_client"
|
|
9
|
+
require_relative "nombaone/resources/base_resource"
|
|
10
|
+
require_relative "nombaone/resources/customers"
|
|
11
|
+
require_relative "nombaone/resources/plans"
|
|
12
|
+
require_relative "nombaone/resources/prices"
|
|
13
|
+
require_relative "nombaone/resources/subscriptions"
|
|
14
|
+
require_relative "nombaone/resources/invoices"
|
|
15
|
+
require_relative "nombaone/resources/coupons"
|
|
16
|
+
require_relative "nombaone/resources/payment_methods"
|
|
17
|
+
require_relative "nombaone/resources/mandates"
|
|
18
|
+
require_relative "nombaone/resources/settlements"
|
|
19
|
+
require_relative "nombaone/resources/webhook_endpoints"
|
|
20
|
+
require_relative "nombaone/resources/events"
|
|
21
|
+
require_relative "nombaone/resources/organization"
|
|
22
|
+
require_relative "nombaone/resources/metrics"
|
|
23
|
+
require_relative "nombaone/resources/sandbox"
|
|
24
|
+
require_relative "nombaone/webhook_event"
|
|
25
|
+
require_relative "nombaone/webhooks"
|
|
26
|
+
require_relative "nombaone/client"
|
|
27
|
+
|
|
28
|
+
# NombaOne — recurring billing for Nigeria over card, direct debit, bank
|
|
29
|
+
# transfer, and more, with dunning that recovers and a ledger that never loses
|
|
30
|
+
# a kobo. This module is the SDK's namespace and entrypoint.
|
|
31
|
+
#
|
|
32
|
+
# @example Construct a client
|
|
33
|
+
# nombaone = Nombaone.new(ENV["NOMBAONE_API_KEY"])
|
|
34
|
+
# customer = nombaone.customers.create(email: "ada@example.com", name: "Ada")
|
|
35
|
+
#
|
|
36
|
+
# @example Verify a webhook without a client (only the signing secret is needed)
|
|
37
|
+
# event = Nombaone.webhooks.construct_event(raw_body, signature_header, secret)
|
|
38
|
+
module Nombaone
|
|
39
|
+
# Construct a new API client.
|
|
40
|
+
#
|
|
41
|
+
# @param api_key [String, nil] your secret key (`nbo_sandbox_…` / `nbo_live_…`).
|
|
42
|
+
# Defaults to `ENV["NOMBAONE_API_KEY"]`.
|
|
43
|
+
# @param options [Hash] see {Client#initialize} (`base_url:`, `timeout:`,
|
|
44
|
+
# `max_retries:`, `http:`, `default_headers:`).
|
|
45
|
+
# @return [Nombaone::Client]
|
|
46
|
+
def self.new(api_key = nil, **options)
|
|
47
|
+
Client.new(api_key, **options)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# A shared, keyless {Webhooks} helper for verifying inbound deliveries.
|
|
51
|
+
# Webhook verification needs only the endpoint's signing secret, never an API
|
|
52
|
+
# key — so this is usable in a receiver that never constructs a client.
|
|
53
|
+
#
|
|
54
|
+
# @return [Nombaone::Webhooks]
|
|
55
|
+
def self.webhooks
|
|
56
|
+
@webhooks ||= Webhooks.new
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
module Nombaone
|
|
2
|
+
class Client
|
|
3
|
+
BASE_URLS: Hash[String, String]
|
|
4
|
+
DEFAULT_TIMEOUT: Integer
|
|
5
|
+
DEFAULT_MAX_RETRIES: Integer
|
|
6
|
+
|
|
7
|
+
attr_reader mode: String
|
|
8
|
+
attr_reader base_url: String
|
|
9
|
+
|
|
10
|
+
def initialize: (?String? api_key, ?base_url: String?, ?timeout: Numeric,
|
|
11
|
+
?max_retries: Integer, ?http: untyped, ?default_headers: Hash[String, String]?,
|
|
12
|
+
?sleeper: (^(Numeric) -> void)?) -> void
|
|
13
|
+
|
|
14
|
+
def customers: () -> Nombaone::Resources::Customers
|
|
15
|
+
def plans: () -> Nombaone::Resources::Plans
|
|
16
|
+
def prices: () -> Nombaone::Resources::Prices
|
|
17
|
+
def subscriptions: () -> Nombaone::Resources::Subscriptions
|
|
18
|
+
def invoices: () -> Nombaone::Resources::Invoices
|
|
19
|
+
def coupons: () -> Nombaone::Resources::Coupons
|
|
20
|
+
def payment_methods: () -> Nombaone::Resources::PaymentMethods
|
|
21
|
+
def mandates: () -> Nombaone::Resources::Mandates
|
|
22
|
+
def settlements: () -> Nombaone::Resources::Settlements
|
|
23
|
+
def webhook_endpoints: () -> Nombaone::Resources::WebhookEndpoints
|
|
24
|
+
def events: () -> Nombaone::Resources::Events
|
|
25
|
+
def organization: () -> Nombaone::Resources::Organization
|
|
26
|
+
def metrics: () -> Nombaone::Resources::Metrics
|
|
27
|
+
def sandbox: () -> Nombaone::Resources::Sandbox
|
|
28
|
+
def webhooks: () -> Nombaone::Webhooks
|
|
29
|
+
|
|
30
|
+
def request: (method: Symbol, path: String, ?query: Hash[Symbol, untyped]?,
|
|
31
|
+
?body: Hash[Symbol, untyped]?, ?options: Hash[Symbol, untyped]?)
|
|
32
|
+
-> Nombaone::NombaObject
|
|
33
|
+
def request_page: (method: Symbol, path: String, ?query: Hash[Symbol, untyped]?,
|
|
34
|
+
?options: Hash[Symbol, untyped]?) -> Nombaone::Page
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
module Nombaone
|
|
2
|
+
module ErrorCode
|
|
3
|
+
ALL: Array[String]
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
class Error < StandardError
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
class APIError < Error
|
|
10
|
+
attr_reader status_code: Integer
|
|
11
|
+
attr_reader code: String
|
|
12
|
+
attr_reader hint: String
|
|
13
|
+
attr_reader doc_url: String
|
|
14
|
+
attr_reader fields: Hash[String, Array[String]]?
|
|
15
|
+
attr_reader request_id: String?
|
|
16
|
+
|
|
17
|
+
def initialize: (String message, status_code: Integer, code: String, ?hint: String,
|
|
18
|
+
?doc_url: String, ?fields: Hash[String, Array[String]]?,
|
|
19
|
+
?request_id: String?) -> void
|
|
20
|
+
|
|
21
|
+
def self.from_response: (Integer status, untyped body, untyped headers) -> APIError
|
|
22
|
+
def self.default_code_for_status: (Integer status) -> String
|
|
23
|
+
def self.parse_error_body: (untyped body) -> Hash[Symbol, untyped]
|
|
24
|
+
def self.numeric: (untyped value) -> (Integer | Float)?
|
|
25
|
+
|
|
26
|
+
CLASS_FOR_STATUS: Hash[Integer, singleton(APIError)]
|
|
27
|
+
DEFAULT_CODE_FOR_STATUS: Hash[Integer, String]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
class BadRequestError < APIError
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
class AuthenticationError < APIError
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
class PermissionDeniedError < APIError
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
class NotFoundError < APIError
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
class ConflictError < APIError
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
class ValidationError < APIError
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
class ServerError < APIError
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
class RateLimitError < APIError
|
|
52
|
+
attr_reader retry_after: (Integer | Float)?
|
|
53
|
+
attr_reader limit: (Integer | Float)?
|
|
54
|
+
attr_reader remaining: (Integer | Float)?
|
|
55
|
+
|
|
56
|
+
def initialize: (String message, ?retry_after: (Integer | Float)?, ?limit: (Integer | Float)?,
|
|
57
|
+
?remaining: (Integer | Float)?, **untyped details) -> void
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
class ConnectionError < Error
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
class TimeoutError < ConnectionError
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
class WebhookVerificationError < Error
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
module Nombaone
|
|
2
|
+
module Internal
|
|
3
|
+
OMIT: Object
|
|
4
|
+
|
|
5
|
+
module Util
|
|
6
|
+
PRESERVE_VALUE_KEYS: Array[String]
|
|
7
|
+
|
|
8
|
+
def self?.camelize: (String | Symbol key) -> String
|
|
9
|
+
def self?.deep_camelize_keys: (untyped value) -> untyped
|
|
10
|
+
def self?.serialize_body: (Hash[untyped, untyped] hash) -> Hash[String, untyped]
|
|
11
|
+
def self?.serialize_query: (Hash[untyped, untyped] hash) -> Hash[String, String]
|
|
12
|
+
def self?.encode_path_segment: (untyped value) -> String
|
|
13
|
+
def self?.generate_idempotency_key: () -> String
|
|
14
|
+
def self?.backoff_seconds: (Integer attempt) -> Float
|
|
15
|
+
def self?.retry_after_seconds: (String? raw) -> Float?
|
|
16
|
+
def self?.merge_headers: (*Hash[untyped, untyped]? layers) -> Hash[String, String]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
class Response < Struct[untyped]
|
|
20
|
+
attr_accessor status: Integer
|
|
21
|
+
attr_accessor headers: Hash[String, String]
|
|
22
|
+
attr_accessor body: String?
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
class Result < Struct[untyped]
|
|
26
|
+
attr_accessor data: untyped
|
|
27
|
+
attr_accessor pagination: Hash[Symbol, untyped]?
|
|
28
|
+
attr_accessor request_id: String?
|
|
29
|
+
attr_accessor response: Nombaone::Internal::Response
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
class NetHTTPConnection
|
|
33
|
+
METHOD_CLASSES: Hash[Symbol, untyped]
|
|
34
|
+
|
|
35
|
+
def execute: (method: Symbol, url: String, headers: Hash[String, String], body: String?,
|
|
36
|
+
timeout: Numeric) -> Nombaone::Internal::Response
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
class HTTPClient
|
|
40
|
+
API_PREFIX: String
|
|
41
|
+
RETRYABLE_STATUSES: Array[Integer]
|
|
42
|
+
|
|
43
|
+
def initialize: (api_key: String, base_url: String, timeout: Numeric, max_retries: Integer,
|
|
44
|
+
connection: untyped, ?default_headers: Hash[String, String]?,
|
|
45
|
+
?sleeper: (^(Numeric) -> void)?) -> void
|
|
46
|
+
def request: (method: Symbol, path: String, ?query: Hash[String, String]?,
|
|
47
|
+
?body: Hash[String, untyped]?, ?options: Hash[Symbol, untyped]?)
|
|
48
|
+
-> Nombaone::Internal::Result
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module Nombaone
|
|
2
|
+
class NombaObject
|
|
3
|
+
attr_reader request_id: String?
|
|
4
|
+
attr_reader last_response: untyped
|
|
5
|
+
|
|
6
|
+
def initialize: (untyped values, ?request_id: String?, ?response: untyped) -> void
|
|
7
|
+
def []: (String | Symbol key) -> untyped
|
|
8
|
+
def dig: (*(String | Symbol | Integer) keys) -> untyped
|
|
9
|
+
def key?: (String | Symbol key) -> bool
|
|
10
|
+
alias has_key? key?
|
|
11
|
+
alias member? key?
|
|
12
|
+
def keys: () -> Array[String]
|
|
13
|
+
def to_h: () -> Hash[String, untyped]
|
|
14
|
+
alias to_hash to_h
|
|
15
|
+
def ==: (untyped other) -> bool
|
|
16
|
+
alias eql? ==
|
|
17
|
+
def hash: () -> Integer
|
|
18
|
+
def inspect: () -> String
|
|
19
|
+
def respond_to_missing?: (Symbol name, ?bool include_private) -> bool
|
|
20
|
+
def method_missing: (Symbol name, *untyped args) -> untyped
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Nombaone
|
|
2
|
+
class Page
|
|
3
|
+
include Enumerable[Nombaone::NombaObject]
|
|
4
|
+
|
|
5
|
+
attr_reader data: Array[Nombaone::NombaObject]
|
|
6
|
+
attr_reader request_id: String?
|
|
7
|
+
|
|
8
|
+
def initialize: (fetcher: ^(Hash[Symbol, untyped]) -> untyped, query: Hash[Symbol, untyped],
|
|
9
|
+
result: untyped) -> void
|
|
10
|
+
def limit: () -> Integer
|
|
11
|
+
def has_more?: () -> bool
|
|
12
|
+
def next_cursor: () -> String?
|
|
13
|
+
def next_page?: () -> bool
|
|
14
|
+
alias has_next_page? next_page?
|
|
15
|
+
def pagination: () -> Nombaone::NombaObject
|
|
16
|
+
def next_page: () -> Nombaone::Page
|
|
17
|
+
def each: () { (Nombaone::NombaObject) -> void } -> self
|
|
18
|
+
| () -> Enumerator[Nombaone::NombaObject, self]
|
|
19
|
+
alias auto_paging_each each
|
|
20
|
+
def each_page: () { (Nombaone::Page) -> void } -> self
|
|
21
|
+
| () -> Enumerator[Nombaone::Page, self]
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
module Nombaone
|
|
2
|
+
module Resources
|
|
3
|
+
OMIT: Object
|
|
4
|
+
|
|
5
|
+
class BaseResource
|
|
6
|
+
def initialize: (Nombaone::Client client) -> void
|
|
7
|
+
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
def request: (Symbol method, String path, ?body: Hash[Symbol, untyped]?,
|
|
11
|
+
?query: Hash[Symbol, untyped]?, ?options: Hash[Symbol, untyped])
|
|
12
|
+
-> Nombaone::NombaObject
|
|
13
|
+
def request_page: (String path, ?query: Hash[Symbol, untyped]?,
|
|
14
|
+
?options: Hash[Symbol, untyped]) -> Nombaone::Page
|
|
15
|
+
def encode: (untyped value) -> String
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
class Customers < BaseResource
|
|
19
|
+
def create: (email: String, name: String, ?phone: String?, ?metadata: Nombaone::metadata,
|
|
20
|
+
?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
21
|
+
def retrieve: (String id, ?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
22
|
+
def update: (String id, ?name: String, ?phone: String?, ?metadata: Nombaone::metadata,
|
|
23
|
+
?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
24
|
+
def list: (?email: String, ?limit: Integer, ?cursor: String,
|
|
25
|
+
?request_options: Nombaone::request_options) -> Nombaone::Page
|
|
26
|
+
def apply_discount: (String id, coupon: String,
|
|
27
|
+
?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
28
|
+
def remove_discount: (String id,
|
|
29
|
+
?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
30
|
+
def grant_credit: (String id, amount_in_kobo: Integer, ?source: String,
|
|
31
|
+
?source_reference: String, ?metadata: Nombaone::metadata,
|
|
32
|
+
?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
33
|
+
def retrieve_credit_balance: (String id, ?request_options: Nombaone::request_options)
|
|
34
|
+
-> Nombaone::NombaObject
|
|
35
|
+
def void_credit: (String id, String grant_id, ?request_options: Nombaone::request_options)
|
|
36
|
+
-> Nombaone::NombaObject
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
class PlanPrices < BaseResource
|
|
40
|
+
def create: (String plan_id, unit_amount_in_kobo: Integer, interval: String,
|
|
41
|
+
?interval_count: Integer, ?usage_type: String, ?billing_scheme: String,
|
|
42
|
+
?trial_period_days: Integer, ?metadata: Nombaone::metadata,
|
|
43
|
+
?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
44
|
+
def list: (String plan_id, ?limit: Integer, ?cursor: String,
|
|
45
|
+
?request_options: Nombaone::request_options) -> Nombaone::Page
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
class Plans < BaseResource
|
|
49
|
+
def prices: () -> Nombaone::Resources::PlanPrices
|
|
50
|
+
def create: (name: String, ?description: String, ?metadata: Nombaone::metadata,
|
|
51
|
+
?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
52
|
+
def retrieve: (String id, ?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
53
|
+
def update: (String id, ?name: String, ?description: String?, ?metadata: Nombaone::metadata,
|
|
54
|
+
?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
55
|
+
def list: (?status: String, ?limit: Integer, ?cursor: String,
|
|
56
|
+
?request_options: Nombaone::request_options) -> Nombaone::Page
|
|
57
|
+
def archive: (String id, ?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
class Prices < BaseResource
|
|
61
|
+
def retrieve: (String id, ?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
62
|
+
def list: (?plan_ref: String, ?active: bool, ?limit: Integer, ?cursor: String,
|
|
63
|
+
?request_options: Nombaone::request_options) -> Nombaone::Page
|
|
64
|
+
def deactivate: (String id, ?request_options: Nombaone::request_options)
|
|
65
|
+
-> Nombaone::NombaObject
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
class SubscriptionSchedules < BaseResource
|
|
69
|
+
def create: (String subscription_id, price_id: String, ?quantity: Integer,
|
|
70
|
+
?effective_at: String, ?request_options: Nombaone::request_options)
|
|
71
|
+
-> Nombaone::NombaObject
|
|
72
|
+
def retrieve: (String subscription_id, ?request_options: Nombaone::request_options)
|
|
73
|
+
-> Nombaone::NombaObject
|
|
74
|
+
def release: (String subscription_id, ?request_options: Nombaone::request_options)
|
|
75
|
+
-> Nombaone::NombaObject
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
class SubscriptionDunning < BaseResource
|
|
79
|
+
def retrieve: (String subscription_id, ?request_options: Nombaone::request_options)
|
|
80
|
+
-> Nombaone::NombaObject
|
|
81
|
+
def list_attempts: (String subscription_id, ?limit: Integer, ?cursor: String,
|
|
82
|
+
?request_options: Nombaone::request_options) -> Nombaone::Page
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
class Subscriptions < BaseResource
|
|
86
|
+
def schedule: () -> Nombaone::Resources::SubscriptionSchedules
|
|
87
|
+
def dunning: () -> Nombaone::Resources::SubscriptionDunning
|
|
88
|
+
def create: (customer_id: String, price_id: String, ?payment_method_id: String,
|
|
89
|
+
?collection_method: String, ?trial_days: Integer, ?quantity: Integer,
|
|
90
|
+
?metadata: Nombaone::metadata, ?request_options: Nombaone::request_options)
|
|
91
|
+
-> Nombaone::NombaObject
|
|
92
|
+
def retrieve: (String id, ?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
93
|
+
def update: (String id, ?default_payment_method_id: String, ?metadata: Nombaone::metadata,
|
|
94
|
+
?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
95
|
+
def list: (?customer_id: String, ?status: String, ?limit: Integer, ?cursor: String,
|
|
96
|
+
?request_options: Nombaone::request_options) -> Nombaone::Page
|
|
97
|
+
def list_events: (String id, ?limit: Integer, ?cursor: String,
|
|
98
|
+
?request_options: Nombaone::request_options) -> Nombaone::Page
|
|
99
|
+
def pause: (String id, ?max_days: Integer, ?request_options: Nombaone::request_options)
|
|
100
|
+
-> Nombaone::NombaObject
|
|
101
|
+
def resume: (String id, ?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
102
|
+
def cancel: (String id, ?mode: String, ?comment: String,
|
|
103
|
+
?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
104
|
+
def resubscribe: (String id, ?price_id: String, ?payment_method_id: String,
|
|
105
|
+
?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
106
|
+
def change: (String id, ?price_id: String, ?quantity: Integer, ?interval_switch: bool,
|
|
107
|
+
?proration_behavior: String, ?request_options: Nombaone::request_options)
|
|
108
|
+
-> Nombaone::NombaObject
|
|
109
|
+
def update_payment_method: (String id, ?payment_method_reference: String,
|
|
110
|
+
?checkout_token: String,
|
|
111
|
+
?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
112
|
+
def retrieve_upcoming_invoice: (String id, ?request_options: Nombaone::request_options)
|
|
113
|
+
-> Nombaone::NombaObject
|
|
114
|
+
def apply_discount: (String id, coupon: String,
|
|
115
|
+
?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
116
|
+
def remove_discount: (String id, ?request_options: Nombaone::request_options)
|
|
117
|
+
-> Nombaone::NombaObject
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
class Invoices < BaseResource
|
|
121
|
+
def retrieve: (String id, ?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
122
|
+
def list: (?customer_id: String, ?subscription_id: String, ?status: String, ?limit: Integer,
|
|
123
|
+
?cursor: String, ?request_options: Nombaone::request_options) -> Nombaone::Page
|
|
124
|
+
def void: (String id, ?comment: String, ?request_options: Nombaone::request_options)
|
|
125
|
+
-> Nombaone::NombaObject
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
class Coupons < BaseResource
|
|
129
|
+
def create: (code: String, duration: String, ?amount_off_in_kobo: Integer,
|
|
130
|
+
?percent_off: Integer, ?duration_in_cycles: Integer, ?redeem_by: String,
|
|
131
|
+
?max_redemptions: Integer, ?metadata: Nombaone::metadata,
|
|
132
|
+
?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
133
|
+
def retrieve: (String id, ?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
134
|
+
def update: (String id, ?redeem_by: String, ?max_redemptions: Integer,
|
|
135
|
+
?metadata: Nombaone::metadata, ?request_options: Nombaone::request_options)
|
|
136
|
+
-> Nombaone::NombaObject
|
|
137
|
+
def list: (?limit: Integer, ?cursor: String, ?request_options: Nombaone::request_options)
|
|
138
|
+
-> Nombaone::Page
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
class PaymentMethods < BaseResource
|
|
142
|
+
def setup: (customer_ref: String, amount_in_kobo: Integer, callback_url: String,
|
|
143
|
+
?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
144
|
+
def create_virtual_account: (customer_ref: String, ?expected_amount: Integer,
|
|
145
|
+
?expiry_date: String,
|
|
146
|
+
?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
147
|
+
def retrieve: (String id, ?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
148
|
+
def list: (?customer_ref: String, ?limit: Integer, ?cursor: String,
|
|
149
|
+
?request_options: Nombaone::request_options) -> Nombaone::Page
|
|
150
|
+
def set_default: (String id, ?request_options: Nombaone::request_options)
|
|
151
|
+
-> Nombaone::NombaObject
|
|
152
|
+
def remove: (String id, ?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
class Mandates < BaseResource
|
|
156
|
+
def create: (customer_ref: String, customer_account_number: String, bank_code: String,
|
|
157
|
+
customer_name: String, customer_account_name: String,
|
|
158
|
+
customer_phone_number: String, customer_address: String, narration: String,
|
|
159
|
+
max_amount_in_kobo: Integer, ?frequency: String, ?start_date: String,
|
|
160
|
+
?end_date: String, ?request_options: Nombaone::request_options)
|
|
161
|
+
-> Nombaone::NombaObject
|
|
162
|
+
def retrieve: (String id, ?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
class Settlements < BaseResource
|
|
166
|
+
def retrieve: (String id, ?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
167
|
+
def list: (?status: String, ?limit: Integer, ?cursor: String,
|
|
168
|
+
?request_options: Nombaone::request_options) -> Nombaone::Page
|
|
169
|
+
def retrieve_escrow: (?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
170
|
+
def refund: (String id, ?amount_in_kobo: Integer,
|
|
171
|
+
?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
172
|
+
def create_payout: (amount_in_kobo: Integer, bank_code: String, account_number: String,
|
|
173
|
+
?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
class WebhookEndpointDeliveries < BaseResource
|
|
177
|
+
def list: (String endpoint_id, ?status: String, ?event_type: String, ?endpoint: String,
|
|
178
|
+
?limit: Integer, ?cursor: String, ?request_options: Nombaone::request_options)
|
|
179
|
+
-> Nombaone::Page
|
|
180
|
+
def retrieve: (String endpoint_id, String delivery_id,
|
|
181
|
+
?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
182
|
+
def replay: (String endpoint_id, String delivery_id,
|
|
183
|
+
?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
class WebhookEndpoints < BaseResource
|
|
187
|
+
def deliveries: () -> Nombaone::Resources::WebhookEndpointDeliveries
|
|
188
|
+
def create: (url: String, ?enabled_events: Array[String],
|
|
189
|
+
?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
190
|
+
def retrieve: (String id, ?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
191
|
+
def update: (String id, ?url: String, ?enabled_events: Array[String], ?disabled: bool,
|
|
192
|
+
?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
193
|
+
def list: (?request_options: Nombaone::request_options) -> Nombaone::Page
|
|
194
|
+
def delete: (String id, ?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
195
|
+
def rotate_secret: (String id, ?request_options: Nombaone::request_options)
|
|
196
|
+
-> Nombaone::NombaObject
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
class Events < BaseResource
|
|
200
|
+
def list: (?type: String, ?limit: Integer, ?cursor: String,
|
|
201
|
+
?request_options: Nombaone::request_options) -> Nombaone::Page
|
|
202
|
+
def retrieve: (String id, ?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
203
|
+
def catalog: (?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
class OrganizationBilling < BaseResource
|
|
207
|
+
def retrieve: (?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
208
|
+
def update: (?partial_collection_enabled: bool, ?proration_credit_policy: String,
|
|
209
|
+
?dunning_max_attempts: Integer, ?dunning_intervals_hours: Array[Integer],
|
|
210
|
+
?dunning_max_window_hours: Integer, ?grace_period_hours: Integer,
|
|
211
|
+
?payday_days: Array[Integer], ?payday_pull_forward_days: Integer,
|
|
212
|
+
?payday_bias_enabled: bool, ?default_collection_method: String,
|
|
213
|
+
?comms_enabled: bool, ?request_options: Nombaone::request_options)
|
|
214
|
+
-> Nombaone::NombaObject
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
class Organization < BaseResource
|
|
218
|
+
def billing: () -> Nombaone::Resources::OrganizationBilling
|
|
219
|
+
def retrieve: (?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
220
|
+
def update: (?monthly_request_quota: Integer, ?settlement_mode: String,
|
|
221
|
+
?branding: Hash[Symbol, untyped], ?request_options: Nombaone::request_options)
|
|
222
|
+
-> Nombaone::NombaObject
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
class Metrics < BaseResource
|
|
226
|
+
def billing: (?from: String, ?to: String, ?request_options: Nombaone::request_options)
|
|
227
|
+
-> Nombaone::NombaObject
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
class Sandbox < BaseResource
|
|
231
|
+
def create_payment_method: (customer_id: String, ?behavior: String, ?kind: String,
|
|
232
|
+
?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
233
|
+
def advance_cycle: (String subscription_id, ?request_options: Nombaone::request_options)
|
|
234
|
+
-> Nombaone::NombaObject
|
|
235
|
+
def simulate_webhook: (type: String, ?payload: Hash[Symbol | String, untyped],
|
|
236
|
+
?request_options: Nombaone::request_options) -> Nombaone::NombaObject
|
|
237
|
+
|
|
238
|
+
private
|
|
239
|
+
|
|
240
|
+
def assert_sandbox!: () -> void
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Nombaone
|
|
2
|
+
module WebhookEventType
|
|
3
|
+
ALL: Array[String]
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
class WebhookEvent < Nombaone::NombaObject
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
class Webhooks
|
|
10
|
+
DEFAULT_TOLERANCE_SECONDS: Integer
|
|
11
|
+
|
|
12
|
+
def construct_event: (String payload, String? signature_header, String? secret,
|
|
13
|
+
?tolerance: Numeric) -> Nombaone::WebhookEvent
|
|
14
|
+
def verify_signature: (String payload, String? signature_header, String? secret,
|
|
15
|
+
?tolerance: Numeric) -> bool
|
|
16
|
+
def generate_test_header: (payload: String, secret: String, ?timestamp: Integer?) -> String
|
|
17
|
+
end
|
|
18
|
+
end
|
data/sig/nombaone.rbs
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Type signatures for the NombaOne Ruby SDK.
|
|
2
|
+
|
|
3
|
+
module Nombaone
|
|
4
|
+
VERSION: String
|
|
5
|
+
|
|
6
|
+
# Free-form annotations attached to most resources. Keys are stored verbatim.
|
|
7
|
+
type metadata = Hash[Symbol | String, untyped]
|
|
8
|
+
|
|
9
|
+
# Per-call overrides accepted by every SDK method as `request_options:`.
|
|
10
|
+
# Recognized keys: :idempotency_key, :headers, :timeout, :max_retries, :cancel_when.
|
|
11
|
+
type request_options = Hash[Symbol, untyped]
|
|
12
|
+
|
|
13
|
+
# A single-object request result.
|
|
14
|
+
type record = Nombaone::NombaObject
|
|
15
|
+
|
|
16
|
+
# A list request result.
|
|
17
|
+
type page = Nombaone::Page
|
|
18
|
+
|
|
19
|
+
def self.new: (?String? api_key, ?base_url: String?, ?timeout: Numeric,
|
|
20
|
+
?max_retries: Integer, ?http: untyped, ?default_headers: Hash[String, String]?,
|
|
21
|
+
?sleeper: (^(Numeric) -> void)?) -> Nombaone::Client
|
|
22
|
+
|
|
23
|
+
def self.webhooks: () -> Nombaone::Webhooks
|
|
24
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: nombaone
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Nomba One
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2026-07-07 00:00:00.000000000 Z
|
|
12
|
+
dependencies: []
|
|
13
|
+
description: Recurring billing for Nigeria over card, direct debit, bank transfer,
|
|
14
|
+
and more — with dunning that recovers, idempotency that can never double-charge,
|
|
15
|
+
and a ledger that never loses a kobo. Zero runtime dependencies.
|
|
16
|
+
email:
|
|
17
|
+
- developers@nombaone.xyz
|
|
18
|
+
executables: []
|
|
19
|
+
extensions: []
|
|
20
|
+
extra_rdoc_files: []
|
|
21
|
+
files:
|
|
22
|
+
- CHANGELOG.md
|
|
23
|
+
- LICENSE
|
|
24
|
+
- README.md
|
|
25
|
+
- lib/nombaone.rb
|
|
26
|
+
- lib/nombaone/client.rb
|
|
27
|
+
- lib/nombaone/errors.rb
|
|
28
|
+
- lib/nombaone/internal/http_client.rb
|
|
29
|
+
- lib/nombaone/internal/util.rb
|
|
30
|
+
- lib/nombaone/object.rb
|
|
31
|
+
- lib/nombaone/pagination.rb
|
|
32
|
+
- lib/nombaone/resources/base_resource.rb
|
|
33
|
+
- lib/nombaone/resources/coupons.rb
|
|
34
|
+
- lib/nombaone/resources/customers.rb
|
|
35
|
+
- lib/nombaone/resources/events.rb
|
|
36
|
+
- lib/nombaone/resources/invoices.rb
|
|
37
|
+
- lib/nombaone/resources/mandates.rb
|
|
38
|
+
- lib/nombaone/resources/metrics.rb
|
|
39
|
+
- lib/nombaone/resources/organization.rb
|
|
40
|
+
- lib/nombaone/resources/payment_methods.rb
|
|
41
|
+
- lib/nombaone/resources/plans.rb
|
|
42
|
+
- lib/nombaone/resources/prices.rb
|
|
43
|
+
- lib/nombaone/resources/sandbox.rb
|
|
44
|
+
- lib/nombaone/resources/settlements.rb
|
|
45
|
+
- lib/nombaone/resources/subscriptions.rb
|
|
46
|
+
- lib/nombaone/resources/webhook_endpoints.rb
|
|
47
|
+
- lib/nombaone/version.rb
|
|
48
|
+
- lib/nombaone/webhook_event.rb
|
|
49
|
+
- lib/nombaone/webhooks.rb
|
|
50
|
+
- sig/nombaone.rbs
|
|
51
|
+
- sig/nombaone/client.rbs
|
|
52
|
+
- sig/nombaone/errors.rbs
|
|
53
|
+
- sig/nombaone/internal.rbs
|
|
54
|
+
- sig/nombaone/object.rbs
|
|
55
|
+
- sig/nombaone/pagination.rbs
|
|
56
|
+
- sig/nombaone/resources.rbs
|
|
57
|
+
- sig/nombaone/webhooks.rbs
|
|
58
|
+
homepage: https://nombaone.xyz
|
|
59
|
+
licenses:
|
|
60
|
+
- MIT
|
|
61
|
+
metadata:
|
|
62
|
+
homepage_uri: https://nombaone.xyz
|
|
63
|
+
source_code_uri: https://github.com/nombaone/nombaone-ruby
|
|
64
|
+
changelog_uri: https://github.com/nombaone/nombaone-ruby/blob/main/CHANGELOG.md
|
|
65
|
+
bug_tracker_uri: https://github.com/nombaone/nombaone-ruby/issues
|
|
66
|
+
documentation_uri: https://docs.nombaone.xyz
|
|
67
|
+
rubygems_mfa_required: 'true'
|
|
68
|
+
post_install_message:
|
|
69
|
+
rdoc_options: []
|
|
70
|
+
require_paths:
|
|
71
|
+
- lib
|
|
72
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
73
|
+
requirements:
|
|
74
|
+
- - ">="
|
|
75
|
+
- !ruby/object:Gem::Version
|
|
76
|
+
version: '3.1'
|
|
77
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
78
|
+
requirements:
|
|
79
|
+
- - ">="
|
|
80
|
+
- !ruby/object:Gem::Version
|
|
81
|
+
version: '0'
|
|
82
|
+
requirements: []
|
|
83
|
+
rubygems_version: 3.5.22
|
|
84
|
+
signing_key:
|
|
85
|
+
specification_version: 4
|
|
86
|
+
summary: The official Ruby SDK for the NombaOne subscription-billing API.
|
|
87
|
+
test_files: []
|