userplex 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 (89) hide show
  1. checksums.yaml +7 -0
  2. data/.ignore +2 -0
  3. data/CHANGELOG.md +14 -0
  4. data/README.md +217 -0
  5. data/SECURITY.md +23 -0
  6. data/lib/userplex/client.rb +80 -0
  7. data/lib/userplex/errors.rb +228 -0
  8. data/lib/userplex/file_part.rb +58 -0
  9. data/lib/userplex/internal/transport/base_client.rb +567 -0
  10. data/lib/userplex/internal/transport/pooled_net_requester.rb +198 -0
  11. data/lib/userplex/internal/type/array_of.rb +168 -0
  12. data/lib/userplex/internal/type/base_model.rb +530 -0
  13. data/lib/userplex/internal/type/base_page.rb +55 -0
  14. data/lib/userplex/internal/type/boolean.rb +77 -0
  15. data/lib/userplex/internal/type/converter.rb +327 -0
  16. data/lib/userplex/internal/type/enum.rb +131 -0
  17. data/lib/userplex/internal/type/file_input.rb +111 -0
  18. data/lib/userplex/internal/type/hash_of.rb +188 -0
  19. data/lib/userplex/internal/type/request_parameters.rb +42 -0
  20. data/lib/userplex/internal/type/union.rb +237 -0
  21. data/lib/userplex/internal/type/unknown.rb +81 -0
  22. data/lib/userplex/internal/util.rb +915 -0
  23. data/lib/userplex/internal.rb +20 -0
  24. data/lib/userplex/models/event_track_params.rb +46 -0
  25. data/lib/userplex/models/event_track_response.rb +33 -0
  26. data/lib/userplex/models/user_identify_params.rb +46 -0
  27. data/lib/userplex/models/user_identify_response.rb +25 -0
  28. data/lib/userplex/models.rb +45 -0
  29. data/lib/userplex/request_options.rb +77 -0
  30. data/lib/userplex/resources/events.rb +43 -0
  31. data/lib/userplex/resources/users.rb +43 -0
  32. data/lib/userplex/version.rb +5 -0
  33. data/lib/userplex.rb +59 -0
  34. data/manifest.yaml +15 -0
  35. data/rbi/userplex/client.rbi +54 -0
  36. data/rbi/userplex/errors.rbi +205 -0
  37. data/rbi/userplex/file_part.rbi +37 -0
  38. data/rbi/userplex/internal/transport/base_client.rbi +292 -0
  39. data/rbi/userplex/internal/transport/pooled_net_requester.rbi +79 -0
  40. data/rbi/userplex/internal/type/array_of.rbi +104 -0
  41. data/rbi/userplex/internal/type/base_model.rbi +302 -0
  42. data/rbi/userplex/internal/type/base_page.rbi +42 -0
  43. data/rbi/userplex/internal/type/boolean.rbi +58 -0
  44. data/rbi/userplex/internal/type/converter.rbi +216 -0
  45. data/rbi/userplex/internal/type/enum.rbi +82 -0
  46. data/rbi/userplex/internal/type/file_input.rbi +59 -0
  47. data/rbi/userplex/internal/type/hash_of.rbi +104 -0
  48. data/rbi/userplex/internal/type/request_parameters.rbi +29 -0
  49. data/rbi/userplex/internal/type/union.rbi +128 -0
  50. data/rbi/userplex/internal/type/unknown.rbi +58 -0
  51. data/rbi/userplex/internal/util.rbi +487 -0
  52. data/rbi/userplex/internal.rbi +16 -0
  53. data/rbi/userplex/models/event_track_params.rbi +73 -0
  54. data/rbi/userplex/models/event_track_response.rbi +52 -0
  55. data/rbi/userplex/models/user_identify_params.rbi +70 -0
  56. data/rbi/userplex/models/user_identify_response.rbi +38 -0
  57. data/rbi/userplex/models.rbi +7 -0
  58. data/rbi/userplex/request_options.rbi +59 -0
  59. data/rbi/userplex/resources/events.rbi +36 -0
  60. data/rbi/userplex/resources/users.rbi +36 -0
  61. data/rbi/userplex/version.rbi +5 -0
  62. data/sig/userplex/client.rbs +28 -0
  63. data/sig/userplex/errors.rbs +117 -0
  64. data/sig/userplex/file_part.rbs +21 -0
  65. data/sig/userplex/internal/transport/base_client.rbs +131 -0
  66. data/sig/userplex/internal/transport/pooled_net_requester.rbs +45 -0
  67. data/sig/userplex/internal/type/array_of.rbs +48 -0
  68. data/sig/userplex/internal/type/base_model.rbs +102 -0
  69. data/sig/userplex/internal/type/base_page.rbs +24 -0
  70. data/sig/userplex/internal/type/boolean.rbs +26 -0
  71. data/sig/userplex/internal/type/converter.rbs +79 -0
  72. data/sig/userplex/internal/type/enum.rbs +32 -0
  73. data/sig/userplex/internal/type/file_input.rbs +25 -0
  74. data/sig/userplex/internal/type/hash_of.rbs +48 -0
  75. data/sig/userplex/internal/type/request_parameters.rbs +17 -0
  76. data/sig/userplex/internal/type/union.rbs +52 -0
  77. data/sig/userplex/internal/type/unknown.rbs +26 -0
  78. data/sig/userplex/internal/util.rbs +185 -0
  79. data/sig/userplex/internal.rbs +9 -0
  80. data/sig/userplex/models/event_track_params.rbs +45 -0
  81. data/sig/userplex/models/event_track_response.rbs +22 -0
  82. data/sig/userplex/models/user_identify_params.rbs +43 -0
  83. data/sig/userplex/models/user_identify_response.rbs +15 -0
  84. data/sig/userplex/models.rbs +5 -0
  85. data/sig/userplex/request_options.rbs +34 -0
  86. data/sig/userplex/resources/events.rbs +15 -0
  87. data/sig/userplex/resources/users.rbs +15 -0
  88. data/sig/userplex/version.rbs +3 -0
  89. metadata +146 -0
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Userplex
4
+ module Internal
5
+ extend Userplex::Internal::Util::SorbetRuntimeSupport
6
+
7
+ OMIT =
8
+ Object.new.tap do
9
+ _1.define_singleton_method(:inspect) { "#<#{Userplex::Internal}::OMIT>" }
10
+ end
11
+ .freeze
12
+
13
+ define_sorbet_constant!(:AnyHash) do
14
+ T.type_alias { T::Hash[Symbol, T.anything] }
15
+ end
16
+ define_sorbet_constant!(:FileInput) do
17
+ T.type_alias { T.any(Pathname, StringIO, IO, String, Userplex::FilePart) }
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Userplex
4
+ module Models
5
+ # @see Userplex::Resources::Events#track
6
+ class EventTrackParams < Userplex::Internal::Type::BaseModel
7
+ extend Userplex::Internal::Type::RequestParameters::Converter
8
+ include Userplex::Internal::Type::RequestParameters
9
+
10
+ # @!attribute event
11
+ # Event name
12
+ #
13
+ # @return [String]
14
+ required :event, String
15
+
16
+ # @!attribute user_id
17
+ # External user ID
18
+ #
19
+ # @return [String]
20
+ required :user_id, String, api_name: :userId
21
+
22
+ # @!attribute properties
23
+ # Event metadata
24
+ #
25
+ # @return [Hash{Symbol=>Object, nil}, nil]
26
+ optional :properties, Userplex::Internal::Type::HashOf[Userplex::Internal::Type::Unknown, nil?: true]
27
+
28
+ # @!attribute timestamp
29
+ # Event timestamp (ISO 8601)
30
+ #
31
+ # @return [Time, nil]
32
+ optional :timestamp, Time
33
+
34
+ # @!method initialize(event:, user_id:, properties: nil, timestamp: nil, request_options: {})
35
+ # @param event [String] Event name
36
+ #
37
+ # @param user_id [String] External user ID
38
+ #
39
+ # @param properties [Hash{Symbol=>Object, nil}] Event metadata
40
+ #
41
+ # @param timestamp [Time] Event timestamp (ISO 8601)
42
+ #
43
+ # @param request_options [Userplex::RequestOptions, Hash{Symbol=>Object}]
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Userplex
4
+ module Models
5
+ # @see Userplex::Resources::Events#track
6
+ class EventTrackResponse < Userplex::Internal::Type::BaseModel
7
+ # @!attribute event_id
8
+ # The event ID
9
+ #
10
+ # @return [String]
11
+ required :event_id, String, api_name: :eventId
12
+
13
+ # @!attribute occurrence_id
14
+ # The event occurrence ID
15
+ #
16
+ # @return [String]
17
+ required :occurrence_id, String, api_name: :occurrenceId
18
+
19
+ # @!attribute success
20
+ # Whether the operation was successful
21
+ #
22
+ # @return [Boolean]
23
+ required :success, Userplex::Internal::Type::Boolean
24
+
25
+ # @!method initialize(event_id:, occurrence_id:, success:)
26
+ # @param event_id [String] The event ID
27
+ #
28
+ # @param occurrence_id [String] The event occurrence ID
29
+ #
30
+ # @param success [Boolean] Whether the operation was successful
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Userplex
4
+ module Models
5
+ # @see Userplex::Resources::Users#identify
6
+ class UserIdentifyParams < Userplex::Internal::Type::BaseModel
7
+ extend Userplex::Internal::Type::RequestParameters::Converter
8
+ include Userplex::Internal::Type::RequestParameters
9
+
10
+ # @!attribute email
11
+ # User email address
12
+ #
13
+ # @return [String]
14
+ required :email, String
15
+
16
+ # @!attribute name
17
+ # User full name
18
+ #
19
+ # @return [String]
20
+ required :name, String
21
+
22
+ # @!attribute user_id
23
+ # Unique identifier for the user
24
+ #
25
+ # @return [String]
26
+ required :user_id, String, api_name: :userId
27
+
28
+ # @!attribute properties
29
+ # Additional user properties
30
+ #
31
+ # @return [Hash{Symbol=>Object, nil}, nil]
32
+ optional :properties, Userplex::Internal::Type::HashOf[Userplex::Internal::Type::Unknown, nil?: true]
33
+
34
+ # @!method initialize(email:, name:, user_id:, properties: nil, request_options: {})
35
+ # @param email [String] User email address
36
+ #
37
+ # @param name [String] User full name
38
+ #
39
+ # @param user_id [String] Unique identifier for the user
40
+ #
41
+ # @param properties [Hash{Symbol=>Object, nil}] Additional user properties
42
+ #
43
+ # @param request_options [Userplex::RequestOptions, Hash{Symbol=>Object}]
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Userplex
4
+ module Models
5
+ # @see Userplex::Resources::Users#identify
6
+ class UserIdentifyResponse < Userplex::Internal::Type::BaseModel
7
+ # @!attribute success
8
+ # Whether the operation was successful
9
+ #
10
+ # @return [Boolean]
11
+ required :success, Userplex::Internal::Type::Boolean
12
+
13
+ # @!attribute user_id
14
+ # The identified user ID
15
+ #
16
+ # @return [String]
17
+ required :user_id, String, api_name: :userId
18
+
19
+ # @!method initialize(success:, user_id:)
20
+ # @param success [Boolean] Whether the operation was successful
21
+ #
22
+ # @param user_id [String] The identified user ID
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Userplex
4
+ [Userplex::Internal::Type::BaseModel, *Userplex::Internal::Type::BaseModel.subclasses].each do |cls|
5
+ cls.define_sorbet_constant!(:OrHash) { T.type_alias { T.any(cls, Userplex::Internal::AnyHash) } }
6
+ end
7
+
8
+ Userplex::Internal::Util.walk_namespaces(Userplex::Models).each do |mod|
9
+ case mod
10
+ in Userplex::Internal::Type::Enum | Userplex::Internal::Type::Union
11
+ mod.constants.each do |name|
12
+ case mod.const_get(name)
13
+ in true | false
14
+ mod.define_sorbet_constant!(:TaggedBoolean) { T.type_alias { T::Boolean } }
15
+ mod.define_sorbet_constant!(:OrBoolean) { T.type_alias { T::Boolean } }
16
+ in Integer
17
+ mod.define_sorbet_constant!(:TaggedInteger) { T.type_alias { Integer } }
18
+ mod.define_sorbet_constant!(:OrInteger) { T.type_alias { Integer } }
19
+ in Float
20
+ mod.define_sorbet_constant!(:TaggedFloat) { T.type_alias { Float } }
21
+ mod.define_sorbet_constant!(:OrFloat) { T.type_alias { Float } }
22
+ in Symbol
23
+ mod.define_sorbet_constant!(:TaggedSymbol) { T.type_alias { Symbol } }
24
+ mod.define_sorbet_constant!(:OrSymbol) { T.type_alias { T.any(Symbol, String) } }
25
+ else
26
+ end
27
+ end
28
+ else
29
+ end
30
+ end
31
+
32
+ Userplex::Internal::Util.walk_namespaces(Userplex::Models)
33
+ .lazy
34
+ .grep(Userplex::Internal::Type::Union)
35
+ .each do |mod|
36
+ const = :Variants
37
+ next if mod.sorbet_constant_defined?(const)
38
+
39
+ mod.define_sorbet_constant!(const) { T.type_alias { mod.to_sorbet_type } }
40
+ end
41
+
42
+ EventTrackParams = Userplex::Models::EventTrackParams
43
+
44
+ UserIdentifyParams = Userplex::Models::UserIdentifyParams
45
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Userplex
4
+ # Specify HTTP behaviour to use for a specific request. These options supplement
5
+ # or override those provided at the client level.
6
+ #
7
+ # When making a request, you can pass an actual {RequestOptions} instance, or
8
+ # simply pass a Hash with symbol keys matching the attributes on this class.
9
+ class RequestOptions < Userplex::Internal::Type::BaseModel
10
+ # @api private
11
+ #
12
+ # @param opts [Userplex::RequestOptions, Hash{Symbol=>Object}]
13
+ #
14
+ # @raise [ArgumentError]
15
+ def self.validate!(opts)
16
+ case opts
17
+ in Userplex::RequestOptions | Hash
18
+ opts.to_h.each_key do |k|
19
+ unless fields.include?(k)
20
+ raise ArgumentError.new("Request `opts` keys must be one of #{fields.keys}, got #{k.inspect}")
21
+ end
22
+ end
23
+ else
24
+ raise ArgumentError.new("Request `opts` must be a Hash or RequestOptions, got #{opts.inspect}")
25
+ end
26
+ end
27
+
28
+ # @!attribute idempotency_key
29
+ # Idempotency key to send with request and all associated retries. Will only be
30
+ # sent for write requests.
31
+ #
32
+ # @return [String, nil]
33
+ optional :idempotency_key, String
34
+
35
+ # @!attribute extra_query
36
+ # Extra query params to send with the request. These are `.merge`’d into any
37
+ # `query` given at the client level.
38
+ #
39
+ # @return [Hash{String=>Array<String>, String, nil}, nil]
40
+ optional :extra_query, Userplex::Internal::Type::HashOf[Userplex::Internal::Type::ArrayOf[String]]
41
+
42
+ # @!attribute extra_headers
43
+ # Extra headers to send with the request. These are `.merged`’d into any
44
+ # `extra_headers` given at the client level.
45
+ #
46
+ # @return [Hash{String=>String, nil}, nil]
47
+ optional :extra_headers, Userplex::Internal::Type::HashOf[String, nil?: true]
48
+
49
+ # @!attribute extra_body
50
+ # Extra data to send with the request. These are deep merged into any data
51
+ # generated as part of the normal request.
52
+ #
53
+ # @return [Object, nil]
54
+ optional :extra_body, Userplex::Internal::Type::HashOf[Userplex::Internal::Type::Unknown]
55
+
56
+ # @!attribute max_retries
57
+ # Maximum number of retries to attempt after a failed initial request.
58
+ #
59
+ # @return [Integer, nil]
60
+ optional :max_retries, Integer
61
+
62
+ # @!attribute timeout
63
+ # Request timeout in seconds.
64
+ #
65
+ # @return [Float, nil]
66
+ optional :timeout, Float
67
+
68
+ # @!method initialize(values = {})
69
+ # Returns a new instance of RequestOptions.
70
+ #
71
+ # @param values [Hash{Symbol=>Object}]
72
+
73
+ define_sorbet_constant!(:OrHash) do
74
+ T.type_alias { T.any(Userplex::RequestOptions, Userplex::Internal::AnyHash) }
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Userplex
4
+ module Resources
5
+ class Events
6
+ # Creates or uses an existing event and records an event occurrence for an end
7
+ # user. Requires a valid API key for authentication.
8
+ #
9
+ # @overload track(event:, user_id:, properties: nil, timestamp: nil, request_options: {})
10
+ #
11
+ # @param event [String] Event name
12
+ #
13
+ # @param user_id [String] External user ID
14
+ #
15
+ # @param properties [Hash{Symbol=>Object, nil}] Event metadata
16
+ #
17
+ # @param timestamp [Time] Event timestamp (ISO 8601)
18
+ #
19
+ # @param request_options [Userplex::RequestOptions, Hash{Symbol=>Object}, nil]
20
+ #
21
+ # @return [Userplex::Models::EventTrackResponse]
22
+ #
23
+ # @see Userplex::Models::EventTrackParams
24
+ def track(params)
25
+ parsed, options = Userplex::EventTrackParams.dump_request(params)
26
+ @client.request(
27
+ method: :post,
28
+ path: "api/event",
29
+ body: parsed,
30
+ model: Userplex::Models::EventTrackResponse,
31
+ options: options
32
+ )
33
+ end
34
+
35
+ # @api private
36
+ #
37
+ # @param client [Userplex::Client]
38
+ def initialize(client:)
39
+ @client = client
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Userplex
4
+ module Resources
5
+ class Users
6
+ # Creates or updates an end user in InstantDB with the provided information.
7
+ # Requires a valid API key for authentication.
8
+ #
9
+ # @overload identify(email:, name:, user_id:, properties: nil, request_options: {})
10
+ #
11
+ # @param email [String] User email address
12
+ #
13
+ # @param name [String] User full name
14
+ #
15
+ # @param user_id [String] Unique identifier for the user
16
+ #
17
+ # @param properties [Hash{Symbol=>Object, nil}] Additional user properties
18
+ #
19
+ # @param request_options [Userplex::RequestOptions, Hash{Symbol=>Object}, nil]
20
+ #
21
+ # @return [Userplex::Models::UserIdentifyResponse]
22
+ #
23
+ # @see Userplex::Models::UserIdentifyParams
24
+ def identify(params)
25
+ parsed, options = Userplex::UserIdentifyParams.dump_request(params)
26
+ @client.request(
27
+ method: :post,
28
+ path: "api/identify",
29
+ body: parsed,
30
+ model: Userplex::Models::UserIdentifyResponse,
31
+ options: options
32
+ )
33
+ end
34
+
35
+ # @api private
36
+ #
37
+ # @param client [Userplex::Client]
38
+ def initialize(client:)
39
+ @client = client
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Userplex
4
+ VERSION = "0.1.0"
5
+ end
data/lib/userplex.rb ADDED
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Standard libraries.
4
+ # rubocop:disable Lint/RedundantRequireStatement
5
+ require "English"
6
+ require "cgi"
7
+ require "date"
8
+ require "erb"
9
+ require "etc"
10
+ require "json"
11
+ require "net/http"
12
+ require "pathname"
13
+ require "rbconfig"
14
+ require "securerandom"
15
+ require "set"
16
+ require "stringio"
17
+ require "time"
18
+ require "uri"
19
+ # rubocop:enable Lint/RedundantRequireStatement
20
+
21
+ # We already ship the preferred sorbet manifests in the package itself.
22
+ # `tapioca` currently does not offer us a way to opt out of unnecessary compilation.
23
+ if Object.const_defined?(:Tapioca) &&
24
+ caller.chain([$PROGRAM_NAME]).chain(ARGV).any?(/tapioca/) &&
25
+ ARGV.none?(/dsl/)
26
+ return
27
+ end
28
+
29
+ # Gems.
30
+ require "connection_pool"
31
+
32
+ # Package files.
33
+ require_relative "userplex/version"
34
+ require_relative "userplex/internal/util"
35
+ require_relative "userplex/internal/type/converter"
36
+ require_relative "userplex/internal/type/unknown"
37
+ require_relative "userplex/internal/type/boolean"
38
+ require_relative "userplex/internal/type/file_input"
39
+ require_relative "userplex/internal/type/enum"
40
+ require_relative "userplex/internal/type/union"
41
+ require_relative "userplex/internal/type/array_of"
42
+ require_relative "userplex/internal/type/hash_of"
43
+ require_relative "userplex/internal/type/base_model"
44
+ require_relative "userplex/internal/type/base_page"
45
+ require_relative "userplex/internal/type/request_parameters"
46
+ require_relative "userplex/internal"
47
+ require_relative "userplex/request_options"
48
+ require_relative "userplex/file_part"
49
+ require_relative "userplex/errors"
50
+ require_relative "userplex/internal/transport/base_client"
51
+ require_relative "userplex/internal/transport/pooled_net_requester"
52
+ require_relative "userplex/client"
53
+ require_relative "userplex/models/event_track_params"
54
+ require_relative "userplex/models/event_track_response"
55
+ require_relative "userplex/models/user_identify_params"
56
+ require_relative "userplex/models/user_identify_response"
57
+ require_relative "userplex/models"
58
+ require_relative "userplex/resources/events"
59
+ require_relative "userplex/resources/users"
data/manifest.yaml ADDED
@@ -0,0 +1,15 @@
1
+ dependencies:
2
+ - English
3
+ - cgi
4
+ - date
5
+ - erb
6
+ - etc
7
+ - json
8
+ - net/http
9
+ - pathname
10
+ - rbconfig
11
+ - securerandom
12
+ - set
13
+ - stringio
14
+ - time
15
+ - uri
@@ -0,0 +1,54 @@
1
+ # typed: strong
2
+
3
+ module Userplex
4
+ class Client < Userplex::Internal::Transport::BaseClient
5
+ DEFAULT_MAX_RETRIES = 2
6
+
7
+ DEFAULT_TIMEOUT_IN_SECONDS = T.let(60.0, Float)
8
+
9
+ DEFAULT_INITIAL_RETRY_DELAY = T.let(0.5, Float)
10
+
11
+ DEFAULT_MAX_RETRY_DELAY = T.let(8.0, Float)
12
+
13
+ # Enter your API key from your project settings
14
+ sig { returns(String) }
15
+ attr_reader :api_key
16
+
17
+ sig { returns(Userplex::Resources::Users) }
18
+ attr_reader :users
19
+
20
+ sig { returns(Userplex::Resources::Events) }
21
+ attr_reader :events
22
+
23
+ # @api private
24
+ sig { override.returns(T::Hash[String, String]) }
25
+ private def auth_headers
26
+ end
27
+
28
+ # Creates and returns a new client for interacting with the API.
29
+ sig do
30
+ params(
31
+ api_key: T.nilable(String),
32
+ base_url: T.nilable(String),
33
+ max_retries: Integer,
34
+ timeout: Float,
35
+ initial_retry_delay: Float,
36
+ max_retry_delay: Float
37
+ ).returns(T.attached_class)
38
+ end
39
+ def self.new(
40
+ # Enter your API key from your project settings Defaults to
41
+ # `ENV["USERPLEX_API_KEY"]`
42
+ api_key: ENV["USERPLEX_API_KEY"],
43
+ # Override the default base URL for the API, e.g.,
44
+ # `"https://api.example.com/v2/"`. Defaults to `ENV["USERPLEX_BASE_URL"]`
45
+ base_url: ENV["USERPLEX_BASE_URL"],
46
+ # Max number of retries to attempt after a failed retryable request.
47
+ max_retries: Userplex::Client::DEFAULT_MAX_RETRIES,
48
+ timeout: Userplex::Client::DEFAULT_TIMEOUT_IN_SECONDS,
49
+ initial_retry_delay: Userplex::Client::DEFAULT_INITIAL_RETRY_DELAY,
50
+ max_retry_delay: Userplex::Client::DEFAULT_MAX_RETRY_DELAY
51
+ )
52
+ end
53
+ end
54
+ end