inttegro 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 (46) hide show
  1. checksums.yaml +7 -0
  2. data/.dockerignore +9 -0
  3. data/CHANGELOG.md +17 -0
  4. data/Dockerfile +23 -0
  5. data/LICENSE +21 -0
  6. data/README.md +104 -0
  7. data/Rakefile +50 -0
  8. data/lib/inttegro/client.rb +159 -0
  9. data/lib/inttegro/enums.rb +6 -0
  10. data/lib/inttegro/errors.rb +128 -0
  11. data/lib/inttegro/file_download.rb +29 -0
  12. data/lib/inttegro/generated/enums.rb +693 -0
  13. data/lib/inttegro/generated/models.rb +3840 -0
  14. data/lib/inttegro/generated/operations.rb +369 -0
  15. data/lib/inttegro/http_client.rb +639 -0
  16. data/lib/inttegro/models.rb +132 -0
  17. data/lib/inttegro/resources/apps.rb +24 -0
  18. data/lib/inttegro/resources/balance_transactions.rb +28 -0
  19. data/lib/inttegro/resources/balances.rb +16 -0
  20. data/lib/inttegro/resources/broadcasts.rb +28 -0
  21. data/lib/inttegro/resources/chimes.rb +32 -0
  22. data/lib/inttegro/resources/customers.rb +28 -0
  23. data/lib/inttegro/resources/file_links.rb +50 -0
  24. data/lib/inttegro/resources/file_references.rb +20 -0
  25. data/lib/inttegro/resources/files.rb +39 -0
  26. data/lib/inttegro/resources/financial_accounts.rb +104 -0
  27. data/lib/inttegro/resources/keys.rb +60 -0
  28. data/lib/inttegro/resources/message_templates.rb +78 -0
  29. data/lib/inttegro/resources/orders.rb +422 -0
  30. data/lib/inttegro/resources/otp.rb +30 -0
  31. data/lib/inttegro/resources/payment_methods.rb +250 -0
  32. data/lib/inttegro/resources/payouts.rb +200 -0
  33. data/lib/inttegro/resources/prices.rb +40 -0
  34. data/lib/inttegro/resources/products.rb +48 -0
  35. data/lib/inttegro/resources/purchase_intents.rb +44 -0
  36. data/lib/inttegro/resources/refunds.rb +36 -0
  37. data/lib/inttegro/resources/schedules.rb +28 -0
  38. data/lib/inttegro/resources/spec.rb +16 -0
  39. data/lib/inttegro/resources/upload_requests.rb +66 -0
  40. data/lib/inttegro/response_object.rb +86 -0
  41. data/lib/inttegro/transport_response.rb +65 -0
  42. data/lib/inttegro/types.rb +32 -0
  43. data/lib/inttegro/version.rb +6 -0
  44. data/lib/inttegro.rb +14 -0
  45. data/rbi/inttegro/generated.rbi +529 -0
  46. metadata +107 -0
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+ # typed: strict
3
+
4
+ module Inttegro
5
+ module Resources
6
+ class UploadRequests
7
+ def initialize(http)
8
+ @http = T.let(http, Inttegro::HTTPClient)
9
+ end
10
+
11
+ def create(payload, idempotency_key: nil)
12
+ @http.post_model(
13
+ "/upload_requests/create",
14
+ Inttegro::Models::UploadRequestResponse,
15
+ payload,
16
+ headers: headers(idempotency_key)
17
+ )
18
+ end
19
+
20
+ def lookup(id:)
21
+ @http.post_model(
22
+ "/upload_requests/lookup",
23
+ Inttegro::Models::UploadRequestWithAttemptResponse,
24
+ { id: id }
25
+ )
26
+ end
27
+
28
+ def page(payload = {})
29
+ @http.post_model("/upload_requests/page", Inttegro::Models::UploadRequestPageResponse, payload || {})
30
+ end
31
+
32
+ def cancel(payload, idempotency_key: nil)
33
+ @http.post_model(
34
+ "/upload_requests/cancel",
35
+ Inttegro::Models::UploadRequestResponse,
36
+ payload,
37
+ headers: headers(idempotency_key)
38
+ )
39
+ end
40
+
41
+ def review(payload, idempotency_key: nil)
42
+ @http.post_model(
43
+ "/upload_requests/review",
44
+ Inttegro::Models::UploadRequestWithAttemptResponse,
45
+ payload,
46
+ headers: headers(idempotency_key)
47
+ )
48
+ end
49
+
50
+ def fulfill(upload_url:, file:)
51
+ @http.post_multipart_model(
52
+ upload_url,
53
+ Inttegro::Models::FulfillUploadRequestResponse,
54
+ files: { file: file },
55
+ authenticated: false
56
+ )
57
+ end
58
+
59
+ private
60
+
61
+ def headers(idempotency_key)
62
+ idempotency_key ? { "Idempotency-Key" => idempotency_key } : {}
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+ # typed: strict
3
+
4
+ require "sorbet-runtime"
5
+
6
+ require_relative "models"
7
+ require_relative "types"
8
+
9
+ module Inttegro
10
+ # Lightweight wrapper for API responses that allows both hash-style and
11
+ # method-style access while keeping values serializable.
12
+ class ResponseObject
13
+ extend T::Sig
14
+
15
+ sig { params(data: Types::Payload).void }
16
+ def initialize(data = {})
17
+ @data = T.let({}, T::Hash[String, Object])
18
+ set_data(data)
19
+ end
20
+
21
+ sig { params(key: Types::Key).returns(Object) }
22
+ def [](key)
23
+ @data[key.to_s]
24
+ end
25
+
26
+ sig { returns(T::Hash[String, Object]) }
27
+ def to_h
28
+ @data.transform_values { |value| deep_unwrap(value) }
29
+ end
30
+
31
+ sig { params(klass: T::Class[T::Struct]).returns(T::Struct) }
32
+ def deserialize(klass)
33
+ Inttegro::Models.deserialize(to_h, klass)
34
+ end
35
+
36
+ sig { params(name: Symbol, include_private: T::Boolean).returns(T::Boolean) }
37
+ def respond_to_missing?(name, include_private = false)
38
+ @data.key?(name.to_s) || super
39
+ end
40
+
41
+ private
42
+
43
+ sig { params(data: Types::Payload).void }
44
+ def set_data(data)
45
+ data.each do |key, value|
46
+ @data[key.to_s] = wrap(value)
47
+ end
48
+ end
49
+
50
+ sig { params(value: Object).returns(Object) }
51
+ def wrap(value)
52
+ case value
53
+ when Hash
54
+ self.class.new(value)
55
+ when Array
56
+ value.map { |item| wrap(item) }
57
+ else
58
+ value
59
+ end
60
+ end
61
+
62
+ sig { params(value: Object).returns(Object) }
63
+ def deep_unwrap(value)
64
+ case value
65
+ when ResponseObject
66
+ value.to_h
67
+ when Hash
68
+ value.transform_values { |v| deep_unwrap(v) }
69
+ when Array
70
+ value.map { |v| deep_unwrap(v) }
71
+ else
72
+ value
73
+ end
74
+ end
75
+
76
+ sig do
77
+ params(name: Symbol, args: Object, block: T.nilable(Proc)).returns(Object)
78
+ end
79
+ def method_missing(name, *args, &block)
80
+ key = name.to_s
81
+ return @data[key] if @data.key?(key)
82
+
83
+ super
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+ # typed: strict
3
+
4
+ require "sorbet-runtime"
5
+
6
+ require_relative "types"
7
+
8
+ module Inttegro
9
+ # Normalizes Net::HTTP and custom adapter responses at the SDK boundary.
10
+ # Adapter objects are deliberately accepted as Object and validated here so
11
+ # unknown values cannot flow unchecked through the rest of the SDK.
12
+ class TransportResponse
13
+ extend T::Sig
14
+
15
+ sig { returns(String) }
16
+ attr_reader :code, :body, :message
17
+
18
+ sig { returns(Types::ResponseHeaders) }
19
+ attr_reader :headers
20
+
21
+ sig { params(response: Object).void }
22
+ def initialize(response)
23
+ @code = T.let(read_string(response, :code), String)
24
+ @body = T.let(read_string(response, :body), String)
25
+ @message = T.let(read_string(response, :message), String)
26
+ @headers = T.let(normalize_headers(read_headers(response)), Types::ResponseHeaders)
27
+ end
28
+
29
+ sig { params(name: String).returns(T.nilable(String)) }
30
+ def [](name)
31
+ pair = @headers.find { |key, _values| key.casecmp?(name) }
32
+ pair&.last&.first
33
+ end
34
+
35
+ private
36
+
37
+ sig { params(response: Object, name: Symbol).returns(String) }
38
+ def read_string(response, name)
39
+ unless response.respond_to?(name)
40
+ raise TypeError, "HTTP adapter response must respond to ##{name}"
41
+ end
42
+
43
+ value = response.public_send(name)
44
+ value.nil? ? "" : value.to_s
45
+ end
46
+
47
+ sig { params(response: Object).returns(Object) }
48
+ def read_headers(response)
49
+ return response.public_send(:headers) if response.respond_to?(:headers)
50
+ return response.public_send(:to_hash) if response.respond_to?(:to_hash)
51
+
52
+ {}
53
+ end
54
+
55
+ sig { params(value: Object).returns(Types::ResponseHeaders) }
56
+ def normalize_headers(value)
57
+ return {} unless value.is_a?(Hash)
58
+
59
+ value.each_with_object({}) do |(key, header_value), output|
60
+ values = header_value.is_a?(Array) ? header_value.map(&:to_s) : [header_value.to_s]
61
+ output[key.to_s] = values
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+ # typed: strict
3
+
4
+ require "sorbet-runtime"
5
+ require "net/http"
6
+ require "uri"
7
+
8
+ module Inttegro
9
+ # Shared public types used by the SDK's Sorbet signatures.
10
+ module Types
11
+ Scalar = T.type_alias { T.any(String, Integer, Float, TrueClass, FalseClass, NilClass) }
12
+ Key = T.type_alias { T.any(String, Symbol) }
13
+
14
+ # Ruby's type system cannot express recursive JSON containers without an
15
+ # escape hatch. Object is deliberate here: callers must narrow an unknown
16
+ # wire value before using it, instead of silently disabling checks.
17
+ Payload = T.type_alias { T::Hash[Key, Object] }
18
+ Headers = T.type_alias { T::Hash[String, String] }
19
+ ResponseHeaders = T.type_alias { T::Hash[String, T::Array[String]] }
20
+ QueryValue = T.type_alias do
21
+ T.any(Scalar, T::Array[String], T::Array[Integer], T::Array[Float])
22
+ end
23
+ Query = T.type_alias { T::Hash[Key, QueryValue] }
24
+ RequestBody = T.type_alias { T.any(Payload, T::Struct) }
25
+ WireValue = T.type_alias do
26
+ T.any(Scalar, T::Enum, T::Struct, Payload, T::Array[Object])
27
+ end
28
+ Adapter = T.type_alias do
29
+ T.proc.params(uri: URI::Generic, request: Net::HTTPRequest).returns(Object)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # typed: strict
3
+
4
+ module Inttegro
5
+ VERSION = "1.0.0"
6
+ end
data/lib/inttegro.rb ADDED
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+ # typed: strict
3
+
4
+ require "sorbet-runtime"
5
+
6
+ require_relative "inttegro/types"
7
+ require_relative "inttegro/client"
8
+ require_relative "inttegro/errors"
9
+ require_relative "inttegro/enums"
10
+ require_relative "inttegro/models"
11
+ require_relative "inttegro/version"
12
+
13
+ module Inttegro
14
+ end