From 021294ecc577e24f56839d852bc978b839feb7fe Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 20:13:51 +0000 Subject: [PATCH 1/4] feat(api): api update --- .stats.yml | 4 +-- src/whop_sdk/resources/companies.py | 30 +++++++++++++++++++ src/whop_sdk/types/affiliate.py | 23 ++++++++++---- src/whop_sdk/types/affiliate_list_response.py | 23 ++++++++++---- .../affiliates/override_create_response.py | 10 +++++-- .../affiliates/override_list_response.py | 10 +++++-- .../affiliates/override_retrieve_response.py | 10 +++++-- .../affiliates/override_update_response.py | 10 +++++-- src/whop_sdk/types/company_update_params.py | 18 +++++++++++ src/whop_sdk/types/shared/company.py | 27 ++++++++++++++++- tests/api_resources/test_companies.py | 6 ++++ 11 files changed, 148 insertions(+), 23 deletions(-) diff --git a/.stats.yml b/.stats.yml index c2e464b..95e665f 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 191 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-97e920db587b07c064bef1bf31de5e110a3750ddfddc8fca26642e79e6b827f8.yml -openapi_spec_hash: 97ca16cc55271602443a4329d1e02895 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-e3735d7700813328ddb9c3da0127c03351e1e2102d6197b3a22f7a0627209488.yml +openapi_spec_hash: 6bd34ccbef8a342ba0f04737113b3529 config_hash: 1a836d20bb988f001cc66d1526f71306 diff --git a/src/whop_sdk/resources/companies.py b/src/whop_sdk/resources/companies.py index 37cb077..6d3755a 100644 --- a/src/whop_sdk/resources/companies.py +++ b/src/whop_sdk/resources/companies.py @@ -163,8 +163,11 @@ def update( self, id: str, *, + affiliate_application_required: Optional[bool] | Omit = omit, + affiliate_instructions: Optional[str] | Omit = omit, banner_image: Optional[company_update_params.BannerImage] | Omit = omit, description: Optional[str] | Omit = omit, + featured_affiliate_product_id: Optional[str] | Omit = omit, logo: Optional[company_update_params.Logo] | Omit = omit, route: Optional[str] | Omit = omit, send_customer_emails: Optional[bool] | Omit = omit, @@ -186,11 +189,20 @@ def update( - `company:basic:read` Args: + affiliate_application_required: Whether prospective affiliates must submit an application before they can + promote this company. + + affiliate_instructions: Guidelines and instructions shown to affiliates explaining how to promote this + company's products. + banner_image: The company's banner image. Accepts PNG or JPEG format. description: A promotional pitch displayed to potential customers on the company's store page. + featured_affiliate_product_id: The ID of the product to feature on this company's affiliate page. Pass null to + clear. + logo: The company's logo image. Accepts PNG, JPEG, or GIF format. route: The unique URL slug for the company's store page. Must be lowercase and can @@ -219,8 +231,11 @@ def update( f"/companies/{id}", body=maybe_transform( { + "affiliate_application_required": affiliate_application_required, + "affiliate_instructions": affiliate_instructions, "banner_image": banner_image, "description": description, + "featured_affiliate_product_id": featured_affiliate_product_id, "logo": logo, "route": route, "send_customer_emails": send_customer_emails, @@ -452,8 +467,11 @@ async def update( self, id: str, *, + affiliate_application_required: Optional[bool] | Omit = omit, + affiliate_instructions: Optional[str] | Omit = omit, banner_image: Optional[company_update_params.BannerImage] | Omit = omit, description: Optional[str] | Omit = omit, + featured_affiliate_product_id: Optional[str] | Omit = omit, logo: Optional[company_update_params.Logo] | Omit = omit, route: Optional[str] | Omit = omit, send_customer_emails: Optional[bool] | Omit = omit, @@ -475,11 +493,20 @@ async def update( - `company:basic:read` Args: + affiliate_application_required: Whether prospective affiliates must submit an application before they can + promote this company. + + affiliate_instructions: Guidelines and instructions shown to affiliates explaining how to promote this + company's products. + banner_image: The company's banner image. Accepts PNG or JPEG format. description: A promotional pitch displayed to potential customers on the company's store page. + featured_affiliate_product_id: The ID of the product to feature on this company's affiliate page. Pass null to + clear. + logo: The company's logo image. Accepts PNG, JPEG, or GIF format. route: The unique URL slug for the company's store page. Must be lowercase and can @@ -508,8 +535,11 @@ async def update( f"/companies/{id}", body=await async_maybe_transform( { + "affiliate_application_required": affiliate_application_required, + "affiliate_instructions": affiliate_instructions, "banner_image": banner_image, "description": description, + "featured_affiliate_product_id": featured_affiliate_product_id, "logo": logo, "route": route, "send_customer_emails": send_customer_emails, diff --git a/src/whop_sdk/types/affiliate.py b/src/whop_sdk/types/affiliate.py index 26de2b8..e6809ff 100644 --- a/src/whop_sdk/types/affiliate.py +++ b/src/whop_sdk/types/affiliate.py @@ -39,7 +39,9 @@ class User(BaseModel): class Affiliate(BaseModel): - """An affiliate of a company or a global affiliate""" + """ + An affiliate tracks a user's referral performance and commission earnings for a company, including retention rates, revenue metrics, and payout configurations. + """ id: str """The unique identifier for the affiliate.""" @@ -54,13 +56,16 @@ class Affiliate(BaseModel): """The datetime the affiliate was created.""" customer_retention_rate: str - """How many referrals have remained since they joined as members""" + """The percentage of referred customers who are still active members""" customer_retention_rate_ninety_days: str - """A rolling 90-day retention rate for this affiliate""" + """The percentage of referred customers who remained active over the last 90 days""" monthly_recurring_revenue_usd: str - """The total MRR of the affiliate""" + """ + The monthly recurring revenue generated by this affiliate's referrals, formatted + as a USD currency string + """ status: Optional[Status] = None """Statuses for resources""" @@ -69,13 +74,19 @@ class Affiliate(BaseModel): """The total count of all overrides for this affiliate""" total_referral_earnings_usd: str - """The total earnings of the affiliate from the users they referred""" + """ + The total commission earnings paid to this affiliate, formatted as a USD + currency string + """ total_referrals_count: int """The total referrals of the affiliate""" total_revenue_usd: str - """The total revenue of the affiliate from their referrals""" + """ + The total revenue generated from this affiliate's referrals, formatted as a USD + currency string + """ updated_at: datetime """The datetime the affiliate was last updated.""" diff --git a/src/whop_sdk/types/affiliate_list_response.py b/src/whop_sdk/types/affiliate_list_response.py index 9e24c35..64b57ca 100644 --- a/src/whop_sdk/types/affiliate_list_response.py +++ b/src/whop_sdk/types/affiliate_list_response.py @@ -39,7 +39,9 @@ class User(BaseModel): class AffiliateListResponse(BaseModel): - """An affiliate of a company or a global affiliate""" + """ + An affiliate tracks a user's referral performance and commission earnings for a company, including retention rates, revenue metrics, and payout configurations. + """ id: str """The unique identifier for the affiliate.""" @@ -54,13 +56,16 @@ class AffiliateListResponse(BaseModel): """The datetime the affiliate was created.""" customer_retention_rate: str - """How many referrals have remained since they joined as members""" + """The percentage of referred customers who are still active members""" customer_retention_rate_ninety_days: str - """A rolling 90-day retention rate for this affiliate""" + """The percentage of referred customers who remained active over the last 90 days""" monthly_recurring_revenue_usd: str - """The total MRR of the affiliate""" + """ + The monthly recurring revenue generated by this affiliate's referrals, formatted + as a USD currency string + """ status: Optional[Status] = None """Statuses for resources""" @@ -69,13 +74,19 @@ class AffiliateListResponse(BaseModel): """The total count of all overrides for this affiliate""" total_referral_earnings_usd: str - """The total earnings of the affiliate from the users they referred""" + """ + The total commission earnings paid to this affiliate, formatted as a USD + currency string + """ total_referrals_count: int """The total referrals of the affiliate""" total_revenue_usd: str - """The total revenue of the affiliate from their referrals""" + """ + The total revenue generated from this affiliate's referrals, formatted as a USD + currency string + """ updated_at: datetime """The datetime the affiliate was last updated.""" diff --git a/src/whop_sdk/types/affiliates/override_create_response.py b/src/whop_sdk/types/affiliates/override_create_response.py index b7c63d4..08a85c7 100644 --- a/src/whop_sdk/types/affiliates/override_create_response.py +++ b/src/whop_sdk/types/affiliates/override_create_response.py @@ -13,7 +13,9 @@ class OverrideCreateResponse(BaseModel): - """An object storing information about the affiliate""" + """ + A commission configuration for an affiliate, defining payout terms for a specific plan or revenue share + """ id: str """The unique identifier for the affiliate override.""" @@ -31,7 +33,11 @@ class OverrideCreateResponse(BaseModel): """The type of commission (percentage or flat_fee).""" commission_value: float - """The commission value (percentage 1-100 or flat fee in dollars).""" + """The commission amount. + + A percentage (1-100) when commission_type is percentage, or a dollar amount when + flat_fee. + """ override_type: AffiliateOverrideRoles """The type of override (standard or rev_share).""" diff --git a/src/whop_sdk/types/affiliates/override_list_response.py b/src/whop_sdk/types/affiliates/override_list_response.py index 09ce176..f470429 100644 --- a/src/whop_sdk/types/affiliates/override_list_response.py +++ b/src/whop_sdk/types/affiliates/override_list_response.py @@ -13,7 +13,9 @@ class OverrideListResponse(BaseModel): - """An object storing information about the affiliate""" + """ + A commission configuration for an affiliate, defining payout terms for a specific plan or revenue share + """ id: str """The unique identifier for the affiliate override.""" @@ -31,7 +33,11 @@ class OverrideListResponse(BaseModel): """The type of commission (percentage or flat_fee).""" commission_value: float - """The commission value (percentage 1-100 or flat fee in dollars).""" + """The commission amount. + + A percentage (1-100) when commission_type is percentage, or a dollar amount when + flat_fee. + """ override_type: AffiliateOverrideRoles """The type of override (standard or rev_share).""" diff --git a/src/whop_sdk/types/affiliates/override_retrieve_response.py b/src/whop_sdk/types/affiliates/override_retrieve_response.py index 4e54c0f..61b738f 100644 --- a/src/whop_sdk/types/affiliates/override_retrieve_response.py +++ b/src/whop_sdk/types/affiliates/override_retrieve_response.py @@ -13,7 +13,9 @@ class OverrideRetrieveResponse(BaseModel): - """An object storing information about the affiliate""" + """ + A commission configuration for an affiliate, defining payout terms for a specific plan or revenue share + """ id: str """The unique identifier for the affiliate override.""" @@ -31,7 +33,11 @@ class OverrideRetrieveResponse(BaseModel): """The type of commission (percentage or flat_fee).""" commission_value: float - """The commission value (percentage 1-100 or flat fee in dollars).""" + """The commission amount. + + A percentage (1-100) when commission_type is percentage, or a dollar amount when + flat_fee. + """ override_type: AffiliateOverrideRoles """The type of override (standard or rev_share).""" diff --git a/src/whop_sdk/types/affiliates/override_update_response.py b/src/whop_sdk/types/affiliates/override_update_response.py index b9ed5c9..3b830e3 100644 --- a/src/whop_sdk/types/affiliates/override_update_response.py +++ b/src/whop_sdk/types/affiliates/override_update_response.py @@ -13,7 +13,9 @@ class OverrideUpdateResponse(BaseModel): - """An object storing information about the affiliate""" + """ + A commission configuration for an affiliate, defining payout terms for a specific plan or revenue share + """ id: str """The unique identifier for the affiliate override.""" @@ -31,7 +33,11 @@ class OverrideUpdateResponse(BaseModel): """The type of commission (percentage or flat_fee).""" commission_value: float - """The commission value (percentage 1-100 or flat fee in dollars).""" + """The commission amount. + + A percentage (1-100) when commission_type is percentage, or a dollar amount when + flat_fee. + """ override_type: AffiliateOverrideRoles """The type of override (standard or rev_share).""" diff --git a/src/whop_sdk/types/company_update_params.py b/src/whop_sdk/types/company_update_params.py index c475d5f..15aa74d 100644 --- a/src/whop_sdk/types/company_update_params.py +++ b/src/whop_sdk/types/company_update_params.py @@ -9,6 +9,18 @@ class CompanyUpdateParams(TypedDict, total=False): + affiliate_application_required: Optional[bool] + """ + Whether prospective affiliates must submit an application before they can + promote this company. + """ + + affiliate_instructions: Optional[str] + """ + Guidelines and instructions shown to affiliates explaining how to promote this + company's products. + """ + banner_image: Optional[BannerImage] """The company's banner image. Accepts PNG or JPEG format.""" @@ -18,6 +30,12 @@ class CompanyUpdateParams(TypedDict, total=False): page. """ + featured_affiliate_product_id: Optional[str] + """The ID of the product to feature on this company's affiliate page. + + Pass null to clear. + """ + logo: Optional[Logo] """The company's logo image. Accepts PNG, JPEG, or GIF format.""" diff --git a/src/whop_sdk/types/shared/company.py b/src/whop_sdk/types/shared/company.py index e30b8c1..3a7b1c8 100644 --- a/src/whop_sdk/types/shared/company.py +++ b/src/whop_sdk/types/shared/company.py @@ -6,7 +6,20 @@ from ..._models import BaseModel -__all__ = ["Company", "Logo", "OwnerUser", "SocialLink"] +__all__ = ["Company", "FeaturedAffiliateProduct", "Logo", "OwnerUser", "SocialLink"] + + +class FeaturedAffiliateProduct(BaseModel): + """The product featured for affiliates to promote on this company's affiliate page. + + Null if none is configured. + """ + + id: str + """The unique identifier for the product.""" + + name: str + """The display name of the product shown to customers. Maximum 50 characters.""" class Logo(BaseModel): @@ -54,6 +67,12 @@ class Company(BaseModel): id: str """The unique identifier for the company.""" + affiliate_instructions: Optional[str] = None + """ + Guidelines and instructions provided to affiliates explaining how to promote + this company's products. + """ + created_at: datetime """The datetime the company was created.""" @@ -63,6 +82,12 @@ class Company(BaseModel): customers on the store page. """ + featured_affiliate_product: Optional[FeaturedAffiliateProduct] = None + """The product featured for affiliates to promote on this company's affiliate page. + + Null if none is configured. + """ + logo: Optional[Logo] = None """The company's logo.""" diff --git a/tests/api_resources/test_companies.py b/tests/api_resources/test_companies.py index 30eb5eb..8b3e6f8 100644 --- a/tests/api_resources/test_companies.py +++ b/tests/api_resources/test_companies.py @@ -125,8 +125,11 @@ def test_method_update(self, client: Whop) -> None: def test_method_update_with_all_params(self, client: Whop) -> None: company = client.companies.update( id="biz_xxxxxxxxxxxxxx", + affiliate_application_required=True, + affiliate_instructions="affiliate_instructions", banner_image={"id": "id"}, description="description", + featured_affiliate_product_id="featured_affiliate_product_id", logo={"id": "id"}, route="route", send_customer_emails=True, @@ -321,8 +324,11 @@ async def test_method_update(self, async_client: AsyncWhop) -> None: async def test_method_update_with_all_params(self, async_client: AsyncWhop) -> None: company = await async_client.companies.update( id="biz_xxxxxxxxxxxxxx", + affiliate_application_required=True, + affiliate_instructions="affiliate_instructions", banner_image={"id": "id"}, description="description", + featured_affiliate_product_id="featured_affiliate_product_id", logo={"id": "id"}, route="route", send_customer_emails=True, From ca495f7081478f0056efbad9c75eea30af62f9fe Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 19 Mar 2026 15:36:47 +0000 Subject: [PATCH 2/4] fix: sanitize endpoint path params --- src/whop_sdk/_utils/__init__.py | 1 + src/whop_sdk/_utils/_path.py | 127 ++++++++++++++++++ .../resources/affiliates/affiliates.py | 14 +- .../resources/affiliates/overrides.py | 22 +-- src/whop_sdk/resources/ai_chats.py | 14 +- src/whop_sdk/resources/app_builds.py | 10 +- src/whop_sdk/resources/apps.py | 10 +- src/whop_sdk/resources/authorized_users.py | 10 +- src/whop_sdk/resources/chat_channels.py | 10 +- .../resources/checkout_configurations.py | 6 +- src/whop_sdk/resources/companies.py | 10 +- .../resources/company_token_transactions.py | 6 +- src/whop_sdk/resources/course_chapters.py | 14 +- .../resources/course_lesson_interactions.py | 6 +- src/whop_sdk/resources/course_lessons.py | 26 ++-- src/whop_sdk/resources/course_students.py | 6 +- src/whop_sdk/resources/courses.py | 14 +- src/whop_sdk/resources/dispute_alerts.py | 6 +- src/whop_sdk/resources/disputes.py | 14 +- src/whop_sdk/resources/dm_channels.py | 14 +- src/whop_sdk/resources/dm_members.py | 14 +- src/whop_sdk/resources/entries.py | 14 +- src/whop_sdk/resources/experiences.py | 26 ++-- src/whop_sdk/resources/fee_markups.py | 6 +- src/whop_sdk/resources/files.py | 6 +- src/whop_sdk/resources/forum_posts.py | 10 +- src/whop_sdk/resources/forums.py | 10 +- src/whop_sdk/resources/invoices.py | 10 +- src/whop_sdk/resources/leads.py | 10 +- src/whop_sdk/resources/ledger_accounts.py | 5 +- src/whop_sdk/resources/members.py | 6 +- src/whop_sdk/resources/memberships.py | 118 ++++++++++++++-- src/whop_sdk/resources/messages.py | 14 +- src/whop_sdk/resources/payment_methods.py | 6 +- src/whop_sdk/resources/payments.py | 22 +-- src/whop_sdk/resources/payout_accounts.py | 5 +- src/whop_sdk/resources/payout_methods.py | 6 +- src/whop_sdk/resources/plans.py | 14 +- src/whop_sdk/resources/products.py | 14 +- src/whop_sdk/resources/promo_codes.py | 10 +- src/whop_sdk/resources/reactions.py | 10 +- src/whop_sdk/resources/refunds.py | 6 +- .../resources/resolution_center_cases.py | 6 +- src/whop_sdk/resources/reviews.py | 6 +- src/whop_sdk/resources/setup_intents.py | 6 +- src/whop_sdk/resources/shipments.py | 6 +- src/whop_sdk/resources/support_channels.py | 6 +- src/whop_sdk/resources/transfers.py | 6 +- src/whop_sdk/resources/users.py | 10 +- src/whop_sdk/resources/verifications.py | 6 +- src/whop_sdk/resources/webhooks.py | 14 +- src/whop_sdk/resources/withdrawals.py | 6 +- tests/test_utils/test_path.py | 89 ++++++++++++ 53 files changed, 577 insertions(+), 266 deletions(-) create mode 100644 src/whop_sdk/_utils/_path.py create mode 100644 tests/test_utils/test_path.py diff --git a/src/whop_sdk/_utils/__init__.py b/src/whop_sdk/_utils/__init__.py index dc64e29..10cb66d 100644 --- a/src/whop_sdk/_utils/__init__.py +++ b/src/whop_sdk/_utils/__init__.py @@ -1,3 +1,4 @@ +from ._path import path_template as path_template from ._sync import asyncify as asyncify from ._proxy import LazyProxy as LazyProxy from ._utils import ( diff --git a/src/whop_sdk/_utils/_path.py b/src/whop_sdk/_utils/_path.py new file mode 100644 index 0000000..4d6e1e4 --- /dev/null +++ b/src/whop_sdk/_utils/_path.py @@ -0,0 +1,127 @@ +from __future__ import annotations + +import re +from typing import ( + Any, + Mapping, + Callable, +) +from urllib.parse import quote + +# Matches '.' or '..' where each dot is either literal or percent-encoded (%2e / %2E). +_DOT_SEGMENT_RE = re.compile(r"^(?:\.|%2[eE]){1,2}$") + +_PLACEHOLDER_RE = re.compile(r"\{(\w+)\}") + + +def _quote_path_segment_part(value: str) -> str: + """Percent-encode `value` for use in a URI path segment. + + Considers characters not in `pchar` set from RFC 3986 §3.3 to be unsafe. + https://datatracker.ietf.org/doc/html/rfc3986#section-3.3 + """ + # quote() already treats unreserved characters (letters, digits, and -._~) + # as safe, so we only need to add sub-delims, ':', and '@'. + # Notably, unlike the default `safe` for quote(), / is unsafe and must be quoted. + return quote(value, safe="!$&'()*+,;=:@") + + +def _quote_query_part(value: str) -> str: + """Percent-encode `value` for use in a URI query string. + + Considers &, = and characters not in `query` set from RFC 3986 §3.4 to be unsafe. + https://datatracker.ietf.org/doc/html/rfc3986#section-3.4 + """ + return quote(value, safe="!$'()*+,;:@/?") + + +def _quote_fragment_part(value: str) -> str: + """Percent-encode `value` for use in a URI fragment. + + Considers characters not in `fragment` set from RFC 3986 §3.5 to be unsafe. + https://datatracker.ietf.org/doc/html/rfc3986#section-3.5 + """ + return quote(value, safe="!$&'()*+,;=:@/?") + + +def _interpolate( + template: str, + values: Mapping[str, Any], + quoter: Callable[[str], str], +) -> str: + """Replace {name} placeholders in `template`, quoting each value with `quoter`. + + Placeholder names are looked up in `values`. + + Raises: + KeyError: If a placeholder is not found in `values`. + """ + # re.split with a capturing group returns alternating + # [text, name, text, name, ..., text] elements. + parts = _PLACEHOLDER_RE.split(template) + + for i in range(1, len(parts), 2): + name = parts[i] + if name not in values: + raise KeyError(f"a value for placeholder {{{name}}} was not provided") + val = values[name] + if val is None: + parts[i] = "null" + elif isinstance(val, bool): + parts[i] = "true" if val else "false" + else: + parts[i] = quoter(str(values[name])) + + return "".join(parts) + + +def path_template(template: str, /, **kwargs: Any) -> str: + """Interpolate {name} placeholders in `template` from keyword arguments. + + Args: + template: The template string containing {name} placeholders. + **kwargs: Keyword arguments to interpolate into the template. + + Returns: + The template with placeholders interpolated and percent-encoded. + + Safe characters for percent-encoding are dependent on the URI component. + Placeholders in path and fragment portions are percent-encoded where the `segment` + and `fragment` sets from RFC 3986 respectively are considered safe. + Placeholders in the query portion are percent-encoded where the `query` set from + RFC 3986 §3.3 is considered safe except for = and & characters. + + Raises: + KeyError: If a placeholder is not found in `kwargs`. + ValueError: If resulting path contains /./ or /../ segments (including percent-encoded dot-segments). + """ + # Split the template into path, query, and fragment portions. + fragment_template: str | None = None + query_template: str | None = None + + rest = template + if "#" in rest: + rest, fragment_template = rest.split("#", 1) + if "?" in rest: + rest, query_template = rest.split("?", 1) + path_template = rest + + # Interpolate each portion with the appropriate quoting rules. + path_result = _interpolate(path_template, kwargs, _quote_path_segment_part) + + # Reject dot-segments (. and ..) in the final assembled path. The check + # runs after interpolation so that adjacent placeholders or a mix of static + # text and placeholders that together form a dot-segment are caught. + # Also reject percent-encoded dot-segments to protect against incorrectly + # implemented normalization in servers/proxies. + for segment in path_result.split("/"): + if _DOT_SEGMENT_RE.match(segment): + raise ValueError(f"Constructed path {path_result!r} contains dot-segment {segment!r} which is not allowed") + + result = path_result + if query_template is not None: + result += "?" + _interpolate(query_template, kwargs, _quote_query_part) + if fragment_template is not None: + result += "#" + _interpolate(fragment_template, kwargs, _quote_fragment_part) + + return result diff --git a/src/whop_sdk/resources/affiliates/affiliates.py b/src/whop_sdk/resources/affiliates/affiliates.py index 2c184de..75b951e 100644 --- a/src/whop_sdk/resources/affiliates/affiliates.py +++ b/src/whop_sdk/resources/affiliates/affiliates.py @@ -9,7 +9,7 @@ from ...types import Status, affiliate_list_params, affiliate_create_params from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ..._utils import maybe_transform, async_maybe_transform +from ..._utils import path_template, maybe_transform, async_maybe_transform from ..._compat import cached_property from .overrides import ( OverridesResource, @@ -142,7 +142,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/affiliates/{id}", + path_template("/affiliates/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -259,7 +259,7 @@ def archive( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._post( - f"/affiliates/{id}/archive", + path_template("/affiliates/{id}/archive", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -296,7 +296,7 @@ def unarchive( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._post( - f"/affiliates/{id}/unarchive", + path_template("/affiliates/{id}/unarchive", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -408,7 +408,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/affiliates/{id}", + path_template("/affiliates/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -525,7 +525,7 @@ async def archive( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._post( - f"/affiliates/{id}/archive", + path_template("/affiliates/{id}/archive", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -562,7 +562,7 @@ async def unarchive( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._post( - f"/affiliates/{id}/unarchive", + path_template("/affiliates/{id}/unarchive", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/affiliates/overrides.py b/src/whop_sdk/resources/affiliates/overrides.py index a3158a1..351eab6 100644 --- a/src/whop_sdk/resources/affiliates/overrides.py +++ b/src/whop_sdk/resources/affiliates/overrides.py @@ -8,7 +8,7 @@ import httpx from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ..._utils import required_args, maybe_transform, async_maybe_transform +from ..._utils import path_template, required_args, maybe_transform, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -180,7 +180,7 @@ def create( if not path_id: raise ValueError(f"Expected a non-empty value for `path_id` but received {path_id!r}") return self._post( - f"/affiliates/{path_id}/overrides", + path_template("/affiliates/{path_id}/overrides", path_id=path_id), body=maybe_transform( { "body_id": body_id, @@ -233,7 +233,7 @@ def retrieve( if not override_id: raise ValueError(f"Expected a non-empty value for `override_id` but received {override_id!r}") return self._get( - f"/affiliates/{id}/overrides/{override_id}", + path_template("/affiliates/{id}/overrides/{override_id}", id=id, override_id=override_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -285,7 +285,7 @@ def update( if not override_id: raise ValueError(f"Expected a non-empty value for `override_id` but received {override_id!r}") return self._patch( - f"/affiliates/{id}/overrides/{override_id}", + path_template("/affiliates/{id}/overrides/{override_id}", id=id, override_id=override_id), body=maybe_transform( { "applies_to_payments": applies_to_payments, @@ -346,7 +346,7 @@ def list( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get_api_list( - f"/affiliates/{id}/overrides", + path_template("/affiliates/{id}/overrides", id=id), page=SyncCursorPage[OverrideListResponse], options=make_request_options( extra_headers=extra_headers, @@ -400,7 +400,7 @@ def delete( if not override_id: raise ValueError(f"Expected a non-empty value for `override_id` but received {override_id!r}") return self._delete( - f"/affiliates/{id}/overrides/{override_id}", + path_template("/affiliates/{id}/overrides/{override_id}", id=id, override_id=override_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -547,7 +547,7 @@ async def create( if not path_id: raise ValueError(f"Expected a non-empty value for `path_id` but received {path_id!r}") return await self._post( - f"/affiliates/{path_id}/overrides", + path_template("/affiliates/{path_id}/overrides", path_id=path_id), body=await async_maybe_transform( { "body_id": body_id, @@ -600,7 +600,7 @@ async def retrieve( if not override_id: raise ValueError(f"Expected a non-empty value for `override_id` but received {override_id!r}") return await self._get( - f"/affiliates/{id}/overrides/{override_id}", + path_template("/affiliates/{id}/overrides/{override_id}", id=id, override_id=override_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -652,7 +652,7 @@ async def update( if not override_id: raise ValueError(f"Expected a non-empty value for `override_id` but received {override_id!r}") return await self._patch( - f"/affiliates/{id}/overrides/{override_id}", + path_template("/affiliates/{id}/overrides/{override_id}", id=id, override_id=override_id), body=await async_maybe_transform( { "applies_to_payments": applies_to_payments, @@ -713,7 +713,7 @@ def list( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get_api_list( - f"/affiliates/{id}/overrides", + path_template("/affiliates/{id}/overrides", id=id), page=AsyncCursorPage[OverrideListResponse], options=make_request_options( extra_headers=extra_headers, @@ -767,7 +767,7 @@ async def delete( if not override_id: raise ValueError(f"Expected a non-empty value for `override_id` but received {override_id!r}") return await self._delete( - f"/affiliates/{id}/overrides/{override_id}", + path_template("/affiliates/{id}/overrides/{override_id}", id=id, override_id=override_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/ai_chats.py b/src/whop_sdk/resources/ai_chats.py index 6c9f4a1..16d60eb 100644 --- a/src/whop_sdk/resources/ai_chats.py +++ b/src/whop_sdk/resources/ai_chats.py @@ -9,7 +9,7 @@ from ..types import NotificationPreferences, ai_chat_list_params, ai_chat_create_params, ai_chat_update_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -135,7 +135,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/ai_chats/{id}", + path_template("/ai_chats/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -183,7 +183,7 @@ def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._patch( - f"/ai_chats/{id}", + path_template("/ai_chats/{id}", id=id), body=maybe_transform( { "current_company_id": current_company_id, @@ -287,7 +287,7 @@ def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._delete( - f"/ai_chats/{id}", + path_template("/ai_chats/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -402,7 +402,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/ai_chats/{id}", + path_template("/ai_chats/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -450,7 +450,7 @@ async def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._patch( - f"/ai_chats/{id}", + path_template("/ai_chats/{id}", id=id), body=await async_maybe_transform( { "current_company_id": current_company_id, @@ -554,7 +554,7 @@ async def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._delete( - f"/ai_chats/{id}", + path_template("/ai_chats/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/app_builds.py b/src/whop_sdk/resources/app_builds.py index e4e0f85..80465b2 100644 --- a/src/whop_sdk/resources/app_builds.py +++ b/src/whop_sdk/resources/app_builds.py @@ -9,7 +9,7 @@ from ..types import app_build_list_params, app_build_create_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -149,7 +149,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/app_builds/{id}", + path_template("/app_builds/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -267,7 +267,7 @@ def promote( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._post( - f"/app_builds/{id}/promote", + path_template("/app_builds/{id}/promote", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -395,7 +395,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/app_builds/{id}", + path_template("/app_builds/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -513,7 +513,7 @@ async def promote( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._post( - f"/app_builds/{id}/promote", + path_template("/app_builds/{id}/promote", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/apps.py b/src/whop_sdk/resources/apps.py index 46fd9b7..15b482d 100644 --- a/src/whop_sdk/resources/apps.py +++ b/src/whop_sdk/resources/apps.py @@ -9,7 +9,7 @@ from ..types import AppType, app_list_params, app_create_params, app_update_params from .._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -145,7 +145,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/apps/{id}", + path_template("/apps/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -226,7 +226,7 @@ def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._patch( - f"/apps/{id}", + path_template("/apps/{id}", id=id), body=maybe_transform( { "app_store_description": app_store_description, @@ -468,7 +468,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/apps/{id}", + path_template("/apps/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -549,7 +549,7 @@ async def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._patch( - f"/apps/{id}", + path_template("/apps/{id}", id=id), body=await async_maybe_transform( { "app_store_description": app_store_description, diff --git a/src/whop_sdk/resources/authorized_users.py b/src/whop_sdk/resources/authorized_users.py index 8ccdca5..0519e3e 100644 --- a/src/whop_sdk/resources/authorized_users.py +++ b/src/whop_sdk/resources/authorized_users.py @@ -9,7 +9,7 @@ from ..types import authorized_user_list_params, authorized_user_create_params, authorized_user_delete_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -139,7 +139,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/authorized_users/{id}", + path_template("/authorized_users/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -262,7 +262,7 @@ def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._delete( - f"/authorized_users/{id}", + path_template("/authorized_users/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -387,7 +387,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/authorized_users/{id}", + path_template("/authorized_users/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -510,7 +510,7 @@ async def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._delete( - f"/authorized_users/{id}", + path_template("/authorized_users/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, diff --git a/src/whop_sdk/resources/chat_channels.py b/src/whop_sdk/resources/chat_channels.py index 0ed7bd7..ef5da1a 100644 --- a/src/whop_sdk/resources/chat_channels.py +++ b/src/whop_sdk/resources/chat_channels.py @@ -8,7 +8,7 @@ from ..types import chat_channel_list_params, chat_channel_update_params from .._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -77,7 +77,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/chat_channels/{id}", + path_template("/chat_channels/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -135,7 +135,7 @@ def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._patch( - f"/chat_channels/{id}", + path_template("/chat_channels/{id}", id=id), body=maybe_transform( { "ban_media": ban_media, @@ -273,7 +273,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/chat_channels/{id}", + path_template("/chat_channels/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -331,7 +331,7 @@ async def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._patch( - f"/chat_channels/{id}", + path_template("/chat_channels/{id}", id=id), body=await async_maybe_transform( { "ban_media": ban_media, diff --git a/src/whop_sdk/resources/checkout_configurations.py b/src/whop_sdk/resources/checkout_configurations.py index 0160628..ca43a5f 100644 --- a/src/whop_sdk/resources/checkout_configurations.py +++ b/src/whop_sdk/resources/checkout_configurations.py @@ -10,7 +10,7 @@ from ..types import checkout_configuration_list_params, checkout_configuration_create_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import required_args, maybe_transform, async_maybe_transform +from .._utils import path_template, required_args, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -306,7 +306,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/checkout_configurations/{id}", + path_template("/checkout_configurations/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -672,7 +672,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/checkout_configurations/{id}", + path_template("/checkout_configurations/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/companies.py b/src/whop_sdk/resources/companies.py index 6d3755a..3850775 100644 --- a/src/whop_sdk/resources/companies.py +++ b/src/whop_sdk/resources/companies.py @@ -9,7 +9,7 @@ from ..types import company_list_params, company_create_params, company_update_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -152,7 +152,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/companies/{id}", + path_template("/companies/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -228,7 +228,7 @@ def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._patch( - f"/companies/{id}", + path_template("/companies/{id}", id=id), body=maybe_transform( { "affiliate_application_required": affiliate_application_required, @@ -456,7 +456,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/companies/{id}", + path_template("/companies/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -532,7 +532,7 @@ async def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._patch( - f"/companies/{id}", + path_template("/companies/{id}", id=id), body=await async_maybe_transform( { "affiliate_application_required": affiliate_application_required, diff --git a/src/whop_sdk/resources/company_token_transactions.py b/src/whop_sdk/resources/company_token_transactions.py index aa7bf6c..2b3cbdd 100644 --- a/src/whop_sdk/resources/company_token_transactions.py +++ b/src/whop_sdk/resources/company_token_transactions.py @@ -13,7 +13,7 @@ company_token_transaction_create_params, ) from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import required_args, maybe_transform, async_maybe_transform +from .._utils import path_template, required_args, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -281,7 +281,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/company_token_transactions/{id}", + path_template("/company_token_transactions/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -614,7 +614,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/company_token_transactions/{id}", + path_template("/company_token_transactions/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/course_chapters.py b/src/whop_sdk/resources/course_chapters.py index 9d8345b..41c7ea1 100644 --- a/src/whop_sdk/resources/course_chapters.py +++ b/src/whop_sdk/resources/course_chapters.py @@ -8,7 +8,7 @@ from ..types import course_chapter_list_params, course_chapter_create_params, course_chapter_update_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -124,7 +124,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/course_chapters/{id}", + path_template("/course_chapters/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -164,7 +164,7 @@ def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._patch( - f"/course_chapters/{id}", + path_template("/course_chapters/{id}", id=id), body=maybe_transform({"title": title}, course_chapter_update_params.CourseChapterUpdateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -265,7 +265,7 @@ def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._delete( - f"/course_chapters/{id}", + path_template("/course_chapters/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -371,7 +371,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/course_chapters/{id}", + path_template("/course_chapters/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -411,7 +411,7 @@ async def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._patch( - f"/course_chapters/{id}", + path_template("/course_chapters/{id}", id=id), body=await async_maybe_transform({"title": title}, course_chapter_update_params.CourseChapterUpdateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -512,7 +512,7 @@ async def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._delete( - f"/course_chapters/{id}", + path_template("/course_chapters/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/course_lesson_interactions.py b/src/whop_sdk/resources/course_lesson_interactions.py index 19d4943..0b19bce 100644 --- a/src/whop_sdk/resources/course_lesson_interactions.py +++ b/src/whop_sdk/resources/course_lesson_interactions.py @@ -8,7 +8,7 @@ from ..types import course_lesson_interaction_list_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform +from .._utils import path_template, maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -76,7 +76,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/course_lesson_interactions/{id}", + path_template("/course_lesson_interactions/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -212,7 +212,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/course_lesson_interactions/{id}", + path_template("/course_lesson_interactions/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/course_lessons.py b/src/whop_sdk/resources/course_lessons.py index ef47ad3..443134b 100644 --- a/src/whop_sdk/resources/course_lessons.py +++ b/src/whop_sdk/resources/course_lessons.py @@ -16,7 +16,7 @@ course_lesson_submit_assessment_params, ) from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -166,7 +166,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/course_lessons/{id}", + path_template("/course_lessons/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -254,7 +254,7 @@ def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._patch( - f"/course_lessons/{id}", + path_template("/course_lessons/{id}", id=id), body=maybe_transform( { "assessment_completion_requirement": assessment_completion_requirement, @@ -378,7 +378,7 @@ def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._delete( - f"/course_lessons/{id}", + path_template("/course_lessons/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -411,7 +411,7 @@ def mark_as_completed( if not lesson_id: raise ValueError(f"Expected a non-empty value for `lesson_id` but received {lesson_id!r}") return self._post( - f"/course_lessons/{lesson_id}/mark_as_completed", + path_template("/course_lessons/{lesson_id}/mark_as_completed", lesson_id=lesson_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -445,7 +445,7 @@ def start( if not lesson_id: raise ValueError(f"Expected a non-empty value for `lesson_id` but received {lesson_id!r}") return self._post( - f"/course_lessons/{lesson_id}/start", + path_template("/course_lessons/{lesson_id}/start", lesson_id=lesson_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -481,7 +481,7 @@ def submit_assessment( if not lesson_id: raise ValueError(f"Expected a non-empty value for `lesson_id` but received {lesson_id!r}") return self._post( - f"/course_lessons/{lesson_id}/submit_assessment", + path_template("/course_lessons/{lesson_id}/submit_assessment", lesson_id=lesson_id), body=maybe_transform( {"answers": answers}, course_lesson_submit_assessment_params.CourseLessonSubmitAssessmentParams ), @@ -618,7 +618,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/course_lessons/{id}", + path_template("/course_lessons/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -706,7 +706,7 @@ async def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._patch( - f"/course_lessons/{id}", + path_template("/course_lessons/{id}", id=id), body=await async_maybe_transform( { "assessment_completion_requirement": assessment_completion_requirement, @@ -830,7 +830,7 @@ async def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._delete( - f"/course_lessons/{id}", + path_template("/course_lessons/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -863,7 +863,7 @@ async def mark_as_completed( if not lesson_id: raise ValueError(f"Expected a non-empty value for `lesson_id` but received {lesson_id!r}") return await self._post( - f"/course_lessons/{lesson_id}/mark_as_completed", + path_template("/course_lessons/{lesson_id}/mark_as_completed", lesson_id=lesson_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -897,7 +897,7 @@ async def start( if not lesson_id: raise ValueError(f"Expected a non-empty value for `lesson_id` but received {lesson_id!r}") return await self._post( - f"/course_lessons/{lesson_id}/start", + path_template("/course_lessons/{lesson_id}/start", lesson_id=lesson_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -933,7 +933,7 @@ async def submit_assessment( if not lesson_id: raise ValueError(f"Expected a non-empty value for `lesson_id` but received {lesson_id!r}") return await self._post( - f"/course_lessons/{lesson_id}/submit_assessment", + path_template("/course_lessons/{lesson_id}/submit_assessment", lesson_id=lesson_id), body=await async_maybe_transform( {"answers": answers}, course_lesson_submit_assessment_params.CourseLessonSubmitAssessmentParams ), diff --git a/src/whop_sdk/resources/course_students.py b/src/whop_sdk/resources/course_students.py index 83c1656..a7c111a 100644 --- a/src/whop_sdk/resources/course_students.py +++ b/src/whop_sdk/resources/course_students.py @@ -8,7 +8,7 @@ from ..types import course_student_list_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform +from .._utils import path_template, maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -76,7 +76,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/course_students/{id}", + path_template("/course_students/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -204,7 +204,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/course_students/{id}", + path_template("/course_students/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/courses.py b/src/whop_sdk/resources/courses.py index a5c5b25..f8957ca 100644 --- a/src/whop_sdk/resources/courses.py +++ b/src/whop_sdk/resources/courses.py @@ -8,7 +8,7 @@ from ..types import Languages, CourseVisibilities, course_list_params, course_create_params, course_update_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -156,7 +156,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/courses/{id}", + path_template("/courses/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -229,7 +229,7 @@ def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._patch( - f"/courses/{id}", + path_template("/courses/{id}", id=id), body=maybe_transform( { "certificate_after_completion_enabled": certificate_after_completion_enabled, @@ -350,7 +350,7 @@ def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._delete( - f"/courses/{id}", + path_template("/courses/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -486,7 +486,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/courses/{id}", + path_template("/courses/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -559,7 +559,7 @@ async def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._patch( - f"/courses/{id}", + path_template("/courses/{id}", id=id), body=await async_maybe_transform( { "certificate_after_completion_enabled": certificate_after_completion_enabled, @@ -680,7 +680,7 @@ async def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._delete( - f"/courses/{id}", + path_template("/courses/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/dispute_alerts.py b/src/whop_sdk/resources/dispute_alerts.py index 03b47ef..7bfc7a6 100644 --- a/src/whop_sdk/resources/dispute_alerts.py +++ b/src/whop_sdk/resources/dispute_alerts.py @@ -9,7 +9,7 @@ from ..types import dispute_alert_list_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform +from .._utils import path_template, maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -82,7 +82,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/dispute_alerts/{id}", + path_template("/dispute_alerts/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -223,7 +223,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/dispute_alerts/{id}", + path_template("/dispute_alerts/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/disputes.py b/src/whop_sdk/resources/disputes.py index 0baa88d..81cfc21 100644 --- a/src/whop_sdk/resources/disputes.py +++ b/src/whop_sdk/resources/disputes.py @@ -9,7 +9,7 @@ from ..types import dispute_list_params, dispute_update_evidence_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -84,7 +84,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/disputes/{id}", + path_template("/disputes/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -211,7 +211,7 @@ def submit_evidence( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._post( - f"/disputes/{id}/submit_evidence", + path_template("/disputes/{id}/submit_evidence", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -300,7 +300,7 @@ def update_evidence( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._post( - f"/disputes/{id}/update_evidence", + path_template("/disputes/{id}/update_evidence", id=id), body=maybe_transform( { "access_activity_log": access_activity_log, @@ -384,7 +384,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/disputes/{id}", + path_template("/disputes/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -511,7 +511,7 @@ async def submit_evidence( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._post( - f"/disputes/{id}/submit_evidence", + path_template("/disputes/{id}/submit_evidence", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -600,7 +600,7 @@ async def update_evidence( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._post( - f"/disputes/{id}/update_evidence", + path_template("/disputes/{id}/update_evidence", id=id), body=await async_maybe_transform( { "access_activity_log": access_activity_log, diff --git a/src/whop_sdk/resources/dm_channels.py b/src/whop_sdk/resources/dm_channels.py index 7e51c55..1bae5de 100644 --- a/src/whop_sdk/resources/dm_channels.py +++ b/src/whop_sdk/resources/dm_channels.py @@ -8,7 +8,7 @@ from ..types import dm_channel_list_params, dm_channel_create_params, dm_channel_update_params from .._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -126,7 +126,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/dm_channels/{id}", + path_template("/dm_channels/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -168,7 +168,7 @@ def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._patch( - f"/dm_channels/{id}", + path_template("/dm_channels/{id}", id=id), body=maybe_transform({"custom_name": custom_name}, dm_channel_update_params.DmChannelUpdateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -273,7 +273,7 @@ def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._delete( - f"/dm_channels/{id}", + path_template("/dm_channels/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -381,7 +381,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/dm_channels/{id}", + path_template("/dm_channels/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -423,7 +423,7 @@ async def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._patch( - f"/dm_channels/{id}", + path_template("/dm_channels/{id}", id=id), body=await async_maybe_transform( {"custom_name": custom_name}, dm_channel_update_params.DmChannelUpdateParams ), @@ -530,7 +530,7 @@ async def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._delete( - f"/dm_channels/{id}", + path_template("/dm_channels/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/dm_members.py b/src/whop_sdk/resources/dm_members.py index f1a8ca1..be2de9b 100644 --- a/src/whop_sdk/resources/dm_members.py +++ b/src/whop_sdk/resources/dm_members.py @@ -14,7 +14,7 @@ dm_member_update_params, ) from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -134,7 +134,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/dm_members/{id}", + path_template("/dm_members/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -178,7 +178,7 @@ def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._patch( - f"/dm_members/{id}", + path_template("/dm_members/{id}", id=id), body=maybe_transform( { "notification_preference": notification_preference, @@ -288,7 +288,7 @@ def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._delete( - f"/dm_members/{id}", + path_template("/dm_members/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -396,7 +396,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/dm_members/{id}", + path_template("/dm_members/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -440,7 +440,7 @@ async def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._patch( - f"/dm_members/{id}", + path_template("/dm_members/{id}", id=id), body=await async_maybe_transform( { "notification_preference": notification_preference, @@ -550,7 +550,7 @@ async def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._delete( - f"/dm_members/{id}", + path_template("/dm_members/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/entries.py b/src/whop_sdk/resources/entries.py index 41d5d23..6847354 100644 --- a/src/whop_sdk/resources/entries.py +++ b/src/whop_sdk/resources/entries.py @@ -10,7 +10,7 @@ from ..types import entry_list_params from .._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from .._utils import maybe_transform +from .._utils import path_template, maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -81,7 +81,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/entries/{id}", + path_template("/entries/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -212,7 +212,7 @@ def approve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._post( - f"/entries/{id}/approve", + path_template("/entries/{id}/approve", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -252,7 +252,7 @@ def deny( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._post( - f"/entries/{id}/deny", + path_template("/entries/{id}/deny", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -311,7 +311,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/entries/{id}", + path_template("/entries/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -442,7 +442,7 @@ async def approve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._post( - f"/entries/{id}/approve", + path_template("/entries/{id}/approve", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -482,7 +482,7 @@ async def deny( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._post( - f"/entries/{id}/deny", + path_template("/entries/{id}/deny", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/experiences.py b/src/whop_sdk/resources/experiences.py index 50542d1..b8444bd 100644 --- a/src/whop_sdk/resources/experiences.py +++ b/src/whop_sdk/resources/experiences.py @@ -17,7 +17,7 @@ experience_duplicate_params, ) from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -142,7 +142,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/experiences/{id}", + path_template("/experiences/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -195,7 +195,7 @@ def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._patch( - f"/experiences/{id}", + path_template("/experiences/{id}", id=id), body=maybe_transform( { "access_level": access_level, @@ -317,7 +317,7 @@ def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._delete( - f"/experiences/{id}", + path_template("/experiences/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -358,7 +358,7 @@ def attach( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._post( - f"/experiences/{id}/attach", + path_template("/experiences/{id}/attach", id=id), body=maybe_transform({"product_id": product_id}, experience_attach_params.ExperienceAttachParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -400,7 +400,7 @@ def detach( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._post( - f"/experiences/{id}/detach", + path_template("/experiences/{id}/detach", id=id), body=maybe_transform({"product_id": product_id}, experience_detach_params.ExperienceDetachParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -448,7 +448,7 @@ def duplicate( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._post( - f"/experiences/{id}/duplicate", + path_template("/experiences/{id}/duplicate", id=id), body=maybe_transform({"name": name}, experience_duplicate_params.ExperienceDuplicateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -564,7 +564,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/experiences/{id}", + path_template("/experiences/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -617,7 +617,7 @@ async def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._patch( - f"/experiences/{id}", + path_template("/experiences/{id}", id=id), body=await async_maybe_transform( { "access_level": access_level, @@ -739,7 +739,7 @@ async def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._delete( - f"/experiences/{id}", + path_template("/experiences/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -780,7 +780,7 @@ async def attach( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._post( - f"/experiences/{id}/attach", + path_template("/experiences/{id}/attach", id=id), body=await async_maybe_transform( {"product_id": product_id}, experience_attach_params.ExperienceAttachParams ), @@ -824,7 +824,7 @@ async def detach( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._post( - f"/experiences/{id}/detach", + path_template("/experiences/{id}/detach", id=id), body=await async_maybe_transform( {"product_id": product_id}, experience_detach_params.ExperienceDetachParams ), @@ -874,7 +874,7 @@ async def duplicate( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._post( - f"/experiences/{id}/duplicate", + path_template("/experiences/{id}/duplicate", id=id), body=await async_maybe_transform({"name": name}, experience_duplicate_params.ExperienceDuplicateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout diff --git a/src/whop_sdk/resources/fee_markups.py b/src/whop_sdk/resources/fee_markups.py index 9944dd2..63eb13e 100644 --- a/src/whop_sdk/resources/fee_markups.py +++ b/src/whop_sdk/resources/fee_markups.py @@ -8,7 +8,7 @@ from ..types import FeeMarkupType, fee_markup_list_params, fee_markup_create_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -210,7 +210,7 @@ def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._delete( - f"/fee_markups/{id}", + path_template("/fee_markups/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -401,7 +401,7 @@ async def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._delete( - f"/fee_markups/{id}", + path_template("/fee_markups/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/files.py b/src/whop_sdk/resources/files.py index 5729ec7..5e1ad1b 100644 --- a/src/whop_sdk/resources/files.py +++ b/src/whop_sdk/resources/files.py @@ -6,7 +6,7 @@ from ..types import file_create_params from .._types import Body, Query, Headers, NotGiven, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -104,7 +104,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/files/{id}", + path_template("/files/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -194,7 +194,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/files/{id}", + path_template("/files/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/forum_posts.py b/src/whop_sdk/resources/forum_posts.py index 0acb986..eacff2d 100644 --- a/src/whop_sdk/resources/forum_posts.py +++ b/src/whop_sdk/resources/forum_posts.py @@ -13,7 +13,7 @@ forum_post_update_params, ) from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -181,7 +181,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/forum_posts/{id}", + path_template("/forum_posts/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -234,7 +234,7 @@ def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._patch( - f"/forum_posts/{id}", + path_template("/forum_posts/{id}", id=id), body=maybe_transform( { "attachments": attachments, @@ -475,7 +475,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/forum_posts/{id}", + path_template("/forum_posts/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -528,7 +528,7 @@ async def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._patch( - f"/forum_posts/{id}", + path_template("/forum_posts/{id}", id=id), body=await async_maybe_transform( { "attachments": attachments, diff --git a/src/whop_sdk/resources/forums.py b/src/whop_sdk/resources/forums.py index 3159079..15e0432 100644 --- a/src/whop_sdk/resources/forums.py +++ b/src/whop_sdk/resources/forums.py @@ -8,7 +8,7 @@ from ..types import forum_list_params, forum_update_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -78,7 +78,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/forums/{id}", + path_template("/forums/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -125,7 +125,7 @@ def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._patch( - f"/forums/{id}", + path_template("/forums/{id}", id=id), body=maybe_transform( { "email_notification_preference": email_notification_preference, @@ -260,7 +260,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/forums/{id}", + path_template("/forums/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -307,7 +307,7 @@ async def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._patch( - f"/forums/{id}", + path_template("/forums/{id}", id=id), body=await async_maybe_transform( { "email_notification_preference": email_notification_preference, diff --git a/src/whop_sdk/resources/invoices.py b/src/whop_sdk/resources/invoices.py index aec677f..9043ccb 100644 --- a/src/whop_sdk/resources/invoices.py +++ b/src/whop_sdk/resources/invoices.py @@ -10,7 +10,7 @@ from ..types import invoice_list_params, invoice_create_params from .._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from .._utils import required_args, maybe_transform, async_maybe_transform +from .._utils import path_template, required_args, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -436,7 +436,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/invoices/{id}", + path_template("/invoices/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -569,7 +569,7 @@ def void( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._post( - f"/invoices/{id}/void", + path_template("/invoices/{id}/void", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -982,7 +982,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/invoices/{id}", + path_template("/invoices/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1115,7 +1115,7 @@ async def void( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._post( - f"/invoices/{id}/void", + path_template("/invoices/{id}/void", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/leads.py b/src/whop_sdk/resources/leads.py index df6f992..d4ad590 100644 --- a/src/whop_sdk/resources/leads.py +++ b/src/whop_sdk/resources/leads.py @@ -9,7 +9,7 @@ from ..types import lead_list_params, lead_create_params, lead_update_params from .._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -146,7 +146,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/leads/{id}", + path_template("/leads/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -193,7 +193,7 @@ def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._patch( - f"/leads/{id}", + path_template("/leads/{id}", id=id), body=maybe_transform( { "metadata": metadata, @@ -407,7 +407,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/leads/{id}", + path_template("/leads/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -454,7 +454,7 @@ async def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._patch( - f"/leads/{id}", + path_template("/leads/{id}", id=id), body=await async_maybe_transform( { "metadata": metadata, diff --git a/src/whop_sdk/resources/ledger_accounts.py b/src/whop_sdk/resources/ledger_accounts.py index d213b5c..778e702 100644 --- a/src/whop_sdk/resources/ledger_accounts.py +++ b/src/whop_sdk/resources/ledger_accounts.py @@ -5,6 +5,7 @@ import httpx from .._types import Body, Query, Headers, NotGiven, not_given +from .._utils import path_template from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -70,7 +71,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/ledger_accounts/{id}", + path_template("/ledger_accounts/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -129,7 +130,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/ledger_accounts/{id}", + path_template("/ledger_accounts/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/members.py b/src/whop_sdk/resources/members.py index 811f248..5fa0c04 100644 --- a/src/whop_sdk/resources/members.py +++ b/src/whop_sdk/resources/members.py @@ -10,7 +10,7 @@ from ..types import member_list_params from .._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from .._utils import maybe_transform +from .._utils import path_template, maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -83,7 +83,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/members/{id}", + path_template("/members/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -259,7 +259,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/members/{id}", + path_template("/members/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/memberships.py b/src/whop_sdk/resources/memberships.py index 22af0af..4045d08 100644 --- a/src/whop_sdk/resources/memberships.py +++ b/src/whop_sdk/resources/memberships.py @@ -15,7 +15,7 @@ membership_update_params, ) from .._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -86,7 +86,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/memberships/{id}", + path_template("/memberships/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -129,7 +129,7 @@ def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._patch( - f"/memberships/{id}", + path_template("/memberships/{id}", id=id), body=maybe_transform({"metadata": metadata}, membership_update_params.MembershipUpdateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -244,6 +244,51 @@ def list( model=MembershipListResponse, ) + def add_free_days( + self, + id: str, + *, + free_days: int, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> Membership: + """ + Add free days to extend a membership's current billing period, expiration date, + or Stripe trial. + + Required permissions: + + - `member:manage` + - `member:email:read` + - `member:basic:read` + + Args: + free_days: The number of free days to add (1-1095). Extends the billing period, expiration + date, or Stripe trial depending on plan type. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not id: + raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") + return self._post( + path_template("/memberships/{id}/add_free_days", id=id), + body=maybe_transform({"free_days": free_days}, membership_add_free_days_params.MembershipAddFreeDaysParams), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=Membership, + ) + def cancel( self, id: str, @@ -280,7 +325,7 @@ def cancel( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._post( - f"/memberships/{id}/cancel", + path_template("/memberships/{id}/cancel", id=id), body=maybe_transform( {"cancellation_mode": cancellation_mode}, membership_cancel_params.MembershipCancelParams ), @@ -328,7 +373,7 @@ def pause( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._post( - f"/memberships/{id}/pause", + path_template("/memberships/{id}/pause", id=id), body=maybe_transform({"void_payments": void_payments}, membership_pause_params.MembershipPauseParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -370,7 +415,7 @@ def resume( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._post( - f"/memberships/{id}/resume", + path_template("/memberships/{id}/resume", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -410,7 +455,7 @@ def uncancel( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._post( - f"/memberships/{id}/uncancel", + path_template("/memberships/{id}/uncancel", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -469,7 +514,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/memberships/{id}", + path_template("/memberships/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -512,7 +557,7 @@ async def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._patch( - f"/memberships/{id}", + path_template("/memberships/{id}", id=id), body=await async_maybe_transform({"metadata": metadata}, membership_update_params.MembershipUpdateParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -627,6 +672,53 @@ def list( model=MembershipListResponse, ) + async def add_free_days( + self, + id: str, + *, + free_days: int, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> Membership: + """ + Add free days to extend a membership's current billing period, expiration date, + or Stripe trial. + + Required permissions: + + - `member:manage` + - `member:email:read` + - `member:basic:read` + + Args: + free_days: The number of free days to add (1-1095). Extends the billing period, expiration + date, or Stripe trial depending on plan type. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not id: + raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") + return await self._post( + path_template("/memberships/{id}/add_free_days", id=id), + body=await async_maybe_transform( + {"free_days": free_days}, membership_add_free_days_params.MembershipAddFreeDaysParams + ), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=Membership, + ) + async def cancel( self, id: str, @@ -663,7 +755,7 @@ async def cancel( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._post( - f"/memberships/{id}/cancel", + path_template("/memberships/{id}/cancel", id=id), body=await async_maybe_transform( {"cancellation_mode": cancellation_mode}, membership_cancel_params.MembershipCancelParams ), @@ -711,7 +803,7 @@ async def pause( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._post( - f"/memberships/{id}/pause", + path_template("/memberships/{id}/pause", id=id), body=await async_maybe_transform( {"void_payments": void_payments}, membership_pause_params.MembershipPauseParams ), @@ -755,7 +847,7 @@ async def resume( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._post( - f"/memberships/{id}/resume", + path_template("/memberships/{id}/resume", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -795,7 +887,7 @@ async def uncancel( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._post( - f"/memberships/{id}/uncancel", + path_template("/memberships/{id}/uncancel", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/messages.py b/src/whop_sdk/resources/messages.py index 7331602..51e664a 100644 --- a/src/whop_sdk/resources/messages.py +++ b/src/whop_sdk/resources/messages.py @@ -8,7 +8,7 @@ from ..types import message_list_params, message_create_params, message_update_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -145,7 +145,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/messages/{id}", + path_template("/messages/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -190,7 +190,7 @@ def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._patch( - f"/messages/{id}", + path_template("/messages/{id}", id=id), body=maybe_transform( { "attachments": attachments, @@ -304,7 +304,7 @@ def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._delete( - f"/messages/{id}", + path_template("/messages/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -430,7 +430,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/messages/{id}", + path_template("/messages/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -475,7 +475,7 @@ async def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._patch( - f"/messages/{id}", + path_template("/messages/{id}", id=id), body=await async_maybe_transform( { "attachments": attachments, @@ -589,7 +589,7 @@ async def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._delete( - f"/messages/{id}", + path_template("/messages/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/payment_methods.py b/src/whop_sdk/resources/payment_methods.py index 9e99365..6c75945 100644 --- a/src/whop_sdk/resources/payment_methods.py +++ b/src/whop_sdk/resources/payment_methods.py @@ -9,7 +9,7 @@ from ..types import payment_method_list_params, payment_method_retrieve_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -87,7 +87,7 @@ def retrieve( return cast( PaymentMethodRetrieveResponse, self._get( - f"/payment_methods/{id}", + path_template("/payment_methods/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -253,7 +253,7 @@ async def retrieve( return cast( PaymentMethodRetrieveResponse, await self._get( - f"/payment_methods/{id}", + path_template("/payment_methods/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, diff --git a/src/whop_sdk/resources/payments.py b/src/whop_sdk/resources/payments.py index d36041d..260f6e3 100644 --- a/src/whop_sdk/resources/payments.py +++ b/src/whop_sdk/resources/payments.py @@ -10,7 +10,7 @@ from ..types import payment_list_params, payment_create_params, payment_refund_params, payment_list_fees_params from .._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from .._utils import required_args, maybe_transform, async_maybe_transform +from .._utils import path_template, required_args, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -250,7 +250,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/payments/{id}", + path_template("/payments/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -420,7 +420,7 @@ def list_fees( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get_api_list( - f"/payments/{id}/fees", + path_template("/payments/{id}/fees", id=id), page=SyncCursorPage[PaymentListFeesResponse], options=make_request_options( extra_headers=extra_headers, @@ -484,7 +484,7 @@ def refund( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._post( - f"/payments/{id}/refund", + path_template("/payments/{id}/refund", id=id), body=maybe_transform({"partial_amount": partial_amount}, payment_refund_params.PaymentRefundParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -532,7 +532,7 @@ def retry( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._post( - f"/payments/{id}/retry", + path_template("/payments/{id}/retry", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -579,7 +579,7 @@ def void( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._post( - f"/payments/{id}/void", + path_template("/payments/{id}/void", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -804,7 +804,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/payments/{id}", + path_template("/payments/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -974,7 +974,7 @@ def list_fees( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get_api_list( - f"/payments/{id}/fees", + path_template("/payments/{id}/fees", id=id), page=AsyncCursorPage[PaymentListFeesResponse], options=make_request_options( extra_headers=extra_headers, @@ -1038,7 +1038,7 @@ async def refund( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._post( - f"/payments/{id}/refund", + path_template("/payments/{id}/refund", id=id), body=await async_maybe_transform( {"partial_amount": partial_amount}, payment_refund_params.PaymentRefundParams ), @@ -1088,7 +1088,7 @@ async def retry( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._post( - f"/payments/{id}/retry", + path_template("/payments/{id}/retry", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1135,7 +1135,7 @@ async def void( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._post( - f"/payments/{id}/void", + path_template("/payments/{id}/void", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/payout_accounts.py b/src/whop_sdk/resources/payout_accounts.py index c59b88b..a6d57c3 100644 --- a/src/whop_sdk/resources/payout_accounts.py +++ b/src/whop_sdk/resources/payout_accounts.py @@ -5,6 +5,7 @@ import httpx from .._types import Body, Query, Headers, NotGiven, not_given +from .._utils import path_template from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -71,7 +72,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/payout_accounts/{id}", + path_template("/payout_accounts/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -131,7 +132,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/payout_accounts/{id}", + path_template("/payout_accounts/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/payout_methods.py b/src/whop_sdk/resources/payout_methods.py index 0333f57..c9fce4a 100644 --- a/src/whop_sdk/resources/payout_methods.py +++ b/src/whop_sdk/resources/payout_methods.py @@ -8,7 +8,7 @@ from ..types import payout_method_list_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform +from .._utils import path_template, maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -75,7 +75,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/payout_methods/{id}", + path_template("/payout_methods/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -197,7 +197,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/payout_methods/{id}", + path_template("/payout_methods/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/plans.py b/src/whop_sdk/resources/plans.py index 413c3f8..542bf59 100644 --- a/src/whop_sdk/resources/plans.py +++ b/src/whop_sdk/resources/plans.py @@ -10,7 +10,7 @@ from ..types import plan_list_params, plan_create_params, plan_update_params from .._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -225,7 +225,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/plans/{id}", + path_template("/plans/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -334,7 +334,7 @@ def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._patch( - f"/plans/{id}", + path_template("/plans/{id}", id=id), body=maybe_transform( { "billing_period": billing_period, @@ -495,7 +495,7 @@ def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._delete( - f"/plans/{id}", + path_template("/plans/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -693,7 +693,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/plans/{id}", + path_template("/plans/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -802,7 +802,7 @@ async def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._patch( - f"/plans/{id}", + path_template("/plans/{id}", id=id), body=await async_maybe_transform( { "billing_period": billing_period, @@ -963,7 +963,7 @@ async def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._delete( - f"/plans/{id}", + path_template("/plans/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/products.py b/src/whop_sdk/resources/products.py index 6909de0..0eac47e 100644 --- a/src/whop_sdk/resources/products.py +++ b/src/whop_sdk/resources/products.py @@ -10,7 +10,7 @@ from ..types import product_list_params, product_create_params, product_update_params from .._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -208,7 +208,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/products/{id}", + path_template("/products/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -306,7 +306,7 @@ def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._patch( - f"/products/{id}", + path_template("/products/{id}", id=id), body=maybe_transform( { "collect_shipping_address": collect_shipping_address, @@ -454,7 +454,7 @@ def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._delete( - f"/products/{id}", + path_template("/products/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -636,7 +636,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/products/{id}", + path_template("/products/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -734,7 +734,7 @@ async def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._patch( - f"/products/{id}", + path_template("/products/{id}", id=id), body=await async_maybe_transform( { "collect_shipping_address": collect_shipping_address, @@ -882,7 +882,7 @@ async def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._delete( - f"/products/{id}", + path_template("/products/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/promo_codes.py b/src/whop_sdk/resources/promo_codes.py index 4d8deb2..7d89304 100644 --- a/src/whop_sdk/resources/promo_codes.py +++ b/src/whop_sdk/resources/promo_codes.py @@ -9,7 +9,7 @@ from ..types import PromoCodeStatus, promo_code_list_params, promo_code_create_params from .._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -193,7 +193,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/promo_codes/{id}", + path_template("/promo_codes/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -316,7 +316,7 @@ def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._delete( - f"/promo_codes/{id}", + path_template("/promo_codes/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -487,7 +487,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/promo_codes/{id}", + path_template("/promo_codes/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -610,7 +610,7 @@ async def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._delete( - f"/promo_codes/{id}", + path_template("/promo_codes/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/reactions.py b/src/whop_sdk/resources/reactions.py index 4688254..243ceaf 100644 --- a/src/whop_sdk/resources/reactions.py +++ b/src/whop_sdk/resources/reactions.py @@ -8,7 +8,7 @@ from ..types import reaction_list_params, reaction_create_params, reaction_delete_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -131,7 +131,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/reactions/{id}", + path_template("/reactions/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -239,7 +239,7 @@ def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._delete( - f"/reactions/{id}", + path_template("/reactions/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -356,7 +356,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/reactions/{id}", + path_template("/reactions/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -464,7 +464,7 @@ async def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._delete( - f"/reactions/{id}", + path_template("/reactions/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, diff --git a/src/whop_sdk/resources/refunds.py b/src/whop_sdk/resources/refunds.py index ff24a70..d845816 100644 --- a/src/whop_sdk/resources/refunds.py +++ b/src/whop_sdk/resources/refunds.py @@ -9,7 +9,7 @@ from ..types import refund_list_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform +from .._utils import path_template, maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -80,7 +80,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/refunds/{id}", + path_template("/refunds/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -225,7 +225,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/refunds/{id}", + path_template("/refunds/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/resolution_center_cases.py b/src/whop_sdk/resources/resolution_center_cases.py index 3563f15..90eb6a4 100644 --- a/src/whop_sdk/resources/resolution_center_cases.py +++ b/src/whop_sdk/resources/resolution_center_cases.py @@ -9,7 +9,7 @@ from ..types import resolution_center_case_list_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform +from .._utils import path_template, maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -80,7 +80,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/resolution_center_cases/{id}", + path_template("/resolution_center_cases/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -220,7 +220,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/resolution_center_cases/{id}", + path_template("/resolution_center_cases/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/reviews.py b/src/whop_sdk/resources/reviews.py index 3ce2c4d..0ac1ea3 100644 --- a/src/whop_sdk/resources/reviews.py +++ b/src/whop_sdk/resources/reviews.py @@ -9,7 +9,7 @@ from ..types import review_list_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform +from .._utils import path_template, maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -72,7 +72,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/reviews/{id}", + path_template("/reviews/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -202,7 +202,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/reviews/{id}", + path_template("/reviews/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/setup_intents.py b/src/whop_sdk/resources/setup_intents.py index e85baf4..4c3b154 100644 --- a/src/whop_sdk/resources/setup_intents.py +++ b/src/whop_sdk/resources/setup_intents.py @@ -9,7 +9,7 @@ from ..types import setup_intent_list_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform +from .._utils import path_template, maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -79,7 +79,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/setup_intents/{id}", + path_template("/setup_intents/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -218,7 +218,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/setup_intents/{id}", + path_template("/setup_intents/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/shipments.py b/src/whop_sdk/resources/shipments.py index 1b46c63..5a4eda5 100644 --- a/src/whop_sdk/resources/shipments.py +++ b/src/whop_sdk/resources/shipments.py @@ -8,7 +8,7 @@ from ..types import shipment_list_params, shipment_create_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -131,7 +131,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/shipments/{id}", + path_template("/shipments/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -318,7 +318,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/shipments/{id}", + path_template("/shipments/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/support_channels.py b/src/whop_sdk/resources/support_channels.py index 7b5146a..7d919e4 100644 --- a/src/whop_sdk/resources/support_channels.py +++ b/src/whop_sdk/resources/support_channels.py @@ -9,7 +9,7 @@ from ..types import support_channel_list_params, support_channel_create_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -131,7 +131,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/support_channels/{id}", + path_template("/support_channels/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -320,7 +320,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/support_channels/{id}", + path_template("/support_channels/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/transfers.py b/src/whop_sdk/resources/transfers.py index 6252141..7ff65c6 100644 --- a/src/whop_sdk/resources/transfers.py +++ b/src/whop_sdk/resources/transfers.py @@ -10,7 +10,7 @@ from ..types import transfer_list_params, transfer_create_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -152,7 +152,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/transfers/{id}", + path_template("/transfers/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -369,7 +369,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/transfers/{id}", + path_template("/transfers/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/users.py b/src/whop_sdk/resources/users.py index 7091072..6414c8e 100644 --- a/src/whop_sdk/resources/users.py +++ b/src/whop_sdk/resources/users.py @@ -8,7 +8,7 @@ from ..types import user_list_params, user_update_profile_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -72,7 +72,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/users/{id}", + path_template("/users/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -169,7 +169,7 @@ def check_access( if not resource_id: raise ValueError(f"Expected a non-empty value for `resource_id` but received {resource_id!r}") return self._get( - f"/users/{id}/access/{resource_id}", + path_template("/users/{id}/access/{resource_id}", id=id, resource_id=resource_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -279,7 +279,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/users/{id}", + path_template("/users/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -376,7 +376,7 @@ async def check_access( if not resource_id: raise ValueError(f"Expected a non-empty value for `resource_id` but received {resource_id!r}") return await self._get( - f"/users/{id}/access/{resource_id}", + path_template("/users/{id}/access/{resource_id}", id=id, resource_id=resource_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/verifications.py b/src/whop_sdk/resources/verifications.py index 54364d2..9ee917e 100644 --- a/src/whop_sdk/resources/verifications.py +++ b/src/whop_sdk/resources/verifications.py @@ -8,7 +8,7 @@ from ..types import verification_list_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform +from .._utils import path_template, maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -75,7 +75,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/verifications/{id}", + path_template("/verifications/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -197,7 +197,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/verifications/{id}", + path_template("/verifications/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/webhooks.py b/src/whop_sdk/resources/webhooks.py index 340e6a6..3004144 100644 --- a/src/whop_sdk/resources/webhooks.py +++ b/src/whop_sdk/resources/webhooks.py @@ -9,7 +9,7 @@ from ..types import APIVersion, webhook_list_params, webhook_create_params, webhook_update_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._models import construct_type from .._resource import SyncAPIResource, AsyncAPIResource @@ -148,7 +148,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/webhooks/{id}", + path_template("/webhooks/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -200,7 +200,7 @@ def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._patch( - f"/webhooks/{id}", + path_template("/webhooks/{id}", id=id), body=maybe_transform( { "api_version": api_version, @@ -311,7 +311,7 @@ def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._delete( - f"/webhooks/{id}", + path_template("/webhooks/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -460,7 +460,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/webhooks/{id}", + path_template("/webhooks/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -512,7 +512,7 @@ async def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._patch( - f"/webhooks/{id}", + path_template("/webhooks/{id}", id=id), body=await async_maybe_transform( { "api_version": api_version, @@ -623,7 +623,7 @@ async def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._delete( - f"/webhooks/{id}", + path_template("/webhooks/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/whop_sdk/resources/withdrawals.py b/src/whop_sdk/resources/withdrawals.py index 51b7425..5d76900 100644 --- a/src/whop_sdk/resources/withdrawals.py +++ b/src/whop_sdk/resources/withdrawals.py @@ -9,7 +9,7 @@ from ..types import withdrawal_list_params, withdrawal_create_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform, async_maybe_transform +from .._utils import path_template, maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -144,7 +144,7 @@ def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - f"/withdrawals/{id}", + path_template("/withdrawals/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -344,7 +344,7 @@ async def retrieve( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - f"/withdrawals/{id}", + path_template("/withdrawals/{id}", id=id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/tests/test_utils/test_path.py b/tests/test_utils/test_path.py new file mode 100644 index 0000000..bb4a49a --- /dev/null +++ b/tests/test_utils/test_path.py @@ -0,0 +1,89 @@ +from __future__ import annotations + +from typing import Any + +import pytest + +from whop_sdk._utils._path import path_template + + +@pytest.mark.parametrize( + "template, kwargs, expected", + [ + ("/v1/{id}", dict(id="abc"), "/v1/abc"), + ("/v1/{a}/{b}", dict(a="x", b="y"), "/v1/x/y"), + ("/v1/{a}{b}/path/{c}?val={d}#{e}", dict(a="x", b="y", c="z", d="u", e="v"), "/v1/xy/path/z?val=u#v"), + ("/{w}/{w}", dict(w="echo"), "/echo/echo"), + ("/v1/static", {}, "/v1/static"), + ("", {}, ""), + ("/v1/?q={n}&count=10", dict(n=42), "/v1/?q=42&count=10"), + ("/v1/{v}", dict(v=None), "/v1/null"), + ("/v1/{v}", dict(v=True), "/v1/true"), + ("/v1/{v}", dict(v=False), "/v1/false"), + ("/v1/{v}", dict(v=".hidden"), "/v1/.hidden"), # dot prefix ok + ("/v1/{v}", dict(v="file.txt"), "/v1/file.txt"), # dot in middle ok + ("/v1/{v}", dict(v="..."), "/v1/..."), # triple dot ok + ("/v1/{a}{b}", dict(a=".", b="txt"), "/v1/.txt"), # dot var combining with adjacent to be ok + ("/items?q={v}#{f}", dict(v=".", f=".."), "/items?q=.#.."), # dots in query/fragment are fine + ( + "/v1/{a}?query={b}", + dict(a="../../other/endpoint", b="a&bad=true"), + "/v1/..%2F..%2Fother%2Fendpoint?query=a%26bad%3Dtrue", + ), + ("/v1/{val}", dict(val="a/b/c"), "/v1/a%2Fb%2Fc"), + ("/v1/{val}", dict(val="a/b/c?query=value"), "/v1/a%2Fb%2Fc%3Fquery=value"), + ("/v1/{val}", dict(val="a/b/c?query=value&bad=true"), "/v1/a%2Fb%2Fc%3Fquery=value&bad=true"), + ("/v1/{val}", dict(val="%20"), "/v1/%2520"), # escapes escape sequences in input + # Query: slash and ? are safe, # is not + ("/items?q={v}", dict(v="a/b"), "/items?q=a/b"), + ("/items?q={v}", dict(v="a?b"), "/items?q=a?b"), + ("/items?q={v}", dict(v="a#b"), "/items?q=a%23b"), + ("/items?q={v}", dict(v="a b"), "/items?q=a%20b"), + # Fragment: slash and ? are safe + ("/docs#{v}", dict(v="a/b"), "/docs#a/b"), + ("/docs#{v}", dict(v="a?b"), "/docs#a?b"), + # Path: slash, ? and # are all encoded + ("/v1/{v}", dict(v="a/b"), "/v1/a%2Fb"), + ("/v1/{v}", dict(v="a?b"), "/v1/a%3Fb"), + ("/v1/{v}", dict(v="a#b"), "/v1/a%23b"), + # same var encoded differently by component + ( + "/v1/{v}?q={v}#{v}", + dict(v="a/b?c#d"), + "/v1/a%2Fb%3Fc%23d?q=a/b?c%23d#a/b?c%23d", + ), + ("/v1/{val}", dict(val="x?admin=true"), "/v1/x%3Fadmin=true"), # query injection + ("/v1/{val}", dict(val="x#admin"), "/v1/x%23admin"), # fragment injection + ], +) +def test_interpolation(template: str, kwargs: dict[str, Any], expected: str) -> None: + assert path_template(template, **kwargs) == expected + + +def test_missing_kwarg_raises_key_error() -> None: + with pytest.raises(KeyError, match="org_id"): + path_template("/v1/{org_id}") + + +@pytest.mark.parametrize( + "template, kwargs", + [ + ("{a}/path", dict(a=".")), + ("{a}/path", dict(a="..")), + ("/v1/{a}", dict(a=".")), + ("/v1/{a}", dict(a="..")), + ("/v1/{a}/path", dict(a=".")), + ("/v1/{a}/path", dict(a="..")), + ("/v1/{a}{b}", dict(a=".", b=".")), # adjacent vars → ".." + ("/v1/{a}.", dict(a=".")), # var + static → ".." + ("/v1/{a}{b}", dict(a="", b=".")), # empty + dot → "." + ("/v1/%2e/{x}", dict(x="ok")), # encoded dot in static text + ("/v1/%2e./{x}", dict(x="ok")), # mixed encoded ".." in static + ("/v1/.%2E/{x}", dict(x="ok")), # mixed encoded ".." in static + ("/v1/{v}?q=1", dict(v="..")), + ("/v1/{v}#frag", dict(v="..")), + ], +) +def test_dot_segment_rejected(template: str, kwargs: dict[str, Any]) -> None: + with pytest.raises(ValueError, match="dot-segment"): + path_template(template, **kwargs) From a391cfca3a11e21d4ac80518369b44f8f6f9ee2f Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 20 Mar 2026 15:13:37 +0000 Subject: [PATCH 3/4] feat(api): api update --- .stats.yml | 4 ++-- src/whop_sdk/types/company_list_response.py | 3 +++ src/whop_sdk/types/shared/company.py | 3 +++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 95e665f..0a792eb 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 191 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-e3735d7700813328ddb9c3da0127c03351e1e2102d6197b3a22f7a0627209488.yml -openapi_spec_hash: 6bd34ccbef8a342ba0f04737113b3529 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-e11bef0288245dae9a5f8118e178318824c2a2ba33fd9f7e49d2dee0c5c66b6b.yml +openapi_spec_hash: 780de21830cb6079c38c8a1e8e836b14 config_hash: 1a836d20bb988f001cc66d1526f71306 diff --git a/src/whop_sdk/types/company_list_response.py b/src/whop_sdk/types/company_list_response.py index 197728d..52d0916 100644 --- a/src/whop_sdk/types/company_list_response.py +++ b/src/whop_sdk/types/company_list_response.py @@ -84,6 +84,9 @@ class CompanyListResponse(BaseModel): behalf of this company. """ + target_audience: Optional[str] = None + """The target audience for the company. Null if not set.""" + title: str """The display name of the company shown to customers.""" diff --git a/src/whop_sdk/types/shared/company.py b/src/whop_sdk/types/shared/company.py index 3a7b1c8..5155b67 100644 --- a/src/whop_sdk/types/shared/company.py +++ b/src/whop_sdk/types/shared/company.py @@ -129,6 +129,9 @@ class Company(BaseModel): company. """ + target_audience: Optional[str] = None + """The target audience for the company. Null if not set.""" + title: str """The display name of the company shown to customers.""" From 87dfc43ac3aa45ae24b7bdb97927dc40a4020d77 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 20 Mar 2026 15:14:08 +0000 Subject: [PATCH 4/4] release: 0.1.0 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 14 ++++++++++++++ pyproject.toml | 2 +- src/whop_sdk/_version.py | 2 +- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 9682ed8..3d2ac0b 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.0.35" + ".": "0.1.0" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c02743..10b66b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## 0.1.0 (2026-03-20) + +Full Changelog: [v0.0.35...v0.1.0](https://github.com/whopio/whopsdk-python/compare/v0.0.35...v0.1.0) + +### Features + +* **api:** api update ([a391cfc](https://github.com/whopio/whopsdk-python/commit/a391cfca3a11e21d4ac80518369b44f8f6f9ee2f)) +* **api:** api update ([021294e](https://github.com/whopio/whopsdk-python/commit/021294ecc577e24f56839d852bc978b839feb7fe)) + + +### Bug Fixes + +* sanitize endpoint path params ([ca495f7](https://github.com/whopio/whopsdk-python/commit/ca495f7081478f0056efbad9c75eea30af62f9fe)) + ## 0.0.35 (2026-03-18) Full Changelog: [v0.0.34...v0.0.35](https://github.com/whopio/whopsdk-python/compare/v0.0.34...v0.0.35) diff --git a/pyproject.toml b/pyproject.toml index 062c3d4..7774c89 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "whop-sdk" -version = "0.0.35" +version = "0.1.0" description = "The official Python library for the Whop API" dynamic = ["readme"] license = "Apache-2.0" diff --git a/src/whop_sdk/_version.py b/src/whop_sdk/_version.py index 057036e..162053b 100644 --- a/src/whop_sdk/_version.py +++ b/src/whop_sdk/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "whop_sdk" -__version__ = "0.0.35" # x-release-please-version +__version__ = "0.1.0" # x-release-please-version