diff --git a/.fern/metadata.json b/.fern/metadata.json index 79dc702..fe0d6d9 100644 --- a/.fern/metadata.json +++ b/.fern/metadata.json @@ -1,7 +1,7 @@ { "cliVersion": "5.50.0", "generatorName": "fernapi/fern-python-sdk", - "generatorVersion": "5.29.3", + "generatorVersion": "5.29.4", "generatorConfig": { "inline_request_params": true, "client": { @@ -23,10 +23,10 @@ } ] }, - "originGitCommit": "31f498c0a9babdc0eec5ae88e1212a254b2f2561", + "originGitCommit": "a79351b3e09fa9821e0727a5fbe602b45ec24360", "originGitCommitIsDirty": false, "invokedBy": "ci", - "requestedVersion": "1.3.5", + "requestedVersion": "1.3.6", "ciProvider": "github", - "sdkVersion": "1.3.5" + "sdkVersion": "1.3.6" } \ No newline at end of file diff --git a/.fern/replay.lock b/.fern/replay.lock index d0b3f5a..6508c63 100644 --- a/.fern/replay.lock +++ b/.fern/replay.lock @@ -54,5 +54,11 @@ generations: cli_version: unknown generator_versions: fernapi/fern-python-sdk: 5.29.3 -current_generation: 071999bbc19019254b4bc41a10298b760e45681f + - commit_sha: d10db3584c0f6d0bfdb94a51edb69a2d7ac8dc50 + tree_hash: f54dd902260e30a6b0b87fb36de2492b2c7b607a + timestamp: 2026-09-08T13:56:05.795Z + cli_version: unknown + generator_versions: + fernapi/fern-python-sdk: 5.29.4 +current_generation: d10db3584c0f6d0bfdb94a51edb69a2d7ac8dc50 patches: [] diff --git a/pyproject.toml b/pyproject.toml index 3f45dab..fae3f10 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ dynamic = ["version"] [tool.poetry] name = "schematichq" -version = "1.3.5" +version = "1.3.6" description = "" readme = "README.md" authors = [] diff --git a/src/schematic/__init__.py b/src/schematic/__init__.py index e4e453a..eb4ca65 100644 --- a/src/schematic/__init__.py +++ b/src/schematic/__init__.py @@ -414,6 +414,8 @@ SegmentStatusResp, SkippedEntitlementErrorResponseData, SkippedEntitlementResponseData, + SlackConnectInviteStatus, + SlackConnectInviteView, SortDirection, StripeEmbedInfo, StripeIntegrationConfig, @@ -1694,6 +1696,8 @@ "SendTestWebhookActionResponse": ".webhooks", "SkippedEntitlementErrorResponseData": ".types", "SkippedEntitlementResponseData": ".types", + "SlackConnectInviteStatus": ".types", + "SlackConnectInviteView": ".types", "SoftDeleteBillingCreditResponse": ".credits", "SortDirection": ".types", "StartDataImportResponse": ".integrationsapi", @@ -2613,6 +2617,8 @@ def __dir__(): "SendTestWebhookActionResponse", "SkippedEntitlementErrorResponseData", "SkippedEntitlementResponseData", + "SlackConnectInviteStatus", + "SlackConnectInviteView", "SoftDeleteBillingCreditResponse", "SortDirection", "StartDataImportResponse", diff --git a/src/schematic/core/client_wrapper.py b/src/schematic/core/client_wrapper.py index 172198f..049d1b1 100644 --- a/src/schematic/core/client_wrapper.py +++ b/src/schematic/core/client_wrapper.py @@ -33,12 +33,12 @@ def get_headers(self) -> typing.Dict[str, str]: import platform headers: typing.Dict[str, str] = { - "User-Agent": "schematichq/1.3.5", + "User-Agent": "schematichq/1.3.6", "X-Fern-Language": "Python", "X-Fern-Runtime": f"python/{platform.python_version()}", "X-Fern-Platform": f"{platform.system().lower()}/{platform.release()}", "X-Fern-SDK-Name": "schematichq", - "X-Fern-SDK-Version": "1.3.5", + "X-Fern-SDK-Version": "1.3.6", **(self.get_custom_headers() or {}), } headers["X-Schematic-Api-Key"] = self.api_key diff --git a/src/schematic/types/__init__.py b/src/schematic/types/__init__.py index b092c98..fd3c1d1 100644 --- a/src/schematic/types/__init__.py +++ b/src/schematic/types/__init__.py @@ -421,6 +421,8 @@ from .segment_status_resp import SegmentStatusResp from .skipped_entitlement_error_response_data import SkippedEntitlementErrorResponseData from .skipped_entitlement_response_data import SkippedEntitlementResponseData + from .slack_connect_invite_status import SlackConnectInviteStatus + from .slack_connect_invite_view import SlackConnectInviteView from .sort_direction import SortDirection from .stripe_embed_info import StripeEmbedInfo from .stripe_integration_config import StripeIntegrationConfig @@ -891,6 +893,8 @@ "SegmentStatusResp": ".segment_status_resp", "SkippedEntitlementErrorResponseData": ".skipped_entitlement_error_response_data", "SkippedEntitlementResponseData": ".skipped_entitlement_response_data", + "SlackConnectInviteStatus": ".slack_connect_invite_status", + "SlackConnectInviteView": ".slack_connect_invite_view", "SortDirection": ".sort_direction", "StripeEmbedInfo": ".stripe_embed_info", "StripeIntegrationConfig": ".stripe_integration_config", @@ -1385,6 +1389,8 @@ def __dir__(): "SegmentStatusResp", "SkippedEntitlementErrorResponseData", "SkippedEntitlementResponseData", + "SlackConnectInviteStatus", + "SlackConnectInviteView", "SortDirection", "StripeEmbedInfo", "StripeIntegrationConfig", diff --git a/src/schematic/types/get_onboarding_state_resp.py b/src/schematic/types/get_onboarding_state_resp.py index 88d829f..c89cc42 100644 --- a/src/schematic/types/get_onboarding_state_resp.py +++ b/src/schematic/types/get_onboarding_state_resp.py @@ -11,6 +11,7 @@ from .onboarding_requirement_view import OnboardingRequirementView from .onboarding_stripe_import import OnboardingStripeImport from .onboarding_track import OnboardingTrack +from .slack_connect_invite_view import SlackConnectInviteView class GetOnboardingStateResp(UniversalBaseModel): @@ -22,6 +23,7 @@ class GetOnboardingStateResp(UniversalBaseModel): path: typing.Optional[OnboardingPath] = None pricing_page_url: typing.Optional[str] = None requirements: typing.List[OnboardingRequirementView] + slack_connect: typing.Optional[SlackConnectInviteView] = None stripe_import: typing.Optional[OnboardingStripeImport] = None suggested_next: typing.List[OnboardingRequirement] track: typing.Optional[OnboardingTrack] = None diff --git a/src/schematic/types/slack_connect_invite_status.py b/src/schematic/types/slack_connect_invite_status.py new file mode 100644 index 0000000..8e2873d --- /dev/null +++ b/src/schematic/types/slack_connect_invite_status.py @@ -0,0 +1,7 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +SlackConnectInviteStatus = typing.Union[ + typing.Literal["accepted", "declined", "dismissed", "expired", "pending"], typing.Any +] diff --git a/src/schematic/types/slack_connect_invite_view.py b/src/schematic/types/slack_connect_invite_view.py new file mode 100644 index 0000000..58b44fb --- /dev/null +++ b/src/schematic/types/slack_connect_invite_view.py @@ -0,0 +1,24 @@ +# This file was auto-generated by Fern from our API Definition. + +import datetime as dt +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel +from .slack_connect_invite_status import SlackConnectInviteStatus + + +class SlackConnectInviteView(UniversalBaseModel): + can_resend_at: typing.Optional[dt.datetime] = None + email: str + sent_at: dt.datetime + status: SlackConnectInviteStatus + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/tests/utils/test_http_client.py b/tests/utils/test_http_client.py index cfa6acb..d8b598f 100644 --- a/tests/utils/test_http_client.py +++ b/tests/utils/test_http_client.py @@ -734,28 +734,20 @@ def _make_response(status_code: int) -> httpx.Response: return httpx.Response(status_code=status_code, content=b"") -@pytest.mark.parametrize( - "status_code", - [408, 409, 429, 500, 501, 502, 503, 504, 599], -) +RETRYABLE_STATUS_CODES = [408, 409, 429, 500, 501, 502, 503, 504, 599] +NON_RETRYABLE_STATUS_CODES = [200, 201, 301, 400, 401, 403, 404] + + +@pytest.mark.parametrize("status_code", RETRYABLE_STATUS_CODES) def test_should_retry_retryable_status_codes(status_code: int) -> None: - """Legacy mode: retries on 408, 409, 429, and all >= 500.""" assert _should_retry(_make_response(status_code)) is True -@pytest.mark.parametrize( - "status_code", - [200, 201, 301, 400, 401, 403, 404], -) +@pytest.mark.parametrize("status_code", NON_RETRYABLE_STATUS_CODES) def test_should_not_retry_non_retryable_status_codes(status_code: int) -> None: assert _should_retry(_make_response(status_code)) is False -def test_should_retry_599_upper_boundary() -> None: - """Legacy mode retries on >= 500, which includes 599.""" - assert _should_retry(_make_response(599)) is True - - # --------------------------------------------------------------------------- # RequestOptions timeout resolution tests (timeout / deprecated timeout_in_seconds) # ---------------------------------------------------------------------------