From 01fd69a0b7be1b6b394b9b3c39410d4782382ce3 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 27 Feb 2025 03:00:59 +0000 Subject: [PATCH 1/5] chore(internal): version bump (#79) --- sig/orb/version.rbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sig/orb/version.rbs b/sig/orb/version.rbs index d7f8754d..031191a0 100644 --- a/sig/orb/version.rbs +++ b/sig/orb/version.rbs @@ -1,3 +1,3 @@ module Orb - VERSION: "0.1.0-alpha.14" + VERSION: "0.1.0-alpha.15" end From 333e1539913d5b7e5298e5de7a6574456b5d8975 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 27 Feb 2025 22:01:23 +0000 Subject: [PATCH 2/5] docs: update URLs from stainlessapi.com to stainless.com (#81) More details at https://www.stainless.com/changelog/stainless-com --- SECURITY.md | 4 ++-- test/orb/client_test.rb | 34 ++++++++++++++-------------- test/orb/resources/customers_test.rb | 2 +- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index b32391b3..6f64d22c 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -2,9 +2,9 @@ ## Reporting Security Issues -This SDK is generated by [Stainless Software Inc](http://stainlessapi.com). Stainless takes security seriously, and encourages you to report any security vulnerability promptly so that appropriate action can be taken. +This SDK is generated by [Stainless Software Inc](http://stainless.com). Stainless takes security seriously, and encourages you to report any security vulnerability promptly so that appropriate action can be taken. -To report a security issue, please contact the Stainless team at security@stainlessapi.com. +To report a security issue, please contact the Stainless team at security@stainless.com. ## Responsible Disclosure diff --git a/test/orb/client_test.rb b/test/orb/client_test.rb index a533965a..caa3df2e 100644 --- a/test/orb/client_test.rb +++ b/test/orb/client_test.rb @@ -86,7 +86,7 @@ def test_client_default_request_default_retry_attempts orb.requester = requester assert_raises(Orb::InternalServerError) do - orb.customers.create(email: "dev@stainlessapi.com", name: "x") + orb.customers.create(email: "dev@stainless.com", name: "x") end assert_equal(3, requester.attempts.length) @@ -98,7 +98,7 @@ def test_client_given_request_default_retry_attempts orb.requester = requester assert_raises(Orb::InternalServerError) do - orb.customers.create(email: "dev@stainlessapi.com", name: "x") + orb.customers.create(email: "dev@stainless.com", name: "x") end assert_equal(4, requester.attempts.length) @@ -110,7 +110,7 @@ def test_client_default_request_given_retry_attempts orb.requester = requester assert_raises(Orb::InternalServerError) do - orb.customers.create(email: "dev@stainlessapi.com", name: "x", request_options: {max_retries: 3}) + orb.customers.create(email: "dev@stainless.com", name: "x", request_options: {max_retries: 3}) end assert_equal(4, requester.attempts.length) @@ -122,7 +122,7 @@ def test_client_given_request_given_retry_attempts orb.requester = requester assert_raises(Orb::InternalServerError) do - orb.customers.create(email: "dev@stainlessapi.com", name: "x", request_options: {max_retries: 4}) + orb.customers.create(email: "dev@stainless.com", name: "x", request_options: {max_retries: 4}) end assert_equal(5, requester.attempts.length) @@ -134,7 +134,7 @@ def test_client_retry_after_seconds orb.requester = requester assert_raises(Orb::InternalServerError) do - orb.customers.create(email: "dev@stainlessapi.com", name: "x") + orb.customers.create(email: "dev@stainless.com", name: "x") end assert_equal(2, requester.attempts.length) @@ -148,7 +148,7 @@ def test_client_retry_after_date assert_raises(Orb::InternalServerError) do Thread.current.thread_variable_set(:time_now, Time.now) - orb.customers.create(email: "dev@stainlessapi.com", name: "x") + orb.customers.create(email: "dev@stainless.com", name: "x") Thread.current.thread_variable_set(:time_now, nil) end @@ -162,7 +162,7 @@ def test_client_retry_after_ms orb.requester = requester assert_raises(Orb::InternalServerError) do - orb.customers.create(email: "dev@stainlessapi.com", name: "x") + orb.customers.create(email: "dev@stainless.com", name: "x") end assert_equal(2, requester.attempts.length) @@ -175,7 +175,7 @@ def test_retry_count_header orb.requester = requester assert_raises(Orb::InternalServerError) do - orb.customers.create(email: "dev@stainlessapi.com", name: "x") + orb.customers.create(email: "dev@stainless.com", name: "x") end retry_count_headers = requester.attempts.map { _1[:headers]["x-stainless-retry-count"] } @@ -189,7 +189,7 @@ def test_omit_retry_count_header assert_raises(Orb::InternalServerError) do orb.customers.create( - email: "dev@stainlessapi.com", + email: "dev@stainless.com", name: "x", request_options: {extra_headers: {"x-stainless-retry-count" => nil}} ) @@ -206,7 +206,7 @@ def test_overwrite_retry_count_header assert_raises(Orb::InternalServerError) do orb.customers.create( - email: "dev@stainlessapi.com", + email: "dev@stainless.com", name: "x", request_options: {extra_headers: {"x-stainless-retry-count" => "42"}} ) @@ -222,7 +222,7 @@ def test_client_redirect_307 orb.requester = requester assert_raises(Orb::APIConnectionError) do - orb.customers.create(email: "dev@stainlessapi.com", name: "x", request_options: {extra_headers: {}}) + orb.customers.create(email: "dev@stainless.com", name: "x", request_options: {extra_headers: {}}) end assert_equal("/redirected", requester.attempts.last[:url].path) @@ -240,7 +240,7 @@ def test_client_redirect_303 orb.requester = requester assert_raises(Orb::APIConnectionError) do - orb.customers.create(email: "dev@stainlessapi.com", name: "x", request_options: {extra_headers: {}}) + orb.customers.create(email: "dev@stainless.com", name: "x", request_options: {extra_headers: {}}) end assert_equal("/redirected", requester.attempts.last[:url].path) @@ -256,7 +256,7 @@ def test_client_redirect_auth_keep_same_origin assert_raises(Orb::APIConnectionError) do orb.customers.create( - email: "dev@stainlessapi.com", + email: "dev@stainless.com", name: "x", request_options: {extra_headers: {"Authorization" => "Bearer xyz"}} ) @@ -275,7 +275,7 @@ def test_client_redirect_auth_strip_cross_origin assert_raises(Orb::APIConnectionError) do orb.customers.create( - email: "dev@stainlessapi.com", + email: "dev@stainless.com", name: "x", request_options: {extra_headers: {"Authorization" => "Bearer xyz"}} ) @@ -290,7 +290,7 @@ def test_client_default_idempotency_key_on_writes orb.requester = requester assert_raises(Orb::InternalServerError) do - orb.customers.create(email: "dev@stainlessapi.com", name: "x", request_options: {max_retries: 1}) + orb.customers.create(email: "dev@stainless.com", name: "x", request_options: {max_retries: 1}) end idempotency_headers = requester.attempts.map { _1[:headers]["Idempotency-Key".downcase] } @@ -307,7 +307,7 @@ def test_request_option_idempotency_key_on_writes assert_raises(Orb::InternalServerError) do orb.customers.create( - email: "dev@stainlessapi.com", + email: "dev@stainless.com", name: "x", request_options: {max_retries: 1, idempotency_key: "user-supplied-key"} ) @@ -320,7 +320,7 @@ def test_default_headers orb = Orb::Client.new(base_url: "http://localhost:4010", api_key: "My API Key") requester = MockRequester.new(200, {}, {}) orb.requester = requester - orb.customers.create(email: "dev@stainlessapi.com", name: "x") + orb.customers.create(email: "dev@stainless.com", name: "x") headers = requester.attempts.first[:headers] refute_empty(headers["accept"]) diff --git a/test/orb/resources/customers_test.rb b/test/orb/resources/customers_test.rb index f407b5e6..0ceee084 100644 --- a/test/orb/resources/customers_test.rb +++ b/test/orb/resources/customers_test.rb @@ -11,7 +11,7 @@ def before_all end def test_create_required_params - response = @orb.customers.create(email: "dev@stainlessapi.com", name: "x") + response = @orb.customers.create(email: "dev@stainless.com", name: "x") assert_pattern do response => Orb::Models::Customer From a13336658840813e03b78c935b37691794213a58 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 28 Feb 2025 19:24:45 +0000 Subject: [PATCH 3/5] feat(internal): modified tests for thread and fiber safety (#82) --- Gemfile | 3 + Gemfile.lock | 44 ++++++++++--- ...t_namespaces.rb => resource_namespaces.rb} | 0 test/orb/resources/alerts_test.rb | 9 +-- .../resources/coupons/subscriptions_test.rb | 9 +-- test/orb/resources/coupons_test.rb | 9 +-- test/orb/resources/credit_notes_test.rb | 9 +-- .../customers/balance_transactions_test.rb | 9 +-- test/orb/resources/customers/costs_test.rb | 9 +-- .../customers/credits/ledger_test.rb | 9 +-- .../customers/credits/top_ups_test.rb | 9 +-- test/orb/resources/customers/credits_test.rb | 9 +-- test/orb/resources/customers_test.rb | 9 +-- ...xternal_dimensional_price_group_id_test.rb | 9 +-- .../dimensional_price_groups_test.rb | 9 +-- test/orb/resources/events/backfills_test.rb | 9 +-- test/orb/resources/events/volume_test.rb | 9 +-- test/orb/resources/events_test.rb | 9 +-- test/orb/resources/invoice_line_items_test.rb | 9 +-- test/orb/resources/invoices_test.rb | 9 +-- test/orb/resources/items_test.rb | 9 +-- test/orb/resources/metrics_test.rb | 9 +-- .../resources/plans/external_plan_id_test.rb | 9 +-- test/orb/resources/plans_test.rb | 9 +-- .../prices/external_price_id_test.rb | 9 +-- test/orb/resources/prices_test.rb | 9 +-- test/orb/resources/shared_test.rb | 8 +-- test/orb/resources/subscriptions_test.rb | 9 +-- test/orb/resources/top_level_test.rb | 9 +-- test/orb/test_helper.rb | 63 ++++++++++++++----- 30 files changed, 110 insertions(+), 233 deletions(-) rename test/orb/{test_namespaces.rb => resource_namespaces.rb} (100%) diff --git a/Gemfile b/Gemfile index e75b829e..b064fc5a 100644 --- a/Gemfile +++ b/Gemfile @@ -5,9 +5,12 @@ source "https://rubygems.org" gemspec group :development do + gem "async" gem "minitest" gem "minitest-focus" gem "minitest-hooks" + gem "minitest-proveit" + gem "minitest-rg" gem "rake" gem "rbs" gem "rubocop" diff --git a/Gemfile.lock b/Gemfile.lock index 2d8e8ea1..3047e5aa 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -30,18 +30,33 @@ GEM securerandom (>= 0.3) tzinfo (~> 2.0, >= 2.0.5) ast (2.4.2) + async (2.23.0) + console (~> 1.29) + fiber-annotation + io-event (~> 1.9) + metrics (~> 0.12) + traces (~> 0.15) base64 (0.2.0) benchmark (0.4.0) bigdecimal (3.1.9) concurrent-ruby (1.3.5) connection_pool (2.5.0) + console (1.29.3) + fiber-annotation + fiber-local (~> 1.1) + json csv (3.3.2) drb (2.2.1) erubi (1.13.1) ffi (1.17.1) + fiber-annotation (0.2.0) + fiber-local (1.1.0) + fiber-storage + fiber-storage (1.0.0) fileutils (1.7.3) i18n (1.14.7) concurrent-ruby (~> 1.0) + io-event (1.9.0) json (2.10.1) language_server-protocol (3.17.0.4) lint_roller (1.1.0) @@ -49,11 +64,16 @@ GEM rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) logger (1.6.6) + metrics (0.12.1) minitest (5.25.4) minitest-focus (1.4.0) minitest (>= 4, < 6) minitest-hooks (1.5.2) minitest (> 5.3) + minitest-proveit (1.0.0) + minitest (> 5, < 7) + minitest-rg (5.3.0) + minitest (~> 5.0) netrc (0.11.0) parallel (1.26.3) parser (3.3.7.1) @@ -84,18 +104,18 @@ GEM rubocop-ast (>= 1.38.0, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 2.4.0, < 4.0) - rubocop-ast (1.38.0) + rubocop-ast (1.38.1) parser (>= 3.3.1.0) ruby-progressbar (1.13.0) securerandom (0.4.1) - sorbet (0.5.11834) - sorbet-static (= 0.5.11834) - sorbet-runtime (0.5.11834) - sorbet-static (0.5.11834-x86_64-linux) - sorbet-static-and-runtime (0.5.11834) - sorbet (= 0.5.11834) - sorbet-runtime (= 0.5.11834) - spoom (1.5.3) + sorbet (0.5.11856) + sorbet-static (= 0.5.11856) + sorbet-runtime (0.5.11856) + sorbet-static (0.5.11856-x86_64-linux) + sorbet-static-and-runtime (0.5.11856) + sorbet (= 0.5.11856) + sorbet-runtime (= 0.5.11856) + spoom (1.5.4) erubi (>= 1.10.0) prism (>= 0.28.0) rbi (>= 0.2.3) @@ -120,7 +140,7 @@ GEM strscan (3.1.2) syntax_tree (6.2.0) prettier_print (>= 1.2.0) - tapioca (0.16.10) + tapioca (0.16.11) benchmark bundler (>= 2.2.25) netrc (>= 0.11.0) @@ -133,6 +153,7 @@ GEM terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) thor (1.3.2) + traces (0.15.2) tzinfo (2.0.6) concurrent-ruby (~> 1.0) unicode-display_width (2.6.0) @@ -147,9 +168,12 @@ PLATFORMS x86_64-linux DEPENDENCIES + async minitest minitest-focus minitest-hooks + minitest-proveit + minitest-rg orb! rake rbs diff --git a/test/orb/test_namespaces.rb b/test/orb/resource_namespaces.rb similarity index 100% rename from test/orb/test_namespaces.rb rename to test/orb/resource_namespaces.rb diff --git a/test/orb/resources/alerts_test.rb b/test/orb/resources/alerts_test.rb index ccfc0a28..acb95bf4 100644 --- a/test/orb/resources/alerts_test.rb +++ b/test/orb/resources/alerts_test.rb @@ -2,14 +2,7 @@ require_relative "../test_helper" -class Orb::Test::Resources::AlertsTest < Minitest::Test - def before_all - @orb = Orb::Client.new( - base_url: ENV.fetch("TEST_API_BASE_URL", "http://localhost:4010"), - api_key: "My API Key" - ) - end - +class Orb::Test::Resources::AlertsTest < Orb::Test::ResourceTest def test_retrieve response = @orb.alerts.retrieve("alert_id") diff --git a/test/orb/resources/coupons/subscriptions_test.rb b/test/orb/resources/coupons/subscriptions_test.rb index 8a4a3898..34580bb3 100644 --- a/test/orb/resources/coupons/subscriptions_test.rb +++ b/test/orb/resources/coupons/subscriptions_test.rb @@ -2,14 +2,7 @@ require_relative "../../test_helper" -class Orb::Test::Resources::Coupons::SubscriptionsTest < Minitest::Test - def before_all - @orb = Orb::Client.new( - base_url: ENV.fetch("TEST_API_BASE_URL", "http://localhost:4010"), - api_key: "My API Key" - ) - end - +class Orb::Test::Resources::Coupons::SubscriptionsTest < Orb::Test::ResourceTest def test_list response = @orb.coupons.subscriptions.list("coupon_id") diff --git a/test/orb/resources/coupons_test.rb b/test/orb/resources/coupons_test.rb index 071f9e46..38b54330 100644 --- a/test/orb/resources/coupons_test.rb +++ b/test/orb/resources/coupons_test.rb @@ -2,14 +2,7 @@ require_relative "../test_helper" -class Orb::Test::Resources::CouponsTest < Minitest::Test - def before_all - @orb = Orb::Client.new( - base_url: ENV.fetch("TEST_API_BASE_URL", "http://localhost:4010"), - api_key: "My API Key" - ) - end - +class Orb::Test::Resources::CouponsTest < Orb::Test::ResourceTest def test_create_required_params response = @orb.coupons.create( discount: {discount_type: :percentage, percentage_discount: 0}, diff --git a/test/orb/resources/credit_notes_test.rb b/test/orb/resources/credit_notes_test.rb index 3ed35f30..9bb496c3 100644 --- a/test/orb/resources/credit_notes_test.rb +++ b/test/orb/resources/credit_notes_test.rb @@ -2,14 +2,7 @@ require_relative "../test_helper" -class Orb::Test::Resources::CreditNotesTest < Minitest::Test - def before_all - @orb = Orb::Client.new( - base_url: ENV.fetch("TEST_API_BASE_URL", "http://localhost:4010"), - api_key: "My API Key" - ) - end - +class Orb::Test::Resources::CreditNotesTest < Orb::Test::ResourceTest def test_create_required_params response = @orb.credit_notes.create( line_items: [ diff --git a/test/orb/resources/customers/balance_transactions_test.rb b/test/orb/resources/customers/balance_transactions_test.rb index 3741c395..41220b71 100644 --- a/test/orb/resources/customers/balance_transactions_test.rb +++ b/test/orb/resources/customers/balance_transactions_test.rb @@ -2,14 +2,7 @@ require_relative "../../test_helper" -class Orb::Test::Resources::Customers::BalanceTransactionsTest < Minitest::Test - def before_all - @orb = Orb::Client.new( - base_url: ENV.fetch("TEST_API_BASE_URL", "http://localhost:4010"), - api_key: "My API Key" - ) - end - +class Orb::Test::Resources::Customers::BalanceTransactionsTest < Orb::Test::ResourceTest def test_create_required_params response = @orb.customers.balance_transactions.create("customer_id", amount: "amount", type: :increment) diff --git a/test/orb/resources/customers/costs_test.rb b/test/orb/resources/customers/costs_test.rb index 29854877..d0a141f7 100644 --- a/test/orb/resources/customers/costs_test.rb +++ b/test/orb/resources/customers/costs_test.rb @@ -2,14 +2,7 @@ require_relative "../../test_helper" -class Orb::Test::Resources::Customers::CostsTest < Minitest::Test - def before_all - @orb = Orb::Client.new( - base_url: ENV.fetch("TEST_API_BASE_URL", "http://localhost:4010"), - api_key: "My API Key" - ) - end - +class Orb::Test::Resources::Customers::CostsTest < Orb::Test::ResourceTest def test_list response = @orb.customers.costs.list("customer_id") diff --git a/test/orb/resources/customers/credits/ledger_test.rb b/test/orb/resources/customers/credits/ledger_test.rb index 24e10854..99e407d4 100644 --- a/test/orb/resources/customers/credits/ledger_test.rb +++ b/test/orb/resources/customers/credits/ledger_test.rb @@ -2,14 +2,7 @@ require_relative "../../../test_helper" -class Orb::Test::Resources::Customers::Credits::LedgerTest < Minitest::Test - def before_all - @orb = Orb::Client.new( - base_url: ENV.fetch("TEST_API_BASE_URL", "http://localhost:4010"), - api_key: "My API Key" - ) - end - +class Orb::Test::Resources::Customers::Credits::LedgerTest < Orb::Test::ResourceTest def test_list response = @orb.customers.credits.ledger.list("customer_id") diff --git a/test/orb/resources/customers/credits/top_ups_test.rb b/test/orb/resources/customers/credits/top_ups_test.rb index 449f6307..40ee33fd 100644 --- a/test/orb/resources/customers/credits/top_ups_test.rb +++ b/test/orb/resources/customers/credits/top_ups_test.rb @@ -2,14 +2,7 @@ require_relative "../../../test_helper" -class Orb::Test::Resources::Customers::Credits::TopUpsTest < Minitest::Test - def before_all - @orb = Orb::Client.new( - base_url: ENV.fetch("TEST_API_BASE_URL", "http://localhost:4010"), - api_key: "My API Key" - ) - end - +class Orb::Test::Resources::Customers::Credits::TopUpsTest < Orb::Test::ResourceTest def test_create_required_params response = @orb.customers.credits.top_ups.create( "customer_id", diff --git a/test/orb/resources/customers/credits_test.rb b/test/orb/resources/customers/credits_test.rb index 8af875eb..2d7b5e58 100644 --- a/test/orb/resources/customers/credits_test.rb +++ b/test/orb/resources/customers/credits_test.rb @@ -2,14 +2,7 @@ require_relative "../../test_helper" -class Orb::Test::Resources::Customers::CreditsTest < Minitest::Test - def before_all - @orb = Orb::Client.new( - base_url: ENV.fetch("TEST_API_BASE_URL", "http://localhost:4010"), - api_key: "My API Key" - ) - end - +class Orb::Test::Resources::Customers::CreditsTest < Orb::Test::ResourceTest def test_list response = @orb.customers.credits.list("customer_id") diff --git a/test/orb/resources/customers_test.rb b/test/orb/resources/customers_test.rb index 0ceee084..31dc5b0c 100644 --- a/test/orb/resources/customers_test.rb +++ b/test/orb/resources/customers_test.rb @@ -2,14 +2,7 @@ require_relative "../test_helper" -class Orb::Test::Resources::CustomersTest < Minitest::Test - def before_all - @orb = Orb::Client.new( - base_url: ENV.fetch("TEST_API_BASE_URL", "http://localhost:4010"), - api_key: "My API Key" - ) - end - +class Orb::Test::Resources::CustomersTest < Orb::Test::ResourceTest def test_create_required_params response = @orb.customers.create(email: "dev@stainless.com", name: "x") diff --git a/test/orb/resources/dimensional_price_groups/external_dimensional_price_group_id_test.rb b/test/orb/resources/dimensional_price_groups/external_dimensional_price_group_id_test.rb index b5e9187a..60fb156a 100644 --- a/test/orb/resources/dimensional_price_groups/external_dimensional_price_group_id_test.rb +++ b/test/orb/resources/dimensional_price_groups/external_dimensional_price_group_id_test.rb @@ -2,14 +2,7 @@ require_relative "../../test_helper" -class Orb::Test::Resources::DimensionalPriceGroups::ExternalDimensionalPriceGroupIDTest < Minitest::Test - def before_all - @orb = Orb::Client.new( - base_url: ENV.fetch("TEST_API_BASE_URL", "http://localhost:4010"), - api_key: "My API Key" - ) - end - +class Orb::Test::Resources::DimensionalPriceGroups::ExternalDimensionalPriceGroupIDTest < Orb::Test::ResourceTest def test_retrieve response = @orb.dimensional_price_groups.external_dimensional_price_group_id.retrieve( "external_dimensional_price_group_id" diff --git a/test/orb/resources/dimensional_price_groups_test.rb b/test/orb/resources/dimensional_price_groups_test.rb index a06004f0..36f4e569 100644 --- a/test/orb/resources/dimensional_price_groups_test.rb +++ b/test/orb/resources/dimensional_price_groups_test.rb @@ -2,14 +2,7 @@ require_relative "../test_helper" -class Orb::Test::Resources::DimensionalPriceGroupsTest < Minitest::Test - def before_all - @orb = Orb::Client.new( - base_url: ENV.fetch("TEST_API_BASE_URL", "http://localhost:4010"), - api_key: "My API Key" - ) - end - +class Orb::Test::Resources::DimensionalPriceGroupsTest < Orb::Test::ResourceTest def test_create_required_params response = @orb.dimensional_price_groups.create( billable_metric_id: "billable_metric_id", diff --git a/test/orb/resources/events/backfills_test.rb b/test/orb/resources/events/backfills_test.rb index d58d0ed7..f4f37dbb 100644 --- a/test/orb/resources/events/backfills_test.rb +++ b/test/orb/resources/events/backfills_test.rb @@ -2,14 +2,7 @@ require_relative "../../test_helper" -class Orb::Test::Resources::Events::BackfillsTest < Minitest::Test - def before_all - @orb = Orb::Client.new( - base_url: ENV.fetch("TEST_API_BASE_URL", "http://localhost:4010"), - api_key: "My API Key" - ) - end - +class Orb::Test::Resources::Events::BackfillsTest < Orb::Test::ResourceTest def test_create_required_params response = @orb.events.backfills.create( timeframe_end: "2019-12-27T18:11:19.117Z", diff --git a/test/orb/resources/events/volume_test.rb b/test/orb/resources/events/volume_test.rb index 2bec943e..96a8895a 100644 --- a/test/orb/resources/events/volume_test.rb +++ b/test/orb/resources/events/volume_test.rb @@ -2,14 +2,7 @@ require_relative "../../test_helper" -class Orb::Test::Resources::Events::VolumeTest < Minitest::Test - def before_all - @orb = Orb::Client.new( - base_url: ENV.fetch("TEST_API_BASE_URL", "http://localhost:4010"), - api_key: "My API Key" - ) - end - +class Orb::Test::Resources::Events::VolumeTest < Orb::Test::ResourceTest def test_list_required_params response = @orb.events.volume.list(timeframe_start: "2019-12-27T18:11:19.117Z") diff --git a/test/orb/resources/events_test.rb b/test/orb/resources/events_test.rb index c9e3f79f..bba05c49 100644 --- a/test/orb/resources/events_test.rb +++ b/test/orb/resources/events_test.rb @@ -2,14 +2,7 @@ require_relative "../test_helper" -class Orb::Test::Resources::EventsTest < Minitest::Test - def before_all - @orb = Orb::Client.new( - base_url: ENV.fetch("TEST_API_BASE_URL", "http://localhost:4010"), - api_key: "My API Key" - ) - end - +class Orb::Test::Resources::EventsTest < Orb::Test::ResourceTest def test_update_required_params response = @orb.events.update( "event_id", diff --git a/test/orb/resources/invoice_line_items_test.rb b/test/orb/resources/invoice_line_items_test.rb index 0c40dafa..b62c5052 100644 --- a/test/orb/resources/invoice_line_items_test.rb +++ b/test/orb/resources/invoice_line_items_test.rb @@ -2,14 +2,7 @@ require_relative "../test_helper" -class Orb::Test::Resources::InvoiceLineItemsTest < Minitest::Test - def before_all - @orb = Orb::Client.new( - base_url: ENV.fetch("TEST_API_BASE_URL", "http://localhost:4010"), - api_key: "My API Key" - ) - end - +class Orb::Test::Resources::InvoiceLineItemsTest < Orb::Test::ResourceTest def test_create_required_params response = @orb.invoice_line_items.create( amount: "12.00", diff --git a/test/orb/resources/invoices_test.rb b/test/orb/resources/invoices_test.rb index bfcbb405..c9b8c6b4 100644 --- a/test/orb/resources/invoices_test.rb +++ b/test/orb/resources/invoices_test.rb @@ -2,14 +2,7 @@ require_relative "../test_helper" -class Orb::Test::Resources::InvoicesTest < Minitest::Test - def before_all - @orb = Orb::Client.new( - base_url: ENV.fetch("TEST_API_BASE_URL", "http://localhost:4010"), - api_key: "My API Key" - ) - end - +class Orb::Test::Resources::InvoicesTest < Orb::Test::ResourceTest def test_create_required_params response = @orb.invoices.create( currency: "USD", diff --git a/test/orb/resources/items_test.rb b/test/orb/resources/items_test.rb index a887437b..c1d9f263 100644 --- a/test/orb/resources/items_test.rb +++ b/test/orb/resources/items_test.rb @@ -2,14 +2,7 @@ require_relative "../test_helper" -class Orb::Test::Resources::ItemsTest < Minitest::Test - def before_all - @orb = Orb::Client.new( - base_url: ENV.fetch("TEST_API_BASE_URL", "http://localhost:4010"), - api_key: "My API Key" - ) - end - +class Orb::Test::Resources::ItemsTest < Orb::Test::ResourceTest def test_create_required_params response = @orb.items.create(name: "API requests") diff --git a/test/orb/resources/metrics_test.rb b/test/orb/resources/metrics_test.rb index e8b50edf..0d9e8664 100644 --- a/test/orb/resources/metrics_test.rb +++ b/test/orb/resources/metrics_test.rb @@ -2,14 +2,7 @@ require_relative "../test_helper" -class Orb::Test::Resources::MetricsTest < Minitest::Test - def before_all - @orb = Orb::Client.new( - base_url: ENV.fetch("TEST_API_BASE_URL", "http://localhost:4010"), - api_key: "My API Key" - ) - end - +class Orb::Test::Resources::MetricsTest < Orb::Test::ResourceTest def test_create_required_params response = @orb.metrics.create( description: "Sum of bytes downloaded in fast mode", diff --git a/test/orb/resources/plans/external_plan_id_test.rb b/test/orb/resources/plans/external_plan_id_test.rb index 36b33748..c52144f5 100644 --- a/test/orb/resources/plans/external_plan_id_test.rb +++ b/test/orb/resources/plans/external_plan_id_test.rb @@ -2,14 +2,7 @@ require_relative "../../test_helper" -class Orb::Test::Resources::Plans::ExternalPlanIDTest < Minitest::Test - def before_all - @orb = Orb::Client.new( - base_url: ENV.fetch("TEST_API_BASE_URL", "http://localhost:4010"), - api_key: "My API Key" - ) - end - +class Orb::Test::Resources::Plans::ExternalPlanIDTest < Orb::Test::ResourceTest def test_update response = @orb.plans.external_plan_id.update("external_plan_id") diff --git a/test/orb/resources/plans_test.rb b/test/orb/resources/plans_test.rb index f698a02b..b5a5a3e7 100644 --- a/test/orb/resources/plans_test.rb +++ b/test/orb/resources/plans_test.rb @@ -2,14 +2,7 @@ require_relative "../test_helper" -class Orb::Test::Resources::PlansTest < Minitest::Test - def before_all - @orb = Orb::Client.new( - base_url: ENV.fetch("TEST_API_BASE_URL", "http://localhost:4010"), - api_key: "My API Key" - ) - end - +class Orb::Test::Resources::PlansTest < Orb::Test::ResourceTest def test_create_required_params response = @orb.plans.create( currency: "currency", diff --git a/test/orb/resources/prices/external_price_id_test.rb b/test/orb/resources/prices/external_price_id_test.rb index dee3cde3..070062e2 100644 --- a/test/orb/resources/prices/external_price_id_test.rb +++ b/test/orb/resources/prices/external_price_id_test.rb @@ -2,14 +2,7 @@ require_relative "../../test_helper" -class Orb::Test::Resources::Prices::ExternalPriceIDTest < Minitest::Test - def before_all - @orb = Orb::Client.new( - base_url: ENV.fetch("TEST_API_BASE_URL", "http://localhost:4010"), - api_key: "My API Key" - ) - end - +class Orb::Test::Resources::Prices::ExternalPriceIDTest < Orb::Test::ResourceTest def test_update response = @orb.prices.external_price_id.update("external_price_id") diff --git a/test/orb/resources/prices_test.rb b/test/orb/resources/prices_test.rb index ba9c2d32..25a715cd 100644 --- a/test/orb/resources/prices_test.rb +++ b/test/orb/resources/prices_test.rb @@ -2,14 +2,7 @@ require_relative "../test_helper" -class Orb::Test::Resources::PricesTest < Minitest::Test - def before_all - @orb = Orb::Client.new( - base_url: ENV.fetch("TEST_API_BASE_URL", "http://localhost:4010"), - api_key: "My API Key" - ) - end - +class Orb::Test::Resources::PricesTest < Orb::Test::ResourceTest def test_create_required_params response = @orb.prices.create( cadence: :annual, diff --git a/test/orb/resources/shared_test.rb b/test/orb/resources/shared_test.rb index 97902d91..ae471979 100644 --- a/test/orb/resources/shared_test.rb +++ b/test/orb/resources/shared_test.rb @@ -2,11 +2,5 @@ require_relative "../test_helper" -class Orb::Test::Resources::SharedTest < Minitest::Test - def before_all - @orb = Orb::Client.new( - base_url: ENV.fetch("TEST_API_BASE_URL", "http://localhost:4010"), - api_key: "My API Key" - ) - end +class Orb::Test::Resources::SharedTest < Orb::Test::ResourceTest end diff --git a/test/orb/resources/subscriptions_test.rb b/test/orb/resources/subscriptions_test.rb index 0d7bf490..0b924d6d 100644 --- a/test/orb/resources/subscriptions_test.rb +++ b/test/orb/resources/subscriptions_test.rb @@ -2,14 +2,7 @@ require_relative "../test_helper" -class Orb::Test::Resources::SubscriptionsTest < Minitest::Test - def before_all - @orb = Orb::Client.new( - base_url: ENV.fetch("TEST_API_BASE_URL", "http://localhost:4010"), - api_key: "My API Key" - ) - end - +class Orb::Test::Resources::SubscriptionsTest < Orb::Test::ResourceTest def test_create response = @orb.subscriptions.create diff --git a/test/orb/resources/top_level_test.rb b/test/orb/resources/top_level_test.rb index da025c68..269cf22d 100644 --- a/test/orb/resources/top_level_test.rb +++ b/test/orb/resources/top_level_test.rb @@ -2,14 +2,7 @@ require_relative "../test_helper" -class Orb::Test::Resources::TopLevelTest < Minitest::Test - def before_all - @orb = Orb::Client.new( - base_url: ENV.fetch("TEST_API_BASE_URL", "http://localhost:4010"), - api_key: "My API Key" - ) - end - +class Orb::Test::Resources::TopLevelTest < Orb::Test::ResourceTest def test_ping response = @orb.top_level.ping diff --git a/test/orb/test_helper.rb b/test/orb/test_helper.rb index 09da390b..5f3c75b6 100644 --- a/test/orb/test_helper.rb +++ b/test/orb/test_helper.rb @@ -6,27 +6,18 @@ # - Define shared testing namespace so that we don't need to indent test files as much # - Setting up testing dependencies -require_relative "../../lib/orb" -require_relative "test_namespaces" +require "digest" +require "singleton" +require "async" require "minitest/autorun" require "minitest/focus" require "minitest/hooks/test" +require "minitest/proveit" +require "minitest/rg" -class Minitest::Test - parallelize_me! - make_my_diffs_pretty! - - include Minitest::Hooks -end - -class Time - class << self - alias_method :_now, :now - end - - def self.now = Thread.current.thread_variable_get(:time_now) || _now -end +require_relative "../../lib/orb" +require_relative "resource_namespaces" module Kernel alias_method :_sleep, :sleep @@ -41,3 +32,43 @@ def sleep(secs) end end end + +class Time + class << self + alias_method :_now, :now + end + + def self.now = Thread.current.thread_variable_get(:time_now) || _now +end + +class Orb::Test::SingletonClient < Orb::Client + include Singleton + + def initialize + super(base_url: ENV.fetch("TEST_API_BASE_URL", "http://localhost:4010"), api_key: "My API Key") + end +end + +class Minitest::Test + include Minitest::Hooks + + make_my_diffs_pretty! + parallelize_me! + prove_it! +end + +class Orb::Test::ResourceTest < Minitest::Test + def async? + return @async unless @async.nil? + @async = Digest::SHA256.hexdigest(self.class.name).to_i(16).odd? + end + + def before_all + super + @orb = Orb::Test::SingletonClient.instance + end + + def around_all = async? ? Sync { super } : super + + def around = async? ? Async { super }.wait : super +end From 4ad1f41c3238a3d9e089dcfce72079a76868eb1e Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 28 Feb 2025 20:24:54 +0000 Subject: [PATCH 4/5] fix: better support header parameters (#83) --- lib/orb/base_client.rb | 8 +++--- .../resources/customers/credits/top_ups.rb | 4 +-- lib/orb/util.rb | 10 ++++++-- rbi/lib/orb/base_client.rbi | 25 ++++++++++++++++--- rbi/lib/orb/util.rbi | 5 +++- sig/orb/base_client.rbs | 12 ++++++--- sig/orb/util.rbs | 4 ++- 7 files changed, 52 insertions(+), 16 deletions(-) diff --git a/lib/orb/base_client.rb b/lib/orb/base_client.rb index 48898a78..1b38e7ee 100644 --- a/lib/orb/base_client.rb +++ b/lib/orb/base_client.rb @@ -142,7 +142,7 @@ def follow_redirect(request, status:, response_headers:) # @param max_retries [Integer] # @param initial_retry_delay [Float] # @param max_retry_delay [Float] - # @param headers [Hash{String=>String, nil}] + # @param headers [Hash{String=>String, Integer, Array, nil}] # @param idempotency_header [String, nil] # def initialize( @@ -193,7 +193,7 @@ def initialize( # # @option req [Hash{String=>Array, String, nil}, nil] :query # - # @option req [Hash{String=>String, nil}, nil] :headers + # @option req [Hash{String=>String, Integer, Array, nil}, nil] :headers # # @option req [Object, nil] :body # @@ -399,7 +399,7 @@ def initialize( # # @option req [Hash{String=>Array, String, nil}, nil] :query # - # @option req [Hash{String=>String, nil}, nil] :headers + # @option req [Hash{String=>String, Integer, Array, nil}, nil] :headers # # @option req [Object, nil] :body # @@ -442,7 +442,7 @@ def initialize( # # @option req [Hash{String=>Array, String, nil}, nil] :query # - # @option req [Hash{String=>String, nil}, nil] :headers + # @option req [Hash{String=>String, Integer, Array, nil}, nil] :headers # # @option req [Object, nil] :body # diff --git a/lib/orb/resources/customers/credits/top_ups.rb b/lib/orb/resources/customers/credits/top_ups.rb index 95e07b6a..95eaea34 100644 --- a/lib/orb/resources/customers/credits/top_ups.rb +++ b/lib/orb/resources/customers/credits/top_ups.rb @@ -94,7 +94,7 @@ def list(customer_id, params = {}) # def delete(top_up_id, params) parsed, options = Orb::Models::Customers::Credits::TopUpDeleteParams.dump_request(params) - customer_id = parsed.fetch(:customer_id) do + customer_id = parsed.delete(:customer_id) do raise ArgumentError.new("missing required path argument #{_1}") end @client.request( @@ -167,7 +167,7 @@ def create_by_external_id(external_customer_id, params) # def delete_by_external_id(top_up_id, params) parsed, options = Orb::Models::Customers::Credits::TopUpDeleteByExternalIDParams.dump_request(params) - external_customer_id = parsed.fetch(:external_customer_id) do + external_customer_id = parsed.delete(:external_customer_id) do raise ArgumentError.new("missing required path argument #{_1}") end @client.request( diff --git a/lib/orb/util.rb b/lib/orb/util.rb index 4ff9231f..1bbd6f50 100644 --- a/lib/orb/util.rb +++ b/lib/orb/util.rb @@ -382,13 +382,19 @@ def join_parsed_uri(lhs, rhs) class << self # @private # - # @param headers [ArrayString, Integer, nil}>] + # @param headers [Hash{String=>String, Integer, Array, nil}] # # @return [Hash{String=>String}] # def normalized_headers(*headers) {}.merge(*headers.compact).to_h do |key, val| - [key.downcase, val&.to_s&.strip] + case val + in Array + val.map { _1.to_s.strip }.join(", ") + else + val&.to_s&.strip + end + [key.downcase, val] end end end diff --git a/rbi/lib/orb/base_client.rbi b/rbi/lib/orb/base_client.rbi index d7036478..ba115e29 100644 --- a/rbi/lib/orb/base_client.rbi +++ b/rbi/lib/orb/base_client.rbi @@ -9,7 +9,16 @@ module Orb method: Symbol, path: T.any(String, T::Array[String]), query: T.nilable(T::Hash[String, T.nilable(T.any(T::Array[String], String))]), - headers: T.nilable(T::Hash[String, T.nilable(String)]), + headers: T.nilable( + T::Hash[String, + T.nilable( + T.any( + String, + Integer, + T::Array[T.nilable(T.any(String, Integer))] + ) + )] + ), body: T.nilable(T.anything), unwrap: T.nilable(Symbol), page: T.nilable(T::Class[Orb::BaseModel]), @@ -69,7 +78,8 @@ module Orb max_retries: Integer, initial_retry_delay: Float, max_retry_delay: Float, - headers: T::Hash[String, T.nilable(String)], + headers: T::Hash[String, + T.nilable(T.any(String, Integer, T::Array[T.nilable(T.any(String, Integer))]))], idempotency_header: T.nilable(String) ) .void @@ -133,7 +143,16 @@ module Orb method: Symbol, path: T.any(String, T::Array[String]), query: T.nilable(T::Hash[String, T.nilable(T.any(T::Array[String], String))]), - headers: T.nilable(T::Hash[String, T.nilable(String)]), + headers: T.nilable( + T::Hash[String, + T.nilable( + T.any( + String, + Integer, + T::Array[T.nilable(T.any(String, Integer))] + ) + )] + ), body: T.nilable(T.anything), unwrap: T.nilable(Symbol), page: T.nilable(T::Class[Orb::BaseModel]), diff --git a/rbi/lib/orb/util.rbi b/rbi/lib/orb/util.rbi index 730a2662..d73c3b77 100644 --- a/rbi/lib/orb/util.rbi +++ b/rbi/lib/orb/util.rbi @@ -105,7 +105,10 @@ module Orb end sig do - params(headers: T::Array[T::Hash[String, T.nilable(T.any(String, Integer))]]) + params( + headers: T::Hash[String, + T.nilable(T.any(String, Integer, T::Array[T.nilable(T.any(String, Integer))]))] + ) .returns(T::Hash[String, String]) end def self.normalized_headers(*headers) diff --git a/sig/orb/base_client.rbs b/sig/orb/base_client.rbs index 33e4049a..77e4aa67 100644 --- a/sig/orb/base_client.rbs +++ b/sig/orb/base_client.rbs @@ -5,7 +5,9 @@ module Orb method: Symbol, path: String | ::Array[String], query: ::Hash[String, (::Array[String] | String)?]?, - headers: ::Hash[String, String?]?, + headers: ::Hash[String, (String + | Integer + | ::Array[(String | Integer)?])?]?, body: top?, unwrap: Symbol?, page: Class?, @@ -49,7 +51,9 @@ module Orb max_retries: Integer, initial_retry_delay: Float, max_retry_delay: Float, - headers: ::Hash[String, String?], + headers: ::Hash[String, (String + | Integer + | ::Array[(String | Integer)?])?], idempotency_header: String? ) -> void @@ -85,7 +89,9 @@ module Orb Symbol method, String | ::Array[String] path, query: ::Hash[String, (::Array[String] | String)?]?, - headers: ::Hash[String, String?]?, + headers: ::Hash[String, (String + | Integer + | ::Array[(String | Integer)?])?]?, body: top?, unwrap: Symbol?, page: Class?, diff --git a/sig/orb/util.rbs b/sig/orb/util.rbs index 24f43591..5b5c102b 100644 --- a/sig/orb/util.rbs +++ b/sig/orb/util.rbs @@ -65,7 +65,9 @@ module Orb ) -> URI::Generic def self?.normalized_headers: ( - *::Array[::Hash[String, (String | Integer)?]] headers + *::Hash[String, (String + | Integer + | ::Array[(String | Integer)?])?] headers ) -> ::Hash[String, String] def self?.encode_multipart_formdata: ( From b50543989cc52e94484455adf4b4fafaf9075341 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 28 Feb 2025 20:25:13 +0000 Subject: [PATCH 5/5] release: 0.1.0-alpha.16 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 23 +++++++++++++++++++++++ Gemfile.lock | 2 +- lib/orb/version.rb | 2 +- rbi/lib/orb/version.rbi | 2 +- 5 files changed, 27 insertions(+), 4 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 08e82c45..7e56fe29 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.1.0-alpha.15" + ".": "0.1.0-alpha.16" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index c7b747fb..47fdc801 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,28 @@ # Changelog +## 0.1.0-alpha.16 (2025-02-28) + +Full Changelog: [v0.1.0-alpha.15...v0.1.0-alpha.16](https://github.com/orbcorp/orb-ruby/compare/v0.1.0-alpha.15...v0.1.0-alpha.16) + +### Features + +* **internal:** modified tests for thread and fiber safety ([#82](https://github.com/orbcorp/orb-ruby/issues/82)) ([a133366](https://github.com/orbcorp/orb-ruby/commit/a13336658840813e03b78c935b37691794213a58)) + + +### Bug Fixes + +* better support header parameters ([#83](https://github.com/orbcorp/orb-ruby/issues/83)) ([4ad1f41](https://github.com/orbcorp/orb-ruby/commit/4ad1f41c3238a3d9e089dcfce72079a76868eb1e)) + + +### Chores + +* **internal:** version bump ([#79](https://github.com/orbcorp/orb-ruby/issues/79)) ([01fd69a](https://github.com/orbcorp/orb-ruby/commit/01fd69a0b7be1b6b394b9b3c39410d4782382ce3)) + + +### Documentation + +* update URLs from stainlessapi.com to stainless.com ([#81](https://github.com/orbcorp/orb-ruby/issues/81)) ([333e153](https://github.com/orbcorp/orb-ruby/commit/333e1539913d5b7e5298e5de7a6574456b5d8975)) + ## 0.1.0-alpha.15 (2025-02-27) Full Changelog: [v0.1.0-alpha.14...v0.1.0-alpha.15](https://github.com/orbcorp/orb-ruby/compare/v0.1.0-alpha.14...v0.1.0-alpha.15) diff --git a/Gemfile.lock b/Gemfile.lock index 3047e5aa..62f8ddc9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -11,7 +11,7 @@ GIT PATH remote: . specs: - orb (0.1.0.pre.alpha.15) + orb (0.1.0.pre.alpha.16) connection_pool GEM diff --git a/lib/orb/version.rb b/lib/orb/version.rb index 84c2801d..fb1a470b 100644 --- a/lib/orb/version.rb +++ b/lib/orb/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module Orb - VERSION = "0.1.0-alpha.15" + VERSION = "0.1.0-alpha.16" end diff --git a/rbi/lib/orb/version.rbi b/rbi/lib/orb/version.rbi index edb8568e..c739ac47 100644 --- a/rbi/lib/orb/version.rbi +++ b/rbi/lib/orb/version.rbi @@ -1,5 +1,5 @@ # typed: strong module Orb - VERSION = "0.1.0-alpha.15" + VERSION = "0.1.0-alpha.16" end