From 570f6ee716ed706773a1fcf72785789b3babf286 Mon Sep 17 00:00:00 2001 From: "fern-api[bot]" <115122769+fern-api[bot]@users.noreply.github.com> Date: Mon, 31 Aug 2026 10:02:34 +0000 Subject: [PATCH 1/2] [fern-generated] Update SDK Generated by Fern CLI Version: unknown Generators: - fernapi/fern-ruby-sdk: 1.23.2 --- .fern/metadata.json | 6 +- lib/schematic.rb | 5 + .../update_onboarding_state_request_body.rb | 2 + lib/schematic/client.rb | 2 +- lib/schematic/planmigrations/client.rb | 85 +++++++++- .../types/cancel_migration_response.rb | 13 ++ .../complete_migration_now_request_body.rb | 13 ++ .../types/complete_migration_now_response.rb | 13 ++ lib/schematic/plans/client.rb | 2 +- .../publish_plan_version_request_body.rb | 4 + .../retry_custom_plan_billing_request_body.rb | 4 + .../types/company_detail_response_data.rb | 2 + .../types/credit_lease_response_data.rb | 2 + .../custom_plan_billing_response_data.rb | 2 + .../types/get_onboarding_state_resp.rb | 10 ++ lib/schematic/types/onboarding_requirement.rb | 1 + .../types/onboarding_stripe_import.rb | 13 ++ .../types/pending_migration_response_data.rb | 19 +++ ...version_company_migration_response_data.rb | 2 + .../plan_version_company_migration_status.rb | 1 + .../plan_version_migration_response_data.rb | 2 + .../types/plan_version_migration_status.rb | 1 + .../types/plan_version_migration_strategy.rb | 1 + lib/schematic/version.rb | 2 +- reference.md | 156 +++++++++++++++++- test/rules_engine_clock_test.rb | 75 --------- 26 files changed, 346 insertions(+), 92 deletions(-) create mode 100644 lib/schematic/planmigrations/types/cancel_migration_response.rb create mode 100644 lib/schematic/planmigrations/types/complete_migration_now_request_body.rb create mode 100644 lib/schematic/planmigrations/types/complete_migration_now_response.rb create mode 100644 lib/schematic/types/onboarding_stripe_import.rb create mode 100644 lib/schematic/types/pending_migration_response_data.rb delete mode 100644 test/rules_engine_clock_test.rb diff --git a/.fern/metadata.json b/.fern/metadata.json index 121f216..4080e00 100644 --- a/.fern/metadata.json +++ b/.fern/metadata.json @@ -13,10 +13,10 @@ "webrick": ">= 1.0" } }, - "originGitCommit": "008b7147a27272499bf4b17fa96d4357ca3b62e9", + "originGitCommit": "686551a0297d2f37075b3586b030ff32be5c94f7", "originGitCommitIsDirty": false, "invokedBy": "ci", - "requestedVersion": "1.4.15", + "requestedVersion": "1.4.16", "ciProvider": "github", - "sdkVersion": "1.4.15" + "sdkVersion": "1.4.16" } \ No newline at end of file diff --git a/lib/schematic.rb b/lib/schematic.rb index db5cfbd..f576285 100644 --- a/lib/schematic.rb +++ b/lib/schematic.rb @@ -82,6 +82,7 @@ require_relative "schematic/types/onboarding_path" require_relative "schematic/types/onboarding_requirement_status" require_relative "schematic/types/onboarding_requirement_view" +require_relative "schematic/types/onboarding_stripe_import" require_relative "schematic/types/onboarding_track" require_relative "schematic/types/get_onboarding_state_resp" require_relative "schematic/accounts/types/get_onboarding_state_response" @@ -303,6 +304,7 @@ require_relative "schematic/types/entity_trait_detail_response_data" require_relative "schematic/types/warning_tier" require_relative "schematic/types/feature_entitlement" +require_relative "schematic/types/pending_migration_response_data" require_relative "schematic/types/rule" require_relative "schematic/types/scheduled_downgrade_response_data" require_relative "schematic/types/company_detail_response_data" @@ -683,6 +685,8 @@ require_relative "schematic/planmigrations/types/list_migrations_response" require_relative "schematic/planmigrations/types/create_migration_response" require_relative "schematic/planmigrations/types/get_migration_response" +require_relative "schematic/planmigrations/types/cancel_migration_response" +require_relative "schematic/planmigrations/types/complete_migration_now_response" require_relative "schematic/planmigrations/types/retry_migration_response" require_relative "schematic/planmigrations/types/count_migrations_params" require_relative "schematic/planmigrations/types/count_migrations_response" @@ -1028,6 +1032,7 @@ require_relative "schematic/planmigrations/types/count_company_migrations_request" require_relative "schematic/planmigrations/types/list_migrations_request" require_relative "schematic/planmigrations/types/create_migration_input" +require_relative "schematic/planmigrations/types/complete_migration_now_request_body" require_relative "schematic/planmigrations/types/retry_migration_request_body" require_relative "schematic/planmigrations/types/count_migrations_request" require_relative "schematic/planmigrations/types/preview_migration_request_body" diff --git a/lib/schematic/accounts/types/update_onboarding_state_request_body.rb b/lib/schematic/accounts/types/update_onboarding_state_request_body.rb index e36430b..4c6c11a 100644 --- a/lib/schematic/accounts/types/update_onboarding_state_request_body.rb +++ b/lib/schematic/accounts/types/update_onboarding_state_request_body.rb @@ -4,6 +4,8 @@ module Schematic module Accounts module Types class UpdateOnboardingStateRequestBody < Internal::Types::Model + field :dismissed, -> { Internal::Types::Boolean }, optional: true, nullable: false + field :path, -> { Schematic::Types::OnboardingPath }, optional: true, nullable: false field :pricing_page_url, -> { String }, optional: true, nullable: false diff --git a/lib/schematic/client.rb b/lib/schematic/client.rb index 7b5bcec..920659f 100644 --- a/lib/schematic/client.rb +++ b/lib/schematic/client.rb @@ -42,7 +42,7 @@ def initialize(api_key:, base_url: nil, max_retries: 2) @raw_client = Schematic::Internal::Http::RawClient.new( base_url: base_url || Schematic::Environment::DEFAULT, headers: { - "User-Agent" => "schematichq/1.4.15", + "User-Agent" => "schematichq/1.4.16", "X-Fern-Language" => "Ruby", "X-Schematic-Api-Key" => api_key.to_s }, diff --git a/lib/schematic/planmigrations/client.rb b/lib/schematic/planmigrations/client.rb index 34a693d..1323e1e 100644 --- a/lib/schematic/planmigrations/client.rb +++ b/lib/schematic/planmigrations/client.rb @@ -27,7 +27,7 @@ def initialize(client:) # client.planmigrations.list_company_migrations( # migration_id: "migration_id", # q: "q", - # status: "completed", + # status: "cancelled", # limit: 1000000, # offset: 1000000 # ) @@ -115,7 +115,7 @@ def retry_company_migration(request_options: {}, **params) # client.planmigrations.count_company_migrations( # migration_id: "migration_id", # q: "q", - # status: "completed", + # status: "cancelled", # limit: 1000000, # offset: 1000000 # ) @@ -166,7 +166,7 @@ def count_company_migrations(request_options: {}, **params) # @example # client.planmigrations.list_migrations( # plan_version_id: "plan_version_id", - # status: "completed", + # status: "cancelled", # limit: 1000000, # offset: 1000000 # ) @@ -213,7 +213,7 @@ def list_migrations(request_options: {}, **params) # client.planmigrations.create_migration( # plan_id: "plan_id", # plan_version_id_to: "plan_version_id_to", - # strategy: "immediate", + # strategy: "end_of_billing_period", # target_plan_type: "plan" # ) # @@ -276,6 +276,81 @@ def get_migration(request_options: {}, **params) end end + # @param request_options [Hash] + # @param params [Hash] + # @option request_options [String] :base_url + # @option request_options [Hash{String => Object}] :additional_headers + # @option request_options [Hash{String => Object}] :additional_query_parameters + # @option request_options [Hash{String => Object}] :additional_body_parameters + # @option request_options [Integer] :timeout_in_seconds + # @option params [String] :plan_version_migration_id + # + # @example + # client.planmigrations.cancel_migration(plan_version_migration_id: "plan_version_migration_id") + # + # @return [Schematic::Planmigrations::Types::CancelMigrationResponse] + def cancel_migration(request_options: {}, **params) + params = Schematic::Internal::Types::Utils.normalize_keys(params) + request = Schematic::Internal::JSON::Request.new( + base_url: request_options[:base_url], + method: "POST", + path: "plan-version-migrations/#{URI.encode_uri_component(params[:plan_version_migration_id].to_s)}/cancel", + request_options: request_options + ) + begin + response = @client.send(request) + rescue Net::HTTPRequestTimeout + raise Schematic::Errors::TimeoutError + end + code = response.code.to_i + if code.between?(200, 299) + Schematic::Planmigrations::Types::CancelMigrationResponse.load(response.body) + else + error_class = Schematic::Errors::ResponseError.subclass_for_code(code) + raise error_class.new(response.body, code: code) + end + end + + # @param request_options [Hash] + # @param params [Schematic::Planmigrations::Types::CompleteMigrationNowRequestBody] + # @option request_options [String] :base_url + # @option request_options [Hash{String => Object}] :additional_headers + # @option request_options [Hash{String => Object}] :additional_query_parameters + # @option request_options [Hash{String => Object}] :additional_body_parameters + # @option request_options [Integer] :timeout_in_seconds + # @option params [String] :plan_version_migration_id + # + # @example + # client.planmigrations.complete_migration_now(plan_version_migration_id: "plan_version_migration_id") + # + # @return [Schematic::Planmigrations::Types::CompleteMigrationNowResponse] + def complete_migration_now(request_options: {}, **params) + params = Schematic::Internal::Types::Utils.normalize_keys(params) + request_data = Schematic::Planmigrations::Types::CompleteMigrationNowRequestBody.new(params).to_h + non_body_param_names = %w[plan_version_migration_id] + body = request_data.except(*non_body_param_names) + + request = Schematic::Internal::JSON::Request.new( + base_url: request_options[:base_url], + method: "POST", + path: "plan-version-migrations/#{URI.encode_uri_component(params[:plan_version_migration_id].to_s)}/complete-now", + body: body, + request_options: request_options + ) + begin + response = @client.send(request) + rescue Net::HTTPRequestTimeout + raise Schematic::Errors::TimeoutError + end + code = response.code.to_i + if code.between?(200, 299) + Schematic::Planmigrations::Types::CompleteMigrationNowResponse.load(response.body) + else + error_class = Schematic::Errors::ResponseError.subclass_for_code(code) + raise error_class.new(response.body, code: code) + end + end + # @param request_options [Hash] # @param params [Schematic::Planmigrations::Types::RetryMigrationRequestBody] # @option request_options [String] :base_url @@ -334,7 +409,7 @@ def retry_migration(request_options: {}, **params) # @example # client.planmigrations.count_migrations( # plan_version_id: "plan_version_id", - # status: "completed", + # status: "cancelled", # limit: 1000000, # offset: 1000000 # ) diff --git a/lib/schematic/planmigrations/types/cancel_migration_response.rb b/lib/schematic/planmigrations/types/cancel_migration_response.rb new file mode 100644 index 0000000..bfafdb3 --- /dev/null +++ b/lib/schematic/planmigrations/types/cancel_migration_response.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module Schematic + module Planmigrations + module Types + class CancelMigrationResponse < Internal::Types::Model + field :data, -> { Schematic::Types::PlanVersionMigrationResponseData }, optional: false, nullable: false + + field :params, -> { Internal::Types::Hash[String, Object] }, optional: false, nullable: false + end + end + end +end diff --git a/lib/schematic/planmigrations/types/complete_migration_now_request_body.rb b/lib/schematic/planmigrations/types/complete_migration_now_request_body.rb new file mode 100644 index 0000000..4d6fb44 --- /dev/null +++ b/lib/schematic/planmigrations/types/complete_migration_now_request_body.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module Schematic + module Planmigrations + module Types + class CompleteMigrationNowRequestBody < Internal::Types::Model + field :plan_version_migration_id, -> { String }, optional: false, nullable: false + + field :proration_behavior, -> { Schematic::Types::MigrationProrationBehavior }, optional: true, nullable: false + end + end + end +end diff --git a/lib/schematic/planmigrations/types/complete_migration_now_response.rb b/lib/schematic/planmigrations/types/complete_migration_now_response.rb new file mode 100644 index 0000000..8f15c7d --- /dev/null +++ b/lib/schematic/planmigrations/types/complete_migration_now_response.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module Schematic + module Planmigrations + module Types + class CompleteMigrationNowResponse < Internal::Types::Model + field :data, -> { Schematic::Types::PlanVersionMigrationResponseData }, optional: false, nullable: false + + field :params, -> { Internal::Types::Hash[String, Object] }, optional: false, nullable: false + end + end + end +end diff --git a/lib/schematic/plans/client.rb b/lib/schematic/plans/client.rb index b62e412..6b8ab08 100644 --- a/lib/schematic/plans/client.rb +++ b/lib/schematic/plans/client.rb @@ -856,7 +856,7 @@ def delete_plan_version(request_options: {}, **params) # client.plans.publish_plan_version( # plan_version_id: "plan_version_id", # excluded_company_ids: ["excluded_company_ids"], - # migration_strategy: "immediate" + # migration_strategy: "end_of_billing_period" # ) # # @return [Schematic::Plans::Types::PublishPlanVersionResponse] diff --git a/lib/schematic/plans/types/publish_plan_version_request_body.rb b/lib/schematic/plans/types/publish_plan_version_request_body.rb index 3b0efc3..0d70564 100644 --- a/lib/schematic/plans/types/publish_plan_version_request_body.rb +++ b/lib/schematic/plans/types/publish_plan_version_request_body.rb @@ -10,6 +10,8 @@ class PublishPlanVersionRequestBody < Internal::Types::Model field :address, -> { Schematic::Types::CustomerBillingAddress }, optional: true, nullable: false + field :billing_cycle_anchor, -> { String }, optional: true, nullable: false + field :coupon_external_id, -> { String }, optional: true, nullable: false field :custom_field_values, -> { Internal::Types::Array[Schematic::Types::CheckoutFieldValue] }, optional: true, nullable: false @@ -24,6 +26,8 @@ class PublishPlanVersionRequestBody < Internal::Types::Model field :phone, -> { String }, optional: true, nullable: false + field :prorate_first_period, -> { Internal::Types::Boolean }, optional: true, nullable: false + field :proration_behavior, -> { Schematic::Types::MigrationProrationBehavior }, optional: true, nullable: false field :require_no_migration, -> { Internal::Types::Boolean }, optional: true, nullable: false diff --git a/lib/schematic/plans/types/retry_custom_plan_billing_request_body.rb b/lib/schematic/plans/types/retry_custom_plan_billing_request_body.rb index a036de6..7ccb8ae 100644 --- a/lib/schematic/plans/types/retry_custom_plan_billing_request_body.rb +++ b/lib/schematic/plans/types/retry_custom_plan_billing_request_body.rb @@ -8,10 +8,14 @@ class RetryCustomPlanBillingRequestBody < Internal::Types::Model field :activation_strategy, -> { Schematic::Types::CustomPlanActivationStrategy }, optional: true, nullable: false + field :billing_cycle_anchor, -> { String }, optional: true, nullable: false + field :customer_email, -> { String }, optional: false, nullable: false field :days_until_due, -> { Integer }, optional: true, nullable: false + field :prorate_first_period, -> { Internal::Types::Boolean }, optional: true, nullable: false + field :send_invoice, -> { Internal::Types::Boolean }, optional: true, nullable: false end end diff --git a/lib/schematic/types/company_detail_response_data.rb b/lib/schematic/types/company_detail_response_data.rb index 36e269e..2fb56ca 100644 --- a/lib/schematic/types/company_detail_response_data.rb +++ b/lib/schematic/types/company_detail_response_data.rb @@ -37,6 +37,8 @@ class CompanyDetailResponseData < Internal::Types::Model field :payment_methods, -> { Internal::Types::Array[Schematic::Types::PaymentMethodResponseData] }, optional: false, nullable: false + field :pending_migration, -> { Schematic::Types::PendingMigrationResponseData }, optional: true, nullable: false + field :plan, -> { Schematic::Types::CompanyPlanWithBillingSubView }, optional: true, nullable: false field :plans, -> { Internal::Types::Array[Schematic::Types::GenericPreviewObject] }, optional: false, nullable: false diff --git a/lib/schematic/types/credit_lease_response_data.rb b/lib/schematic/types/credit_lease_response_data.rb index c294d03..c8f0d92 100644 --- a/lib/schematic/types/credit_lease_response_data.rb +++ b/lib/schematic/types/credit_lease_response_data.rb @@ -17,6 +17,8 @@ class CreditLeaseResponseData < Internal::Types::Model field :released_at, -> { String }, optional: true, nullable: false + field :tracked_amount, -> { Integer }, optional: false, nullable: false + field :updated_at, -> { String }, optional: false, nullable: false end end diff --git a/lib/schematic/types/custom_plan_billing_response_data.rb b/lib/schematic/types/custom_plan_billing_response_data.rb index 59a25cf..029c0e9 100644 --- a/lib/schematic/types/custom_plan_billing_response_data.rb +++ b/lib/schematic/types/custom_plan_billing_response_data.rb @@ -23,6 +23,8 @@ class CustomPlanBillingResponseData < Internal::Types::Model field :plan_id, -> { String }, optional: false, nullable: false + field :prorate_first_period, -> { Internal::Types::Boolean }, optional: true, nullable: false + field :published_at, -> { String }, optional: true, nullable: false field :send_invoice, -> { Internal::Types::Boolean }, optional: false, nullable: false diff --git a/lib/schematic/types/get_onboarding_state_resp.rb b/lib/schematic/types/get_onboarding_state_resp.rb index 738694e..63bd7d2 100644 --- a/lib/schematic/types/get_onboarding_state_resp.rb +++ b/lib/schematic/types/get_onboarding_state_resp.rb @@ -3,17 +3,27 @@ module Schematic module Types class GetOnboardingStateResp < Internal::Types::Model + field :agent_connected_at, -> { String }, optional: true, nullable: false + + field :dismissed_at, -> { String }, optional: true, nullable: false + field :environment_id, -> { String }, optional: true, nullable: false field :milestones, -> { Internal::Types::Array[Schematic::Types::OnboardingMilestoneView] }, optional: false, nullable: false field :path, -> { Schematic::Types::OnboardingPath }, optional: true, nullable: false + field :pricing_page_url, -> { String }, optional: true, nullable: false + field :requirements, -> { Internal::Types::Array[Schematic::Types::OnboardingRequirementView] }, optional: false, nullable: false + field :stripe_import, -> { Schematic::Types::OnboardingStripeImport }, optional: true, nullable: false + field :suggested_next, -> { Internal::Types::Array[Schematic::Types::OnboardingRequirement] }, optional: false, nullable: false field :track, -> { Schematic::Types::OnboardingTrack }, optional: true, nullable: false + + field :website_url, -> { String }, optional: true, nullable: false end end end diff --git a/lib/schematic/types/onboarding_requirement.rb b/lib/schematic/types/onboarding_requirement.rb index 5e35dae..1945b66 100644 --- a/lib/schematic/types/onboarding_requirement.rb +++ b/lib/schematic/types/onboarding_requirement.rb @@ -5,6 +5,7 @@ module Types module OnboardingRequirement extend Schematic::Internal::Types::Enum + CONNECT_AGENT = "connect_agent" CONNECT_BILLING = "connect_billing" CREATE_API_KEY = "create_api_key" FIRST_FLAG_CHECK = "first_flag_check" diff --git a/lib/schematic/types/onboarding_stripe_import.rb b/lib/schematic/types/onboarding_stripe_import.rb new file mode 100644 index 0000000..e6cdb45 --- /dev/null +++ b/lib/schematic/types/onboarding_stripe_import.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module Schematic + module Types + module OnboardingStripeImport + extend Schematic::Internal::Types::Enum + + COMPLETE = "complete" + NOT_STARTED = "not_started" + RUNNING = "running" + end + end +end diff --git a/lib/schematic/types/pending_migration_response_data.rb b/lib/schematic/types/pending_migration_response_data.rb new file mode 100644 index 0000000..102f28c --- /dev/null +++ b/lib/schematic/types/pending_migration_response_data.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +module Schematic + module Types + class PendingMigrationResponseData < Internal::Types::Model + field :migration_id, -> { String }, optional: false, nullable: false + + field :scheduled_for, -> { String }, optional: true, nullable: false + + field :to_plan_id, -> { String }, optional: false, nullable: false + + field :to_plan_name, -> { String }, optional: false, nullable: false + + field :to_plan_version_id, -> { String }, optional: false, nullable: false + + field :to_plan_version_number, -> { Integer }, optional: true, nullable: false + end + end +end diff --git a/lib/schematic/types/plan_version_company_migration_response_data.rb b/lib/schematic/types/plan_version_company_migration_response_data.rb index acd072e..0d6d040 100644 --- a/lib/schematic/types/plan_version_company_migration_response_data.rb +++ b/lib/schematic/types/plan_version_company_migration_response_data.rb @@ -21,6 +21,8 @@ class PlanVersionCompanyMigrationResponseData < Internal::Types::Model field :plan_version_id_from, -> { String }, optional: true, nullable: false + field :scheduled_for, -> { String }, optional: true, nullable: false + field :started_at, -> { String }, optional: true, nullable: false field :status, -> { Schematic::Types::PlanVersionCompanyMigrationStatus }, optional: false, nullable: false diff --git a/lib/schematic/types/plan_version_company_migration_status.rb b/lib/schematic/types/plan_version_company_migration_status.rb index ab9e103..5fba374 100644 --- a/lib/schematic/types/plan_version_company_migration_status.rb +++ b/lib/schematic/types/plan_version_company_migration_status.rb @@ -5,6 +5,7 @@ module Types module PlanVersionCompanyMigrationStatus extend Schematic::Internal::Types::Enum + CANCELLED = "cancelled" COMPLETED = "completed" FAILED = "failed" IN_PROGRESS = "in_progress" diff --git a/lib/schematic/types/plan_version_migration_response_data.rb b/lib/schematic/types/plan_version_migration_response_data.rb index 1d4be18..47c03ff 100644 --- a/lib/schematic/types/plan_version_migration_response_data.rb +++ b/lib/schematic/types/plan_version_migration_response_data.rb @@ -15,6 +15,8 @@ class PlanVersionMigrationResponseData < Internal::Types::Model field :id, -> { String }, optional: false, nullable: false + field :next_due_at, -> { String }, optional: true, nullable: false + field :plan_id, -> { String }, optional: false, nullable: false field :plan_version_id_from, -> { String }, optional: true, nullable: false diff --git a/lib/schematic/types/plan_version_migration_status.rb b/lib/schematic/types/plan_version_migration_status.rb index aa71305..19ce254 100644 --- a/lib/schematic/types/plan_version_migration_status.rb +++ b/lib/schematic/types/plan_version_migration_status.rb @@ -5,6 +5,7 @@ module Types module PlanVersionMigrationStatus extend Schematic::Internal::Types::Enum + CANCELLED = "cancelled" COMPLETED = "completed" FAILED = "failed" IN_PROGRESS = "in_progress" diff --git a/lib/schematic/types/plan_version_migration_strategy.rb b/lib/schematic/types/plan_version_migration_strategy.rb index 7a31f24..64cb94d 100644 --- a/lib/schematic/types/plan_version_migration_strategy.rb +++ b/lib/schematic/types/plan_version_migration_strategy.rb @@ -5,6 +5,7 @@ module Types module PlanVersionMigrationStrategy extend Schematic::Internal::Types::Enum + END_OF_BILLING_PERIOD = "end_of_billing_period" IMMEDIATE = "immediate" LEAVE = "leave" end diff --git a/lib/schematic/version.rb b/lib/schematic/version.rb index 20fb7ff..c0c2844 100644 --- a/lib/schematic/version.rb +++ b/lib/schematic/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module Schematic - VERSION = "1.4.15" + VERSION = "1.4.16" end diff --git a/reference.md b/reference.md index 998398f..d9fa855 100644 --- a/reference.md +++ b/reference.md @@ -1273,6 +1273,14 @@ client.accounts.update_onboarding_state
+**dismissed:** `Internal::Types::Boolean` + +
+
+ +
+
+ **path:** `Schematic::Types::OnboardingPath`
@@ -14400,6 +14408,14 @@ client.plans.retry_custom_plan_billing(
+**billing_cycle_anchor:** `String` — The date the subscription's billing period renews on. Only honored when the retry creates a subscription. + +
+
+ +
+
+ **customer_email:** `String`
@@ -14416,6 +14432,14 @@ client.plans.retry_custom_plan_billing(
+**prorate_first_period:** `Internal::Types::Boolean` — When true, the partial period between the subscription starting and its renewal date is billed pro rata straight away. When false that period is free and no invoice is raised until the renewal date. Only applies alongside billing_cycle_anchor. Defaults to true. + +
+
+ +
+
+ **send_invoice:** `Internal::Types::Boolean` — Whether Stripe emails the invoice when it is finalized. Defaults to true.
@@ -15581,7 +15605,7 @@ client.plans.delete_plan_version( client.plans.publish_plan_version( plan_version_id: "plan_version_id", excluded_company_ids: ["excluded_company_ids"], - migration_strategy: "immediate" + migration_strategy: "end_of_billing_period" ) ``` @@ -15621,6 +15645,14 @@ client.plans.publish_plan_version(
+**billing_cycle_anchor:** `String` — The date the subscription's billing period renews on. Only honored on a first publish that starts a subscription. + +
+
+ +
+
+ **coupon_external_id:** `String`
@@ -15677,6 +15709,14 @@ client.plans.publish_plan_version(
+**prorate_first_period:** `Internal::Types::Boolean` — When true, the partial period between the subscription starting and its renewal date is billed pro rata straight away. When false that period is free and no invoice is raised until the renewal date. Only applies alongside billing_cycle_anchor. Defaults to true. + +
+
+ +
+
+ **proration_behavior:** `Schematic::Types::MigrationProrationBehavior`
@@ -20378,7 +20418,7 @@ client.plangroups.update_plan_group( client.planmigrations.list_company_migrations( migration_id: "migration_id", q: "q", - status: "completed", + status: "cancelled", limit: 1000000, offset: 1000000 ) @@ -20512,7 +20552,7 @@ client.planmigrations.retry_company_migration(plan_version_company_migration_id: client.planmigrations.count_company_migrations( migration_id: "migration_id", q: "q", - status: "completed", + status: "cancelled", limit: 1000000, offset: 1000000 ) @@ -20597,7 +20637,7 @@ client.planmigrations.count_company_migrations( ```ruby client.planmigrations.list_migrations( plan_version_id: "plan_version_id", - status: "completed", + status: "cancelled", limit: 1000000, offset: 1000000 ) @@ -20675,7 +20715,7 @@ client.planmigrations.list_migrations( client.planmigrations.create_migration( plan_id: "plan_id", plan_version_id_to: "plan_version_id_to", - strategy: "immediate", + strategy: "end_of_billing_period", target_plan_type: "plan" ) ``` @@ -20812,6 +20852,110 @@ client.planmigrations.get_migration(plan_version_migration_id: "plan_version_mig
+ +
+ + +
client.planmigrations.cancel_migration(plan_version_migration_id:) -> Schematic::Planmigrations::Types::CancelMigrationResponse +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```ruby +client.planmigrations.cancel_migration(plan_version_migration_id: "plan_version_migration_id") +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**plan_version_migration_id:** `String` — plan_version_migration_id + +
+
+ +
+
+ +**request_options:** `Schematic::Planmigrations::RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.planmigrations.complete_migration_now(plan_version_migration_id:, request) -> Schematic::Planmigrations::Types::CompleteMigrationNowResponse +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```ruby +client.planmigrations.complete_migration_now(plan_version_migration_id: "plan_version_migration_id") +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**plan_version_migration_id:** `String` — plan_version_migration_id + +
+
+ +
+
+ +**proration_behavior:** `Schematic::Types::MigrationProrationBehavior` + +
+
+ +
+
+ +**request_options:** `Schematic::Planmigrations::RequestOptions` + +
+
+
+
+ +
@@ -20890,7 +21034,7 @@ client.planmigrations.retry_migration( ```ruby client.planmigrations.count_migrations( plan_version_id: "plan_version_id", - status: "completed", + status: "cancelled", limit: 1000000, offset: 1000000 ) diff --git a/test/rules_engine_clock_test.rb b/test/rules_engine_clock_test.rb deleted file mode 100644 index 8711b5e..0000000 --- a/test/rules_engine_clock_test.rb +++ /dev/null @@ -1,75 +0,0 @@ -# frozen_string_literal: true - -require_relative "test_helper" -require "minitest/autorun" - -# Regression for SCHY-471. -# -# A company-override entitlement rule whose metric condition uses a -# calendar/billing metric period drives the engine into the metric-period-reset -# code path, which needs a wall clock. On the raw wasm32-unknown-unknown build -# that path used to trap (+wasm unreachable+); the flag then wrongly fell back to -# its default value for a company that is legitimately entitled. The host now -# injects the current time via +setCurrentTimeMillis+ so this evaluates cleanly. -class RulesEngineClockTest < Minitest::Test - def setup - @engine = Schematic::RulesEngine.new - @engine.initialize! - # The wasm binary is fetched via scripts/download-wasm.sh and may be absent - # (or the wasmtime gem missing) in some environments — skip rather than fail. - skip "WASM rules engine unavailable (wasm binary or wasmtime gem missing)" unless @engine.initialized? - end - - def flag - { - "id" => "flag1", "key" => "mcp-access", "account_id" => "acc_1", - "environment_id" => "env_1", "default_value" => false, "rules" => [] - } - end - - # Usage 40 < allocation 100, so the override grants the feature. - def entitled_company - { - "id" => "co_entitled", "account_id" => "acc_1", "environment_id" => "env_1", - "keys" => { "id" => "co_entitled" }, - "metrics" => [{ - "account_id" => "acc_1", "environment_id" => "env_1", "company_id" => "co_entitled", - "event_subtype" => "api-calls", "period" => "current_month", - "month_reset" => "billing_cycle", "value" => 40, "created_at" => "2023-01-01T00:00:00Z" - }], - "rules" => [{ - "id" => "rule_override", "flag_id" => "flag1", "account_id" => "acc_1", - "environment_id" => "env_1", "name" => "Company Override", - "rule_type" => "company_override", "priority" => 0, "value" => true, - "condition_groups" => [], - "conditions" => [ - { - "id" => "cond_company", "account_id" => "acc_1", "environment_id" => "env_1", - "condition_type" => "company", "operator" => "eq", - "resource_ids" => ["co_entitled"], "trait_value" => "" - }, - { - "id" => "cond_metric", "account_id" => "acc_1", "environment_id" => "env_1", - "condition_type" => "metric", "operator" => "lt", "event_subtype" => "api-calls", - "metric_value" => 100, "metric_period" => "current_month", - "metric_period_month_reset" => "billing_cycle", "trait_value" => "100" - } - ] - }] - } - end - - def test_billing_metric_override_evaluates_without_trapping - result = @engine.check_flag(flag, entitled_company) - - assert result[:value], "company override should grant the flag, not fall back to default false" - assert_match(/override/i, result[:reason].to_s) - end - - def test_billing_metric_override_populates_reset_at - result = @engine.check_flag(flag, entitled_company) - - refute_nil result[:feature_usage_reset_at], - "reset-at should be computed from the injected host time" - end -end From 53a67bac373a49c7b82c21ac23e1877e1e4dc881 Mon Sep 17 00:00:00 2001 From: "fern-api[bot]" <115122769+fern-api[bot]@users.noreply.github.com> Date: Mon, 31 Aug 2026 10:02:35 +0000 Subject: [PATCH 2/2] [fern-replay] Applied customizations Patches applied (2): - patch-5da692c2: inject host time into datastream wasm rules engine (SCHY-471) - patch-ee61788c: fix rubocop offenses in clock regression test (SCHY-471) --- .fern/replay.lock | 12 ++++-- test/rules_engine_clock_test.rb | 75 +++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 test/rules_engine_clock_test.rb diff --git a/.fern/replay.lock b/.fern/replay.lock index baa374d..0e103c9 100644 --- a/.fern/replay.lock +++ b/.fern/replay.lock @@ -72,14 +72,20 @@ generations: cli_version: unknown generator_versions: fernapi/fern-ruby-sdk: 1.23.2 -current_generation: a8692cf0b5fbf1bf984d1f70375e08731b5f5482 + - commit_sha: 67f9937764d88f96352beba4a48e64bd6cd13afb + tree_hash: dfe7c09296aa8a8b6a52b8ce71be1c5752722cc0 + timestamp: 2026-08-31T10:02:30.491Z + cli_version: unknown + generator_versions: + fernapi/fern-ruby-sdk: 1.23.2 +current_generation: 67f9937764d88f96352beba4a48e64bd6cd13afb patches: - id: patch-5da692c2 content_hash: sha256:e652287219a0a709e16112ced444e6472c6fa8bdfe888edf868caaf9769a9472 original_commit: 5da692c20aef08577d900f9a860b5f78a549418e original_message: inject host time into datastream wasm rules engine (SCHY-471) original_author: Christopher Brady - base_generation: a8692cf0b5fbf1bf984d1f70375e08731b5f5482 + base_generation: 67f9937764d88f96352beba4a48e64bd6cd13afb files: - test/rules_engine_clock_test.rb patch_content: | @@ -247,7 +253,7 @@ patches: original_commit: ee61788c5a83fce5dd5768b2536391459550d176 original_message: fix rubocop offenses in clock regression test (SCHY-471) original_author: Christopher Brady - base_generation: a8692cf0b5fbf1bf984d1f70375e08731b5f5482 + base_generation: 67f9937764d88f96352beba4a48e64bd6cd13afb files: - test/rules_engine_clock_test.rb patch_content: | diff --git a/test/rules_engine_clock_test.rb b/test/rules_engine_clock_test.rb new file mode 100644 index 0000000..8711b5e --- /dev/null +++ b/test/rules_engine_clock_test.rb @@ -0,0 +1,75 @@ +# frozen_string_literal: true + +require_relative "test_helper" +require "minitest/autorun" + +# Regression for SCHY-471. +# +# A company-override entitlement rule whose metric condition uses a +# calendar/billing metric period drives the engine into the metric-period-reset +# code path, which needs a wall clock. On the raw wasm32-unknown-unknown build +# that path used to trap (+wasm unreachable+); the flag then wrongly fell back to +# its default value for a company that is legitimately entitled. The host now +# injects the current time via +setCurrentTimeMillis+ so this evaluates cleanly. +class RulesEngineClockTest < Minitest::Test + def setup + @engine = Schematic::RulesEngine.new + @engine.initialize! + # The wasm binary is fetched via scripts/download-wasm.sh and may be absent + # (or the wasmtime gem missing) in some environments — skip rather than fail. + skip "WASM rules engine unavailable (wasm binary or wasmtime gem missing)" unless @engine.initialized? + end + + def flag + { + "id" => "flag1", "key" => "mcp-access", "account_id" => "acc_1", + "environment_id" => "env_1", "default_value" => false, "rules" => [] + } + end + + # Usage 40 < allocation 100, so the override grants the feature. + def entitled_company + { + "id" => "co_entitled", "account_id" => "acc_1", "environment_id" => "env_1", + "keys" => { "id" => "co_entitled" }, + "metrics" => [{ + "account_id" => "acc_1", "environment_id" => "env_1", "company_id" => "co_entitled", + "event_subtype" => "api-calls", "period" => "current_month", + "month_reset" => "billing_cycle", "value" => 40, "created_at" => "2023-01-01T00:00:00Z" + }], + "rules" => [{ + "id" => "rule_override", "flag_id" => "flag1", "account_id" => "acc_1", + "environment_id" => "env_1", "name" => "Company Override", + "rule_type" => "company_override", "priority" => 0, "value" => true, + "condition_groups" => [], + "conditions" => [ + { + "id" => "cond_company", "account_id" => "acc_1", "environment_id" => "env_1", + "condition_type" => "company", "operator" => "eq", + "resource_ids" => ["co_entitled"], "trait_value" => "" + }, + { + "id" => "cond_metric", "account_id" => "acc_1", "environment_id" => "env_1", + "condition_type" => "metric", "operator" => "lt", "event_subtype" => "api-calls", + "metric_value" => 100, "metric_period" => "current_month", + "metric_period_month_reset" => "billing_cycle", "trait_value" => "100" + } + ] + }] + } + end + + def test_billing_metric_override_evaluates_without_trapping + result = @engine.check_flag(flag, entitled_company) + + assert result[:value], "company override should grant the flag, not fall back to default false" + assert_match(/override/i, result[:reason].to_s) + end + + def test_billing_metric_override_populates_reset_at + result = @engine.check_flag(flag, entitled_company) + + refute_nil result[:feature_usage_reset_at], + "reset-at should be computed from the injected host time" + end +end