pago-sdk 1.0.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/LICENSE +21 -0
- data/README.md +131 -0
- data/lib/pago/base_client.rb +116 -0
- data/lib/pago/errors.rb +83 -0
- data/lib/pago/http.rb +78 -0
- data/lib/pago/model.rb +86 -0
- data/lib/pago/paginator.rb +67 -0
- data/lib/pago/serde.rb +186 -0
- data/lib/pago/service.rb +17 -0
- data/lib/pago/v2026_04/client.rb +124 -0
- data/lib/pago/v2026_04/enums.rb +4552 -0
- data/lib/pago/v2026_04/errors.rb +1121 -0
- data/lib/pago/v2026_04/models.rb +46344 -0
- data/lib/pago/v2026_04/services/benefit_grants.rb +48 -0
- data/lib/pago/v2026_04/services/benefits.rb +179 -0
- data/lib/pago/v2026_04/services/checkout_links.rb +131 -0
- data/lib/pago/v2026_04/services/checkouts.rb +185 -0
- data/lib/pago/v2026_04/services/custom_fields.rb +132 -0
- data/lib/pago/v2026_04/services/customer_meters.rb +69 -0
- data/lib/pago/v2026_04/services/customer_portal.rb +1181 -0
- data/lib/pago/v2026_04/services/customer_seats.rb +137 -0
- data/lib/pago/v2026_04/services/customer_sessions.rb +35 -0
- data/lib/pago/v2026_04/services/customers.rb +556 -0
- data/lib/pago/v2026_04/services/discounts.rb +131 -0
- data/lib/pago/v2026_04/services/disputes.rb +93 -0
- data/lib/pago/v2026_04/services/event_types.rb +74 -0
- data/lib/pago/v2026_04/services/events.rb +126 -0
- data/lib/pago/v2026_04/services/files.rb +135 -0
- data/lib/pago/v2026_04/services/license_keys.rb +183 -0
- data/lib/pago/v2026_04/services/members.rb +47 -0
- data/lib/pago/v2026_04/services/meters.rb +142 -0
- data/lib/pago/v2026_04/services/metrics.rb +188 -0
- data/lib/pago/v2026_04/services/oauth2.rb +175 -0
- data/lib/pago/v2026_04/services/orders.rb +238 -0
- data/lib/pago/v2026_04/services/organizations.rb +113 -0
- data/lib/pago/v2026_04/services/payments.rb +72 -0
- data/lib/pago/v2026_04/services/products.rb +142 -0
- data/lib/pago/v2026_04/services/refunds.rb +73 -0
- data/lib/pago/v2026_04/services/subscriptions.rb +171 -0
- data/lib/pago/v2026_04/services/webhooks.rb +212 -0
- data/lib/pago/v2026_04/unions.rb +739 -0
- data/lib/pago/v2026_04/webhooks.rb +86 -0
- data/lib/pago/version.rb +5 -0
- data/lib/pago/webhooks.rb +159 -0
- data/lib/pago.rb +39 -0
- data/sig/pago/v2026_04/generated.rbs +12401 -0
- data/sig/pago.rbs +204 -0
- metadata +91 -0
data/lib/pago/serde.rb
ADDED
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pago
|
|
4
|
+
# Sentinel telling an attribute apart from one explicitly set to `nil`.
|
|
5
|
+
#
|
|
6
|
+
# Model attributes default to `UNSET`; only the attributes that were given a
|
|
7
|
+
# value are serialized back to JSON, so a partial update never sends `null`
|
|
8
|
+
# for the fields it does not touch.
|
|
9
|
+
UNSET = Object.new
|
|
10
|
+
def UNSET.inspect = "Pago::UNSET"
|
|
11
|
+
def UNSET.to_s = "Pago::UNSET"
|
|
12
|
+
UNSET.freeze
|
|
13
|
+
|
|
14
|
+
# JSON conversion helpers shared by every generated model and service.
|
|
15
|
+
module Serde
|
|
16
|
+
module_function
|
|
17
|
+
|
|
18
|
+
# @return [Hash, nil] the value when it is a JSON object, nil otherwise.
|
|
19
|
+
def object(data)
|
|
20
|
+
return nil if data.nil?
|
|
21
|
+
|
|
22
|
+
data.is_a?(Hash) ? data : nil
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Map a JSON array through the given block, preserving nil.
|
|
26
|
+
def array(value)
|
|
27
|
+
return nil if value.nil?
|
|
28
|
+
return value unless value.is_a?(Array)
|
|
29
|
+
|
|
30
|
+
value.map { |item| yield(item) }
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Map the values of a JSON object through the given block, preserving nil.
|
|
34
|
+
def map(value)
|
|
35
|
+
return nil if value.nil?
|
|
36
|
+
return value unless value.is_a?(Hash)
|
|
37
|
+
|
|
38
|
+
value.each_with_object({}) { |(key, item), result| result[key] = yield(item) }
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Recursively convert models, arrays and hashes into JSON-ready values.
|
|
42
|
+
def dump(value)
|
|
43
|
+
case value
|
|
44
|
+
when ::Pago::Model then value.to_json_hash
|
|
45
|
+
when Array then value.map { |item| dump(item) }
|
|
46
|
+
when Hash
|
|
47
|
+
value.each_with_object({}) do |(key, item), result|
|
|
48
|
+
result[key.is_a?(Symbol) ? key.to_s : key] = dump(item)
|
|
49
|
+
end
|
|
50
|
+
when Symbol then value.to_s
|
|
51
|
+
else value
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Resolve a union payload to one of its variants.
|
|
56
|
+
#
|
|
57
|
+
# A discriminated union dispatches on its discriminator property. Otherwise
|
|
58
|
+
# the candidate models are scored against the payload: a candidate is
|
|
59
|
+
# eligible only when every key its schema requires is present, and the one
|
|
60
|
+
# matching the most keys wins. A union whose variants are themselves unions
|
|
61
|
+
# contributes the variant its own discriminator selects, falling back to all
|
|
62
|
+
# of them. When nothing matches, the raw payload is returned untouched
|
|
63
|
+
# rather than raising, so a variant added server side never breaks a client.
|
|
64
|
+
def union(data, discriminator: nil, mapping: nil, variants: [])
|
|
65
|
+
return nil if data.nil?
|
|
66
|
+
return data unless data.is_a?(Hash)
|
|
67
|
+
|
|
68
|
+
if discriminator && mapping
|
|
69
|
+
variant = mapping[data[discriminator]]
|
|
70
|
+
return variant.from_json(data) if variant.respond_to?(:from_json)
|
|
71
|
+
return data if data.key?(discriminator)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
variant = best_variant(data, candidates(data, variants))
|
|
75
|
+
variant ? variant.from_json(data) : data
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# @return [Array<Class>] the concrete models a payload could be resolved to.
|
|
79
|
+
#
|
|
80
|
+
# A tagged union whose tag the payload carries but this release does not
|
|
81
|
+
# know contributes nothing: the payload states it is a variant we cannot
|
|
82
|
+
# name, so scoring it against the variants we do know would mislabel it.
|
|
83
|
+
def candidates(data, variants, seen = [])
|
|
84
|
+
variants.flat_map do |variant|
|
|
85
|
+
if union_module?(variant)
|
|
86
|
+
next [] if seen.include?(variant)
|
|
87
|
+
|
|
88
|
+
nested = dispatch_variant(data, variant)
|
|
89
|
+
next candidates(data, [nested], seen + [variant]) if nested
|
|
90
|
+
next [] if tagged?(data, variant)
|
|
91
|
+
|
|
92
|
+
candidates(data, variant.variants, seen + [variant])
|
|
93
|
+
elsif variant.respond_to?(:json_keys)
|
|
94
|
+
[variant]
|
|
95
|
+
else
|
|
96
|
+
[]
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# @return [Boolean] whether the payload carries this union's discriminator.
|
|
102
|
+
def tagged?(data, union_module)
|
|
103
|
+
return false unless union_module.const_defined?(:DISCRIMINATOR, false)
|
|
104
|
+
|
|
105
|
+
discriminator = union_module.const_get(:DISCRIMINATOR)
|
|
106
|
+
!discriminator.nil? && !union_module.mapping.nil? && data.key?(discriminator)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# @return [Class, nil] the variant whose declared keys best match the payload.
|
|
110
|
+
def best_variant(data, variants)
|
|
111
|
+
keys = data.keys.map(&:to_s)
|
|
112
|
+
best = nil
|
|
113
|
+
best_score = -1
|
|
114
|
+
variants.each do |variant|
|
|
115
|
+
next unless variant.respond_to?(:json_keys) && variant.respond_to?(:required_json_keys)
|
|
116
|
+
next unless (variant.required_json_keys - keys).empty?
|
|
117
|
+
|
|
118
|
+
score = (variant.json_keys.values & keys).size
|
|
119
|
+
if score > best_score
|
|
120
|
+
best = variant
|
|
121
|
+
best_score = score
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
best
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# @return [Boolean] whether the variant is a generated union factory module.
|
|
128
|
+
def union_module?(variant)
|
|
129
|
+
variant.is_a?(Module) && !variant.is_a?(Class) &&
|
|
130
|
+
variant.respond_to?(:variants) && variant.respond_to?(:mapping)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# @return [Class, Module, nil] the variant a nested union's discriminator selects.
|
|
134
|
+
def dispatch_variant(data, union_module)
|
|
135
|
+
return nil unless union_module.const_defined?(:DISCRIMINATOR, false)
|
|
136
|
+
|
|
137
|
+
discriminator = union_module.const_get(:DISCRIMINATOR)
|
|
138
|
+
mapping = union_module.mapping
|
|
139
|
+
return nil if discriminator.nil? || mapping.nil?
|
|
140
|
+
|
|
141
|
+
mapping[data[discriminator]]
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# Interpolate `{name}` placeholders of a path template.
|
|
145
|
+
def path(template, params = {})
|
|
146
|
+
template.gsub(/\{(\w+)\}/) do
|
|
147
|
+
name = Regexp.last_match(1)
|
|
148
|
+
value = params[name]
|
|
149
|
+
raise ::Pago::Error, "Missing value for path parameter #{name.inspect}" if value.nil?
|
|
150
|
+
|
|
151
|
+
::URI.encode_www_form_component(scalar(value)).gsub("+", "%20")
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# Flatten query parameters into `[name, value]` pairs.
|
|
156
|
+
#
|
|
157
|
+
# Nil values are dropped, arrays repeat the parameter and hashes are encoded
|
|
158
|
+
# as `name[key]=value`, matching the deep-object style used by the API.
|
|
159
|
+
def query(params = {})
|
|
160
|
+
pairs = []
|
|
161
|
+
params.each do |name, value|
|
|
162
|
+
next if value.nil?
|
|
163
|
+
|
|
164
|
+
case value
|
|
165
|
+
when Hash
|
|
166
|
+
value.each do |key, nested|
|
|
167
|
+
pairs << ["#{name}[#{key}]", scalar(nested)] unless nested.nil?
|
|
168
|
+
end
|
|
169
|
+
when Array
|
|
170
|
+
value.each { |item| pairs << [name.to_s, scalar(item)] unless item.nil? }
|
|
171
|
+
else
|
|
172
|
+
pairs << [name.to_s, scalar(value)]
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
pairs
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
# @return [String] the query string representation of a scalar value.
|
|
179
|
+
def scalar(value)
|
|
180
|
+
case value
|
|
181
|
+
when Time then value.utc.strftime("%Y-%m-%dT%H:%M:%SZ")
|
|
182
|
+
else value.to_s
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
end
|
data/lib/pago/service.rb
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pago
|
|
4
|
+
# Base class of every generated service.
|
|
5
|
+
#
|
|
6
|
+
# Services are thin: they hold the client and build requests. Nested services
|
|
7
|
+
# share the very same client instance.
|
|
8
|
+
class Service
|
|
9
|
+
# @return [Pago::BaseClient]
|
|
10
|
+
attr_reader :client
|
|
11
|
+
|
|
12
|
+
# @param client [Pago::BaseClient]
|
|
13
|
+
def initialize(client)
|
|
14
|
+
@client = client
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "services/organizations"
|
|
4
|
+
require_relative "services/subscriptions"
|
|
5
|
+
require_relative "services/oauth2"
|
|
6
|
+
require_relative "services/benefits"
|
|
7
|
+
require_relative "services/benefit_grants"
|
|
8
|
+
require_relative "services/webhooks"
|
|
9
|
+
require_relative "services/products"
|
|
10
|
+
require_relative "services/orders"
|
|
11
|
+
require_relative "services/refunds"
|
|
12
|
+
require_relative "services/disputes"
|
|
13
|
+
require_relative "services/checkouts"
|
|
14
|
+
require_relative "services/files"
|
|
15
|
+
require_relative "services/metrics"
|
|
16
|
+
require_relative "services/license_keys"
|
|
17
|
+
require_relative "services/checkout_links"
|
|
18
|
+
require_relative "services/custom_fields"
|
|
19
|
+
require_relative "services/discounts"
|
|
20
|
+
require_relative "services/customers"
|
|
21
|
+
require_relative "services/members"
|
|
22
|
+
require_relative "services/customer_portal"
|
|
23
|
+
require_relative "services/customer_seats"
|
|
24
|
+
require_relative "services/customer_sessions"
|
|
25
|
+
require_relative "services/events"
|
|
26
|
+
require_relative "services/event_types"
|
|
27
|
+
require_relative "services/meters"
|
|
28
|
+
require_relative "services/customer_meters"
|
|
29
|
+
require_relative "services/payments"
|
|
30
|
+
|
|
31
|
+
module Pago
|
|
32
|
+
module V2026_04
|
|
33
|
+
# Client for version 2026-04 of the Pago API.
|
|
34
|
+
#
|
|
35
|
+
# @example
|
|
36
|
+
# client = Pago::V2026_04::Client.new(access_token: ENV.fetch("PAGO_ACCESS_TOKEN"))
|
|
37
|
+
# client.organizations
|
|
38
|
+
class Client < ::Pago::BaseClient
|
|
39
|
+
API_VERSION = "2026-04"
|
|
40
|
+
|
|
41
|
+
# @return [Services::Organizations]
|
|
42
|
+
def organizations = @organizations ||= Services::Organizations.new(self)
|
|
43
|
+
|
|
44
|
+
# @return [Services::Subscriptions]
|
|
45
|
+
def subscriptions = @subscriptions ||= Services::Subscriptions.new(self)
|
|
46
|
+
|
|
47
|
+
# @return [Services::Oauth2]
|
|
48
|
+
def oauth2 = @oauth2 ||= Services::Oauth2.new(self)
|
|
49
|
+
|
|
50
|
+
# @return [Services::Benefits]
|
|
51
|
+
def benefits = @benefits ||= Services::Benefits.new(self)
|
|
52
|
+
|
|
53
|
+
# @return [Services::BenefitGrants]
|
|
54
|
+
def benefit_grants = @benefit_grants ||= Services::BenefitGrants.new(self)
|
|
55
|
+
|
|
56
|
+
# @return [Services::Webhooks]
|
|
57
|
+
def webhooks = @webhooks ||= Services::Webhooks.new(self)
|
|
58
|
+
|
|
59
|
+
# @return [Services::Products]
|
|
60
|
+
def products = @products ||= Services::Products.new(self)
|
|
61
|
+
|
|
62
|
+
# @return [Services::Orders]
|
|
63
|
+
def orders = @orders ||= Services::Orders.new(self)
|
|
64
|
+
|
|
65
|
+
# @return [Services::Refunds]
|
|
66
|
+
def refunds = @refunds ||= Services::Refunds.new(self)
|
|
67
|
+
|
|
68
|
+
# @return [Services::Disputes]
|
|
69
|
+
def disputes = @disputes ||= Services::Disputes.new(self)
|
|
70
|
+
|
|
71
|
+
# @return [Services::Checkouts]
|
|
72
|
+
def checkouts = @checkouts ||= Services::Checkouts.new(self)
|
|
73
|
+
|
|
74
|
+
# @return [Services::Files]
|
|
75
|
+
def files = @files ||= Services::Files.new(self)
|
|
76
|
+
|
|
77
|
+
# @return [Services::Metrics]
|
|
78
|
+
def metrics = @metrics ||= Services::Metrics.new(self)
|
|
79
|
+
|
|
80
|
+
# @return [Services::LicenseKeys]
|
|
81
|
+
def license_keys = @license_keys ||= Services::LicenseKeys.new(self)
|
|
82
|
+
|
|
83
|
+
# @return [Services::CheckoutLinks]
|
|
84
|
+
def checkout_links = @checkout_links ||= Services::CheckoutLinks.new(self)
|
|
85
|
+
|
|
86
|
+
# @return [Services::CustomFields]
|
|
87
|
+
def custom_fields = @custom_fields ||= Services::CustomFields.new(self)
|
|
88
|
+
|
|
89
|
+
# @return [Services::Discounts]
|
|
90
|
+
def discounts = @discounts ||= Services::Discounts.new(self)
|
|
91
|
+
|
|
92
|
+
# @return [Services::Customers]
|
|
93
|
+
def customers = @customers ||= Services::Customers.new(self)
|
|
94
|
+
|
|
95
|
+
# @return [Services::Members]
|
|
96
|
+
def members = @members ||= Services::Members.new(self)
|
|
97
|
+
|
|
98
|
+
# @return [Services::CustomerPortal]
|
|
99
|
+
def customer_portal = @customer_portal ||= Services::CustomerPortal.new(self)
|
|
100
|
+
|
|
101
|
+
# @return [Services::CustomerSeats]
|
|
102
|
+
def customer_seats = @customer_seats ||= Services::CustomerSeats.new(self)
|
|
103
|
+
|
|
104
|
+
# @return [Services::CustomerSessions]
|
|
105
|
+
def customer_sessions = @customer_sessions ||= Services::CustomerSessions.new(self)
|
|
106
|
+
|
|
107
|
+
# @return [Services::Events]
|
|
108
|
+
def events = @events ||= Services::Events.new(self)
|
|
109
|
+
|
|
110
|
+
# @return [Services::EventTypes]
|
|
111
|
+
def event_types = @event_types ||= Services::EventTypes.new(self)
|
|
112
|
+
|
|
113
|
+
# @return [Services::Meters]
|
|
114
|
+
def meters = @meters ||= Services::Meters.new(self)
|
|
115
|
+
|
|
116
|
+
# @return [Services::CustomerMeters]
|
|
117
|
+
def customer_meters = @customer_meters ||= Services::CustomerMeters.new(self)
|
|
118
|
+
|
|
119
|
+
# @return [Services::Payments]
|
|
120
|
+
def payments = @payments ||= Services::Payments.new(self)
|
|
121
|
+
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|