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.
Files changed (38) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +36 -0
  3. data/LICENSE +21 -0
  4. data/README.md +230 -0
  5. data/lib/nombaone/client.rb +158 -0
  6. data/lib/nombaone/errors.rb +286 -0
  7. data/lib/nombaone/internal/http_client.rb +230 -0
  8. data/lib/nombaone/internal/util.rb +155 -0
  9. data/lib/nombaone/object.rb +152 -0
  10. data/lib/nombaone/pagination.rb +116 -0
  11. data/lib/nombaone/resources/base_resource.rb +40 -0
  12. data/lib/nombaone/resources/coupons.rb +84 -0
  13. data/lib/nombaone/resources/customers.rb +160 -0
  14. data/lib/nombaone/resources/events.rb +46 -0
  15. data/lib/nombaone/resources/invoices.rb +61 -0
  16. data/lib/nombaone/resources/mandates.rb +71 -0
  17. data/lib/nombaone/resources/metrics.rb +24 -0
  18. data/lib/nombaone/resources/organization.rb +91 -0
  19. data/lib/nombaone/resources/payment_methods.rb +102 -0
  20. data/lib/nombaone/resources/plans.rb +129 -0
  21. data/lib/nombaone/resources/prices.rb +53 -0
  22. data/lib/nombaone/resources/sandbox.rb +81 -0
  23. data/lib/nombaone/resources/settlements.rb +91 -0
  24. data/lib/nombaone/resources/subscriptions.rb +310 -0
  25. data/lib/nombaone/resources/webhook_endpoints.rb +140 -0
  26. data/lib/nombaone/version.rb +7 -0
  27. data/lib/nombaone/webhook_event.rb +64 -0
  28. data/lib/nombaone/webhooks.rb +167 -0
  29. data/lib/nombaone.rb +58 -0
  30. data/sig/nombaone/client.rbs +36 -0
  31. data/sig/nombaone/errors.rbs +68 -0
  32. data/sig/nombaone/internal.rbs +51 -0
  33. data/sig/nombaone/object.rbs +22 -0
  34. data/sig/nombaone/pagination.rbs +23 -0
  35. data/sig/nombaone/resources.rbs +243 -0
  36. data/sig/nombaone/webhooks.rbs +18 -0
  37. data/sig/nombaone.rbs +24 -0
  38. 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: []