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.
Files changed (49) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +131 -0
  4. data/lib/pago/base_client.rb +116 -0
  5. data/lib/pago/errors.rb +83 -0
  6. data/lib/pago/http.rb +78 -0
  7. data/lib/pago/model.rb +86 -0
  8. data/lib/pago/paginator.rb +67 -0
  9. data/lib/pago/serde.rb +186 -0
  10. data/lib/pago/service.rb +17 -0
  11. data/lib/pago/v2026_04/client.rb +124 -0
  12. data/lib/pago/v2026_04/enums.rb +4552 -0
  13. data/lib/pago/v2026_04/errors.rb +1121 -0
  14. data/lib/pago/v2026_04/models.rb +46344 -0
  15. data/lib/pago/v2026_04/services/benefit_grants.rb +48 -0
  16. data/lib/pago/v2026_04/services/benefits.rb +179 -0
  17. data/lib/pago/v2026_04/services/checkout_links.rb +131 -0
  18. data/lib/pago/v2026_04/services/checkouts.rb +185 -0
  19. data/lib/pago/v2026_04/services/custom_fields.rb +132 -0
  20. data/lib/pago/v2026_04/services/customer_meters.rb +69 -0
  21. data/lib/pago/v2026_04/services/customer_portal.rb +1181 -0
  22. data/lib/pago/v2026_04/services/customer_seats.rb +137 -0
  23. data/lib/pago/v2026_04/services/customer_sessions.rb +35 -0
  24. data/lib/pago/v2026_04/services/customers.rb +556 -0
  25. data/lib/pago/v2026_04/services/discounts.rb +131 -0
  26. data/lib/pago/v2026_04/services/disputes.rb +93 -0
  27. data/lib/pago/v2026_04/services/event_types.rb +74 -0
  28. data/lib/pago/v2026_04/services/events.rb +126 -0
  29. data/lib/pago/v2026_04/services/files.rb +135 -0
  30. data/lib/pago/v2026_04/services/license_keys.rb +183 -0
  31. data/lib/pago/v2026_04/services/members.rb +47 -0
  32. data/lib/pago/v2026_04/services/meters.rb +142 -0
  33. data/lib/pago/v2026_04/services/metrics.rb +188 -0
  34. data/lib/pago/v2026_04/services/oauth2.rb +175 -0
  35. data/lib/pago/v2026_04/services/orders.rb +238 -0
  36. data/lib/pago/v2026_04/services/organizations.rb +113 -0
  37. data/lib/pago/v2026_04/services/payments.rb +72 -0
  38. data/lib/pago/v2026_04/services/products.rb +142 -0
  39. data/lib/pago/v2026_04/services/refunds.rb +73 -0
  40. data/lib/pago/v2026_04/services/subscriptions.rb +171 -0
  41. data/lib/pago/v2026_04/services/webhooks.rb +212 -0
  42. data/lib/pago/v2026_04/unions.rb +739 -0
  43. data/lib/pago/v2026_04/webhooks.rb +86 -0
  44. data/lib/pago/version.rb +5 -0
  45. data/lib/pago/webhooks.rb +159 -0
  46. data/lib/pago.rb +39 -0
  47. data/sig/pago/v2026_04/generated.rbs +12401 -0
  48. data/sig/pago.rbs +204 -0
  49. 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
@@ -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