From fc59c6018a3ff8c9e1a667ece0021676062fbed3 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 16 Oct 2025 15:16:45 +0000 Subject: [PATCH 01/17] chore: update SDK settings --- .github/workflows/publish-pypi.yml | 31 +++++++++ .github/workflows/release-doctor.yml | 21 ++++++ .release-please-manifest.json | 3 + .stats.yml | 2 +- CONTRIBUTING.md | 4 +- README.md | 14 ++-- bin/check-release-environment | 21 ++++++ pyproject.toml | 6 +- release-please-config.json | 66 +++++++++++++++++++ src/whopsdk/_version.py | 2 +- src/whopsdk/resources/app_builds.py | 8 +-- src/whopsdk/resources/apps.py | 8 +-- src/whopsdk/resources/authorized_users.py | 8 +-- src/whopsdk/resources/chat_channels.py | 8 +-- .../resources/checkout_configurations.py | 8 +-- src/whopsdk/resources/companies.py | 8 +-- .../resources/course_lesson_interactions.py | 8 +-- src/whopsdk/resources/entries.py | 8 +-- src/whopsdk/resources/experiences.py | 8 +-- src/whopsdk/resources/forum_posts.py | 8 +-- src/whopsdk/resources/invoices.py | 8 +-- src/whopsdk/resources/ledger_accounts.py | 8 +-- src/whopsdk/resources/memberships.py | 8 +-- src/whopsdk/resources/messages.py | 8 +-- src/whopsdk/resources/payments.py | 8 +-- src/whopsdk/resources/plans.py | 8 +-- src/whopsdk/resources/products.py | 8 +-- src/whopsdk/resources/reactions.py | 8 +-- src/whopsdk/resources/shipments.py | 8 +-- src/whopsdk/resources/support_channels.py | 8 +-- src/whopsdk/resources/transfers.py | 8 +-- src/whopsdk/resources/users.py | 8 +-- 32 files changed, 244 insertions(+), 102 deletions(-) create mode 100644 .github/workflows/publish-pypi.yml create mode 100644 .github/workflows/release-doctor.yml create mode 100644 .release-please-manifest.json create mode 100644 bin/check-release-environment create mode 100644 release-please-config.json diff --git a/.github/workflows/publish-pypi.yml b/.github/workflows/publish-pypi.yml new file mode 100644 index 00000000..64a890ec --- /dev/null +++ b/.github/workflows/publish-pypi.yml @@ -0,0 +1,31 @@ +# This workflow is triggered when a GitHub release is created. +# It can also be run manually to re-publish to PyPI in case it failed for some reason. +# You can run this workflow by navigating to https://www.github.com/whopio/whopsdk-python/actions/workflows/publish-pypi.yml +name: Publish PyPI +on: + workflow_dispatch: + + release: + types: [published] + +jobs: + publish: + name: publish + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Install Rye + run: | + curl -sSf https://rye.astral.sh/get | bash + echo "$HOME/.rye/shims" >> $GITHUB_PATH + env: + RYE_VERSION: '0.44.0' + RYE_INSTALL_OPTION: '--yes' + + - name: Publish to PyPI + run: | + bash ./bin/publish-pypi + env: + PYPI_TOKEN: ${{ secrets.WHOP_PYPI_TOKEN || secrets.PYPI_TOKEN }} diff --git a/.github/workflows/release-doctor.yml b/.github/workflows/release-doctor.yml new file mode 100644 index 00000000..b63c0b62 --- /dev/null +++ b/.github/workflows/release-doctor.yml @@ -0,0 +1,21 @@ +name: Release Doctor +on: + pull_request: + branches: + - main + workflow_dispatch: + +jobs: + release_doctor: + name: release doctor + runs-on: ubuntu-latest + if: github.repository == 'whopio/whopsdk-python' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || startsWith(github.head_ref, 'release-please') || github.head_ref == 'next') + + steps: + - uses: actions/checkout@v4 + + - name: Check release environment + run: | + bash ./bin/check-release-environment + env: + PYPI_TOKEN: ${{ secrets.WHOP_PYPI_TOKEN || secrets.PYPI_TOKEN }} diff --git a/.release-please-manifest.json b/.release-please-manifest.json new file mode 100644 index 00000000..1332969b --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "0.0.1" +} \ No newline at end of file diff --git a/.stats.yml b/.stats.yml index 56f3239f..63738059 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 76 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-493b08fc2ae996eaf1758fa74f56163b2e40d4e1abeaa9672b8d1a039df30d75.yml openapi_spec_hash: 212470480a88cabb38a58b5b6867c733 -config_hash: 544517bd5d21c8f0df57292359ed31e4 +config_hash: 7dfb88bc41d1a03044fa2b1f21ffdb6d diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a68778bb..435024a3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -62,7 +62,7 @@ If you’d like to use the repository from source, you can either install from g To install via git: ```sh -$ pip install git+ssh://git@github.com/stainless-sdks/whopsdk-python.git +$ pip install git+ssh://git@github.com/whopio/whopsdk-python.git ``` Alternatively, you can build from source and install the wheel file: @@ -120,7 +120,7 @@ the changes aren't made through the automated pipeline, you may want to make rel ### Publish with a GitHub workflow -You can release to package managers by using [the `Publish PyPI` GitHub action](https://www.github.com/stainless-sdks/whopsdk-python/actions/workflows/publish-pypi.yml). This requires a setup organization or repository secret to be set up. +You can release to package managers by using [the `Publish PyPI` GitHub action](https://www.github.com/whopio/whopsdk-python/actions/workflows/publish-pypi.yml). This requires a setup organization or repository secret to be set up. ### Publish manually diff --git a/README.md b/README.md index 714ccec7..943a53b5 100644 --- a/README.md +++ b/README.md @@ -16,8 +16,8 @@ The REST API documentation can be found on [docs.whop.com](https://docs.whop.com ## Installation ```sh -# install from this staging repo -pip install git+ssh://git@github.com/stainless-sdks/whopsdk-python.git +# install from the production repo +pip install git+ssh://git@github.com/whopio/whopsdk-python.git ``` > [!NOTE] @@ -81,8 +81,8 @@ By default, the async client uses `httpx` for HTTP requests. However, for improv You can enable this by installing `aiohttp`: ```sh -# install from this staging repo -pip install 'whopsdk[aiohttp] @ git+ssh://git@github.com/stainless-sdks/whopsdk-python.git' +# install from the production repo +pip install 'whopsdk[aiohttp] @ git+ssh://git@github.com/whopio/whopsdk-python.git' ``` Then you can enable it by instantiating the client with `http_client=DefaultAioHttpClient()`: @@ -355,9 +355,9 @@ payment = response.parse() # get the object that `payments.list()` would have r print(payment.id) ``` -These methods return an [`APIResponse`](https://github.com/stainless-sdks/whopsdk-python/tree/main/src/whopsdk/_response.py) object. +These methods return an [`APIResponse`](https://github.com/whopio/whopsdk-python/tree/main/src/whopsdk/_response.py) object. -The async client returns an [`AsyncAPIResponse`](https://github.com/stainless-sdks/whopsdk-python/tree/main/src/whopsdk/_response.py) with the same structure, the only difference being `await`able methods for reading the response content. +The async client returns an [`AsyncAPIResponse`](https://github.com/whopio/whopsdk-python/tree/main/src/whopsdk/_response.py) with the same structure, the only difference being `await`able methods for reading the response content. #### `.with_streaming_response` @@ -466,7 +466,7 @@ This package generally follows [SemVer](https://semver.org/spec/v2.0.0.html) con We take backwards-compatibility seriously and work hard to ensure you can rely on a smooth upgrade experience. -We are keen for your feedback; please open an [issue](https://www.github.com/stainless-sdks/whopsdk-python/issues) with questions, bugs, or suggestions. +We are keen for your feedback; please open an [issue](https://www.github.com/whopio/whopsdk-python/issues) with questions, bugs, or suggestions. ### Determining the installed version diff --git a/bin/check-release-environment b/bin/check-release-environment new file mode 100644 index 00000000..b845b0f4 --- /dev/null +++ b/bin/check-release-environment @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +errors=() + +if [ -z "${PYPI_TOKEN}" ]; then + errors+=("The PYPI_TOKEN secret has not been set. Please set it in either this repository's secrets or your organization secrets.") +fi + +lenErrors=${#errors[@]} + +if [[ lenErrors -gt 0 ]]; then + echo -e "Found the following errors in the release environment:\n" + + for error in "${errors[@]}"; do + echo -e "- $error\n" + done + + exit 1 +fi + +echo "The environment is ready to push releases!" diff --git a/pyproject.toml b/pyproject.toml index ce4cffb7..e7268335 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,8 +35,8 @@ classifiers = [ ] [project.urls] -Homepage = "https://github.com/stainless-sdks/whopsdk-python" -Repository = "https://github.com/stainless-sdks/whopsdk-python" +Homepage = "https://github.com/whopio/whopsdk-python" +Repository = "https://github.com/whopio/whopsdk-python" [project.optional-dependencies] aiohttp = ["aiohttp", "httpx_aiohttp>=0.1.8"] @@ -125,7 +125,7 @@ path = "README.md" [[tool.hatch.metadata.hooks.fancy-pypi-readme.substitutions]] # replace relative links with absolute links pattern = '\[(.+?)\]\(((?!https?://)\S+?)\)' -replacement = '[\1](https://github.com/stainless-sdks/whopsdk-python/tree/main/\g<2>)' +replacement = '[\1](https://github.com/whopio/whopsdk-python/tree/main/\g<2>)' [tool.pytest.ini_options] testpaths = ["tests"] diff --git a/release-please-config.json b/release-please-config.json new file mode 100644 index 00000000..694109b6 --- /dev/null +++ b/release-please-config.json @@ -0,0 +1,66 @@ +{ + "packages": { + ".": {} + }, + "$schema": "https://raw.githubusercontent.com/stainless-api/release-please/main/schemas/config.json", + "include-v-in-tag": true, + "include-component-in-tag": false, + "versioning": "prerelease", + "prerelease": true, + "bump-minor-pre-major": true, + "bump-patch-for-minor-pre-major": false, + "pull-request-header": "Automated Release PR", + "pull-request-title-pattern": "release: ${version}", + "changelog-sections": [ + { + "type": "feat", + "section": "Features" + }, + { + "type": "fix", + "section": "Bug Fixes" + }, + { + "type": "perf", + "section": "Performance Improvements" + }, + { + "type": "revert", + "section": "Reverts" + }, + { + "type": "chore", + "section": "Chores" + }, + { + "type": "docs", + "section": "Documentation" + }, + { + "type": "style", + "section": "Styles" + }, + { + "type": "refactor", + "section": "Refactors" + }, + { + "type": "test", + "section": "Tests", + "hidden": true + }, + { + "type": "build", + "section": "Build System" + }, + { + "type": "ci", + "section": "Continuous Integration", + "hidden": true + } + ], + "release-type": "python", + "extra-files": [ + "src/whopsdk/_version.py" + ] +} \ No newline at end of file diff --git a/src/whopsdk/_version.py b/src/whopsdk/_version.py index 15354f7d..5a479d33 100644 --- a/src/whopsdk/_version.py +++ b/src/whopsdk/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "whopsdk" -__version__ = "0.0.1" +__version__ = "0.0.1" # x-release-please-version diff --git a/src/whopsdk/resources/app_builds.py b/src/whopsdk/resources/app_builds.py index 4e6aa0da..627a4ff4 100644 --- a/src/whopsdk/resources/app_builds.py +++ b/src/whopsdk/resources/app_builds.py @@ -35,7 +35,7 @@ def with_raw_response(self) -> AppBuildsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return AppBuildsResourceWithRawResponse(self) @@ -44,7 +44,7 @@ def with_streaming_response(self) -> AppBuildsResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return AppBuildsResourceWithStreamingResponse(self) @@ -266,7 +266,7 @@ def with_raw_response(self) -> AsyncAppBuildsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return AsyncAppBuildsResourceWithRawResponse(self) @@ -275,7 +275,7 @@ def with_streaming_response(self) -> AsyncAppBuildsResourceWithStreamingResponse """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return AsyncAppBuildsResourceWithStreamingResponse(self) diff --git a/src/whopsdk/resources/apps.py b/src/whopsdk/resources/apps.py index ecf48d3c..09cd0d33 100644 --- a/src/whopsdk/resources/apps.py +++ b/src/whopsdk/resources/apps.py @@ -36,7 +36,7 @@ def with_raw_response(self) -> AppsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return AppsResourceWithRawResponse(self) @@ -45,7 +45,7 @@ def with_streaming_response(self) -> AppsResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return AppsResourceWithStreamingResponse(self) @@ -318,7 +318,7 @@ def with_raw_response(self) -> AsyncAppsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return AsyncAppsResourceWithRawResponse(self) @@ -327,7 +327,7 @@ def with_streaming_response(self) -> AsyncAppsResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return AsyncAppsResourceWithStreamingResponse(self) diff --git a/src/whopsdk/resources/authorized_users.py b/src/whopsdk/resources/authorized_users.py index 79160372..35e5daff 100644 --- a/src/whopsdk/resources/authorized_users.py +++ b/src/whopsdk/resources/authorized_users.py @@ -33,7 +33,7 @@ def with_raw_response(self) -> AuthorizedUsersResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return AuthorizedUsersResourceWithRawResponse(self) @@ -42,7 +42,7 @@ def with_streaming_response(self) -> AuthorizedUsersResourceWithStreamingRespons """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return AuthorizedUsersResourceWithStreamingResponse(self) @@ -164,7 +164,7 @@ def with_raw_response(self) -> AsyncAuthorizedUsersResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return AsyncAuthorizedUsersResourceWithRawResponse(self) @@ -173,7 +173,7 @@ def with_streaming_response(self) -> AsyncAuthorizedUsersResourceWithStreamingRe """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return AsyncAuthorizedUsersResourceWithStreamingResponse(self) diff --git a/src/whopsdk/resources/chat_channels.py b/src/whopsdk/resources/chat_channels.py index ea7a2039..5c30f6c4 100644 --- a/src/whopsdk/resources/chat_channels.py +++ b/src/whopsdk/resources/chat_channels.py @@ -34,7 +34,7 @@ def with_raw_response(self) -> ChatChannelsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return ChatChannelsResourceWithRawResponse(self) @@ -43,7 +43,7 @@ def with_streaming_response(self) -> ChatChannelsResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return ChatChannelsResourceWithStreamingResponse(self) @@ -225,7 +225,7 @@ def with_raw_response(self) -> AsyncChatChannelsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return AsyncChatChannelsResourceWithRawResponse(self) @@ -234,7 +234,7 @@ def with_streaming_response(self) -> AsyncChatChannelsResourceWithStreamingRespo """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return AsyncChatChannelsResourceWithStreamingResponse(self) diff --git a/src/whopsdk/resources/checkout_configurations.py b/src/whopsdk/resources/checkout_configurations.py index 08e0c695..d2a63268 100644 --- a/src/whopsdk/resources/checkout_configurations.py +++ b/src/whopsdk/resources/checkout_configurations.py @@ -33,7 +33,7 @@ def with_raw_response(self) -> CheckoutConfigurationsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return CheckoutConfigurationsResourceWithRawResponse(self) @@ -42,7 +42,7 @@ def with_streaming_response(self) -> CheckoutConfigurationsResourceWithStreaming """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return CheckoutConfigurationsResourceWithStreamingResponse(self) @@ -222,7 +222,7 @@ def with_raw_response(self) -> AsyncCheckoutConfigurationsResourceWithRawRespons This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return AsyncCheckoutConfigurationsResourceWithRawResponse(self) @@ -231,7 +231,7 @@ def with_streaming_response(self) -> AsyncCheckoutConfigurationsResourceWithStre """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return AsyncCheckoutConfigurationsResourceWithStreamingResponse(self) diff --git a/src/whopsdk/resources/companies.py b/src/whopsdk/resources/companies.py index b0fc36b4..be4d3a74 100644 --- a/src/whopsdk/resources/companies.py +++ b/src/whopsdk/resources/companies.py @@ -26,7 +26,7 @@ def with_raw_response(self) -> CompaniesResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return CompaniesResourceWithRawResponse(self) @@ -35,7 +35,7 @@ def with_streaming_response(self) -> CompaniesResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return CompaniesResourceWithStreamingResponse(self) @@ -84,7 +84,7 @@ def with_raw_response(self) -> AsyncCompaniesResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return AsyncCompaniesResourceWithRawResponse(self) @@ -93,7 +93,7 @@ def with_streaming_response(self) -> AsyncCompaniesResourceWithStreamingResponse """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return AsyncCompaniesResourceWithStreamingResponse(self) diff --git a/src/whopsdk/resources/course_lesson_interactions.py b/src/whopsdk/resources/course_lesson_interactions.py index ed639ce8..4a329239 100644 --- a/src/whopsdk/resources/course_lesson_interactions.py +++ b/src/whopsdk/resources/course_lesson_interactions.py @@ -32,7 +32,7 @@ def with_raw_response(self) -> CourseLessonInteractionsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return CourseLessonInteractionsResourceWithRawResponse(self) @@ -41,7 +41,7 @@ def with_streaming_response(self) -> CourseLessonInteractionsResourceWithStreami """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return CourseLessonInteractionsResourceWithStreamingResponse(self) @@ -167,7 +167,7 @@ def with_raw_response(self) -> AsyncCourseLessonInteractionsResourceWithRawRespo This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return AsyncCourseLessonInteractionsResourceWithRawResponse(self) @@ -176,7 +176,7 @@ def with_streaming_response(self) -> AsyncCourseLessonInteractionsResourceWithSt """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return AsyncCourseLessonInteractionsResourceWithStreamingResponse(self) diff --git a/src/whopsdk/resources/entries.py b/src/whopsdk/resources/entries.py index 5f18eec0..66225d15 100644 --- a/src/whopsdk/resources/entries.py +++ b/src/whopsdk/resources/entries.py @@ -36,7 +36,7 @@ def with_raw_response(self) -> EntriesResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return EntriesResourceWithRawResponse(self) @@ -45,7 +45,7 @@ def with_streaming_response(self) -> EntriesResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return EntriesResourceWithStreamingResponse(self) @@ -255,7 +255,7 @@ def with_raw_response(self) -> AsyncEntriesResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return AsyncEntriesResourceWithRawResponse(self) @@ -264,7 +264,7 @@ def with_streaming_response(self) -> AsyncEntriesResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return AsyncEntriesResourceWithStreamingResponse(self) diff --git a/src/whopsdk/resources/experiences.py b/src/whopsdk/resources/experiences.py index a2c2db3d..41e06c65 100644 --- a/src/whopsdk/resources/experiences.py +++ b/src/whopsdk/resources/experiences.py @@ -40,7 +40,7 @@ def with_raw_response(self) -> ExperiencesResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return ExperiencesResourceWithRawResponse(self) @@ -49,7 +49,7 @@ def with_streaming_response(self) -> ExperiencesResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return ExperiencesResourceWithStreamingResponse(self) @@ -397,7 +397,7 @@ def with_raw_response(self) -> AsyncExperiencesResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return AsyncExperiencesResourceWithRawResponse(self) @@ -406,7 +406,7 @@ def with_streaming_response(self) -> AsyncExperiencesResourceWithStreamingRespon """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return AsyncExperiencesResourceWithStreamingResponse(self) diff --git a/src/whopsdk/resources/forum_posts.py b/src/whopsdk/resources/forum_posts.py index fbf475e5..8b744103 100644 --- a/src/whopsdk/resources/forum_posts.py +++ b/src/whopsdk/resources/forum_posts.py @@ -33,7 +33,7 @@ def with_raw_response(self) -> ForumPostsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return ForumPostsResourceWithRawResponse(self) @@ -42,7 +42,7 @@ def with_streaming_response(self) -> ForumPostsResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return ForumPostsResourceWithStreamingResponse(self) @@ -246,7 +246,7 @@ def with_raw_response(self) -> AsyncForumPostsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return AsyncForumPostsResourceWithRawResponse(self) @@ -255,7 +255,7 @@ def with_streaming_response(self) -> AsyncForumPostsResourceWithStreamingRespons """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return AsyncForumPostsResourceWithStreamingResponse(self) diff --git a/src/whopsdk/resources/invoices.py b/src/whopsdk/resources/invoices.py index 37161aee..db15ac59 100644 --- a/src/whopsdk/resources/invoices.py +++ b/src/whopsdk/resources/invoices.py @@ -38,7 +38,7 @@ def with_raw_response(self) -> InvoicesResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return InvoicesResourceWithRawResponse(self) @@ -47,7 +47,7 @@ def with_streaming_response(self) -> InvoicesResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return InvoicesResourceWithStreamingResponse(self) @@ -303,7 +303,7 @@ def with_raw_response(self) -> AsyncInvoicesResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return AsyncInvoicesResourceWithRawResponse(self) @@ -312,7 +312,7 @@ def with_streaming_response(self) -> AsyncInvoicesResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return AsyncInvoicesResourceWithStreamingResponse(self) diff --git a/src/whopsdk/resources/ledger_accounts.py b/src/whopsdk/resources/ledger_accounts.py index efc90146..039b6c02 100644 --- a/src/whopsdk/resources/ledger_accounts.py +++ b/src/whopsdk/resources/ledger_accounts.py @@ -26,7 +26,7 @@ def with_raw_response(self) -> LedgerAccountsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return LedgerAccountsResourceWithRawResponse(self) @@ -35,7 +35,7 @@ def with_streaming_response(self) -> LedgerAccountsResourceWithStreamingResponse """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return LedgerAccountsResourceWithStreamingResponse(self) @@ -84,7 +84,7 @@ def with_raw_response(self) -> AsyncLedgerAccountsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return AsyncLedgerAccountsResourceWithRawResponse(self) @@ -93,7 +93,7 @@ def with_streaming_response(self) -> AsyncLedgerAccountsResourceWithStreamingRes """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return AsyncLedgerAccountsResourceWithStreamingResponse(self) diff --git a/src/whopsdk/resources/memberships.py b/src/whopsdk/resources/memberships.py index c8b74b00..907f9efa 100644 --- a/src/whopsdk/resources/memberships.py +++ b/src/whopsdk/resources/memberships.py @@ -41,7 +41,7 @@ def with_raw_response(self) -> MembershipsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return MembershipsResourceWithRawResponse(self) @@ -50,7 +50,7 @@ def with_streaming_response(self) -> MembershipsResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return MembershipsResourceWithStreamingResponse(self) @@ -380,7 +380,7 @@ def with_raw_response(self) -> AsyncMembershipsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return AsyncMembershipsResourceWithRawResponse(self) @@ -389,7 +389,7 @@ def with_streaming_response(self) -> AsyncMembershipsResourceWithStreamingRespon """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return AsyncMembershipsResourceWithStreamingResponse(self) diff --git a/src/whopsdk/resources/messages.py b/src/whopsdk/resources/messages.py index c4f8a5ff..a5f5aed5 100644 --- a/src/whopsdk/resources/messages.py +++ b/src/whopsdk/resources/messages.py @@ -33,7 +33,7 @@ def with_raw_response(self) -> MessagesResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return MessagesResourceWithRawResponse(self) @@ -42,7 +42,7 @@ def with_streaming_response(self) -> MessagesResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return MessagesResourceWithStreamingResponse(self) @@ -213,7 +213,7 @@ def with_raw_response(self) -> AsyncMessagesResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return AsyncMessagesResourceWithRawResponse(self) @@ -222,7 +222,7 @@ def with_streaming_response(self) -> AsyncMessagesResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return AsyncMessagesResourceWithStreamingResponse(self) diff --git a/src/whopsdk/resources/payments.py b/src/whopsdk/resources/payments.py index b037781c..a1b5ddde 100644 --- a/src/whopsdk/resources/payments.py +++ b/src/whopsdk/resources/payments.py @@ -38,7 +38,7 @@ def with_raw_response(self) -> PaymentsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return PaymentsResourceWithRawResponse(self) @@ -47,7 +47,7 @@ def with_streaming_response(self) -> PaymentsResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return PaymentsResourceWithStreamingResponse(self) @@ -360,7 +360,7 @@ def with_raw_response(self) -> AsyncPaymentsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return AsyncPaymentsResourceWithRawResponse(self) @@ -369,7 +369,7 @@ def with_streaming_response(self) -> AsyncPaymentsResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return AsyncPaymentsResourceWithStreamingResponse(self) diff --git a/src/whopsdk/resources/plans.py b/src/whopsdk/resources/plans.py index 2a637717..d536a330 100644 --- a/src/whopsdk/resources/plans.py +++ b/src/whopsdk/resources/plans.py @@ -41,7 +41,7 @@ def with_raw_response(self) -> PlansResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return PlansResourceWithRawResponse(self) @@ -50,7 +50,7 @@ def with_streaming_response(self) -> PlansResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return PlansResourceWithStreamingResponse(self) @@ -435,7 +435,7 @@ def with_raw_response(self) -> AsyncPlansResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return AsyncPlansResourceWithRawResponse(self) @@ -444,7 +444,7 @@ def with_streaming_response(self) -> AsyncPlansResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return AsyncPlansResourceWithStreamingResponse(self) diff --git a/src/whopsdk/resources/products.py b/src/whopsdk/resources/products.py index bfa0ba56..0c9cba7c 100644 --- a/src/whopsdk/resources/products.py +++ b/src/whopsdk/resources/products.py @@ -42,7 +42,7 @@ def with_raw_response(self) -> ProductsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return ProductsResourceWithRawResponse(self) @@ -51,7 +51,7 @@ def with_streaming_response(self) -> ProductsResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return ProductsResourceWithStreamingResponse(self) @@ -467,7 +467,7 @@ def with_raw_response(self) -> AsyncProductsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return AsyncProductsResourceWithRawResponse(self) @@ -476,7 +476,7 @@ def with_streaming_response(self) -> AsyncProductsResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return AsyncProductsResourceWithStreamingResponse(self) diff --git a/src/whopsdk/resources/reactions.py b/src/whopsdk/resources/reactions.py index 80281318..1070c458 100644 --- a/src/whopsdk/resources/reactions.py +++ b/src/whopsdk/resources/reactions.py @@ -32,7 +32,7 @@ def with_raw_response(self) -> ReactionsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return ReactionsResourceWithRawResponse(self) @@ -41,7 +41,7 @@ def with_streaming_response(self) -> ReactionsResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return ReactionsResourceWithStreamingResponse(self) @@ -201,7 +201,7 @@ def with_raw_response(self) -> AsyncReactionsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return AsyncReactionsResourceWithRawResponse(self) @@ -210,7 +210,7 @@ def with_streaming_response(self) -> AsyncReactionsResourceWithStreamingResponse """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return AsyncReactionsResourceWithStreamingResponse(self) diff --git a/src/whopsdk/resources/shipments.py b/src/whopsdk/resources/shipments.py index 9aaa360e..2090a247 100644 --- a/src/whopsdk/resources/shipments.py +++ b/src/whopsdk/resources/shipments.py @@ -32,7 +32,7 @@ def with_raw_response(self) -> ShipmentsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return ShipmentsResourceWithRawResponse(self) @@ -41,7 +41,7 @@ def with_streaming_response(self) -> ShipmentsResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return ShipmentsResourceWithStreamingResponse(self) @@ -215,7 +215,7 @@ def with_raw_response(self) -> AsyncShipmentsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return AsyncShipmentsResourceWithRawResponse(self) @@ -224,7 +224,7 @@ def with_streaming_response(self) -> AsyncShipmentsResourceWithStreamingResponse """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return AsyncShipmentsResourceWithStreamingResponse(self) diff --git a/src/whopsdk/resources/support_channels.py b/src/whopsdk/resources/support_channels.py index fe22e2af..d0a3cb3a 100644 --- a/src/whopsdk/resources/support_channels.py +++ b/src/whopsdk/resources/support_channels.py @@ -34,7 +34,7 @@ def with_raw_response(self) -> SupportChannelsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return SupportChannelsResourceWithRawResponse(self) @@ -43,7 +43,7 @@ def with_streaming_response(self) -> SupportChannelsResourceWithStreamingRespons """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return SupportChannelsResourceWithStreamingResponse(self) @@ -218,7 +218,7 @@ def with_raw_response(self) -> AsyncSupportChannelsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return AsyncSupportChannelsResourceWithRawResponse(self) @@ -227,7 +227,7 @@ def with_streaming_response(self) -> AsyncSupportChannelsResourceWithStreamingRe """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return AsyncSupportChannelsResourceWithStreamingResponse(self) diff --git a/src/whopsdk/resources/transfers.py b/src/whopsdk/resources/transfers.py index c0416c2e..16494328 100644 --- a/src/whopsdk/resources/transfers.py +++ b/src/whopsdk/resources/transfers.py @@ -35,7 +35,7 @@ def with_raw_response(self) -> TransfersResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return TransfersResourceWithRawResponse(self) @@ -44,7 +44,7 @@ def with_streaming_response(self) -> TransfersResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return TransfersResourceWithStreamingResponse(self) @@ -235,7 +235,7 @@ def with_raw_response(self) -> AsyncTransfersResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return AsyncTransfersResourceWithRawResponse(self) @@ -244,7 +244,7 @@ def with_streaming_response(self) -> AsyncTransfersResourceWithStreamingResponse """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return AsyncTransfersResourceWithStreamingResponse(self) diff --git a/src/whopsdk/resources/users.py b/src/whopsdk/resources/users.py index beb56896..513eb235 100644 --- a/src/whopsdk/resources/users.py +++ b/src/whopsdk/resources/users.py @@ -27,7 +27,7 @@ def with_raw_response(self) -> UsersResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return UsersResourceWithRawResponse(self) @@ -36,7 +36,7 @@ def with_streaming_response(self) -> UsersResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return UsersResourceWithStreamingResponse(self) @@ -117,7 +117,7 @@ def with_raw_response(self) -> AsyncUsersResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers """ return AsyncUsersResourceWithRawResponse(self) @@ -126,7 +126,7 @@ def with_streaming_response(self) -> AsyncUsersResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/whopsdk-python#with_streaming_response + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response """ return AsyncUsersResourceWithStreamingResponse(self) From 02c299327d251f9ec977af50ccd2504d0956a7e2 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 16 Oct 2025 15:17:07 +0000 Subject: [PATCH 02/17] codegen metadata --- .stats.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.stats.yml b/.stats.yml index 63738059..3c1c43c4 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 76 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-493b08fc2ae996eaf1758fa74f56163b2e40d4e1abeaa9672b8d1a039df30d75.yml openapi_spec_hash: 212470480a88cabb38a58b5b6867c733 -config_hash: 7dfb88bc41d1a03044fa2b1f21ffdb6d +config_hash: ff53778e477537f207ad8e97435ffdf4 From c9b049612845640f2637e2139a4e6a5e61b960d8 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 16 Oct 2025 15:33:37 +0000 Subject: [PATCH 03/17] chore: update SDK settings --- .stats.yml | 2 +- README.md | 13 +++++-------- pyproject.toml | 2 +- requirements-dev.lock | 18 +++++++++--------- requirements.lock | 18 +++++++++--------- src/whopsdk/resources/webhooks.py | 4 ++-- 6 files changed, 27 insertions(+), 30 deletions(-) diff --git a/.stats.yml b/.stats.yml index 3c1c43c4..08430ca9 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 76 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-493b08fc2ae996eaf1758fa74f56163b2e40d4e1abeaa9672b8d1a039df30d75.yml openapi_spec_hash: 212470480a88cabb38a58b5b6867c733 -config_hash: ff53778e477537f207ad8e97435ffdf4 +config_hash: 9628427c59e4953508565376fc44ab35 diff --git a/README.md b/README.md index 943a53b5..aae5084c 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Whop Python API library -[![PyPI version](https://img.shields.io/pypi/v/whopsdk.svg?label=pypi%20(stable))](https://pypi.org/project/whopsdk/) +[![PyPI version](https://img.shields.io/pypi/v/whop-sdk.svg?label=pypi%20(stable))](https://pypi.org/project/whop-sdk/) The Whop Python library provides convenient access to the Whop REST API from any Python 3.8+ application. The library includes type definitions for all request params and response fields, @@ -16,13 +16,10 @@ The REST API documentation can be found on [docs.whop.com](https://docs.whop.com ## Installation ```sh -# install from the production repo -pip install git+ssh://git@github.com/whopio/whopsdk-python.git +# install from PyPI +pip install whop-sdk ``` -> [!NOTE] -> Once this package is [published to PyPI](https://www.stainless.com/docs/guides/publish), this will become: `pip install whopsdk` - ## Usage The full API of this library can be found in [api.md](api.md). @@ -81,8 +78,8 @@ By default, the async client uses `httpx` for HTTP requests. However, for improv You can enable this by installing `aiohttp`: ```sh -# install from the production repo -pip install 'whopsdk[aiohttp] @ git+ssh://git@github.com/whopio/whopsdk-python.git' +# install from PyPI +pip install whop-sdk[aiohttp] ``` Then you can enable it by instantiating the client with `http_client=DefaultAioHttpClient()`: diff --git a/pyproject.toml b/pyproject.toml index e7268335..1eed9d04 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [project] -name = "whopsdk" +name = "whop-sdk" version = "0.0.1" description = "The official Python library for the Whop API" dynamic = ["readme"] diff --git a/requirements-dev.lock b/requirements-dev.lock index cbd7fcfb..a64267f8 100644 --- a/requirements-dev.lock +++ b/requirements-dev.lock @@ -14,14 +14,14 @@ aiohappyeyeballs==2.6.1 # via aiohttp aiohttp==3.12.8 # via httpx-aiohttp - # via whopsdk + # via whop-sdk aiosignal==1.3.2 # via aiohttp annotated-types==0.6.0 # via pydantic anyio==4.4.0 # via httpx - # via whopsdk + # via whop-sdk argcomplete==3.1.2 # via nox async-timeout==5.0.1 @@ -40,7 +40,7 @@ dirty-equals==0.6.0 distlib==0.3.7 # via virtualenv distro==1.8.0 - # via whopsdk + # via whop-sdk exceptiongroup==1.2.2 # via anyio # via pytest @@ -59,9 +59,9 @@ httpx==0.28.1 # via httpx-aiohttp # via respx # via standardwebhooks - # via whopsdk + # via whop-sdk httpx-aiohttp==0.1.8 - # via whopsdk + # via whop-sdk idna==3.4 # via anyio # via httpx @@ -93,7 +93,7 @@ propcache==0.3.1 # via aiohttp # via yarl pydantic==2.11.9 - # via whopsdk + # via whop-sdk pydantic-core==2.33.2 # via pydantic pygments==2.18.0 @@ -118,9 +118,9 @@ six==1.16.0 # via python-dateutil sniffio==1.3.0 # via anyio - # via whopsdk + # via whop-sdk standardwebhooks==1.0.0 - # via whopsdk + # via whop-sdk time-machine==2.9.0 tomli==2.0.2 # via mypy @@ -137,7 +137,7 @@ typing-extensions==4.12.2 # via pydantic-core # via pyright # via typing-inspection - # via whopsdk + # via whop-sdk typing-inspection==0.4.1 # via pydantic virtualenv==20.24.5 diff --git a/requirements.lock b/requirements.lock index 1a1289da..62e1973c 100644 --- a/requirements.lock +++ b/requirements.lock @@ -14,14 +14,14 @@ aiohappyeyeballs==2.6.1 # via aiohttp aiohttp==3.12.8 # via httpx-aiohttp - # via whopsdk + # via whop-sdk aiosignal==1.3.2 # via aiohttp annotated-types==0.6.0 # via pydantic anyio==4.4.0 # via httpx - # via whopsdk + # via whop-sdk async-timeout==5.0.1 # via aiohttp attrs==25.3.0 @@ -33,7 +33,7 @@ certifi==2023.7.22 deprecated==1.2.18 # via standardwebhooks distro==1.8.0 - # via whopsdk + # via whop-sdk exceptiongroup==1.2.2 # via anyio frozenlist==1.6.2 @@ -46,9 +46,9 @@ httpcore==1.0.9 httpx==0.28.1 # via httpx-aiohttp # via standardwebhooks - # via whopsdk + # via whop-sdk httpx-aiohttp==0.1.8 - # via whopsdk + # via whop-sdk idna==3.4 # via anyio # via httpx @@ -60,7 +60,7 @@ propcache==0.3.1 # via aiohttp # via yarl pydantic==2.11.9 - # via whopsdk + # via whop-sdk pydantic-core==2.33.2 # via pydantic python-dateutil==2.9.0.post0 @@ -69,9 +69,9 @@ six==1.17.0 # via python-dateutil sniffio==1.3.0 # via anyio - # via whopsdk + # via whop-sdk standardwebhooks==1.0.0 - # via whopsdk + # via whop-sdk types-deprecated==1.2.15.20250304 # via standardwebhooks types-python-dateutil==2.9.0.20251008 @@ -82,7 +82,7 @@ typing-extensions==4.12.2 # via pydantic # via pydantic-core # via typing-inspection - # via whopsdk + # via whop-sdk typing-inspection==0.4.1 # via pydantic wrapt==1.17.3 diff --git a/src/whopsdk/resources/webhooks.py b/src/whopsdk/resources/webhooks.py index 5232f84c..2753ec22 100644 --- a/src/whopsdk/resources/webhooks.py +++ b/src/whopsdk/resources/webhooks.py @@ -18,7 +18,7 @@ def unwrap(self, payload: str, *, headers: Mapping[str, str], key: str | bytes | try: from standardwebhooks import Webhook except ImportError as exc: - raise WhopError("You need to install `whopsdk[webhooks]` to use this method") from exc + raise WhopError("You need to install `whop-sdk[webhooks]` to use this method") from exc if key is None: key = self._client.webhook_key @@ -46,7 +46,7 @@ def unwrap(self, payload: str, *, headers: Mapping[str, str], key: str | bytes | try: from standardwebhooks import Webhook except ImportError as exc: - raise WhopError("You need to install `whopsdk[webhooks]` to use this method") from exc + raise WhopError("You need to install `whop-sdk[webhooks]` to use this method") from exc if key is None: key = self._client.webhook_key From 8bd5020184f7188182bd6bbefed5b57612576c0d Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 16 Oct 2025 15:35:28 +0000 Subject: [PATCH 04/17] feat(api): manual updates --- .stats.yml | 2 +- CONTRIBUTING.md | 2 +- README.md | 48 ++--- api.md | 196 +++++++++--------- pyproject.toml | 10 +- release-please-config.json | 2 +- scripts/lint | 2 +- src/{whopsdk => whop_sdk}/__init__.py | 4 +- src/{whopsdk => whop_sdk}/_base_client.py | 2 +- src/{whopsdk => whop_sdk}/_client.py | 0 src/{whopsdk => whop_sdk}/_compat.py | 0 src/{whopsdk => whop_sdk}/_constants.py | 0 src/{whopsdk => whop_sdk}/_exceptions.py | 0 src/{whopsdk => whop_sdk}/_files.py | 0 src/{whopsdk => whop_sdk}/_models.py | 0 src/{whopsdk => whop_sdk}/_qs.py | 0 src/{whopsdk => whop_sdk}/_resource.py | 0 src/{whopsdk => whop_sdk}/_response.py | 8 +- src/{whopsdk => whop_sdk}/_streaming.py | 0 src/{whopsdk => whop_sdk}/_types.py | 2 +- src/{whopsdk => whop_sdk}/_utils/__init__.py | 0 src/{whopsdk => whop_sdk}/_utils/_compat.py | 0 .../_utils/_datetime_parse.py | 0 src/{whopsdk => whop_sdk}/_utils/_logs.py | 4 +- src/{whopsdk => whop_sdk}/_utils/_proxy.py | 0 .../_utils/_reflection.py | 0 .../_utils/_resources_proxy.py | 8 +- src/{whopsdk => whop_sdk}/_utils/_streams.py | 0 src/{whopsdk => whop_sdk}/_utils/_sync.py | 0 .../_utils/_transform.py | 0 src/{whopsdk => whop_sdk}/_utils/_typing.py | 0 src/{whopsdk => whop_sdk}/_utils/_utils.py | 0 src/{whopsdk => whop_sdk}/_version.py | 2 +- src/whop_sdk/lib/.keep | 4 + src/{whopsdk => whop_sdk}/pagination.py | 0 src/{whopsdk => whop_sdk}/py.typed | 0 .../resources/__init__.py | 0 .../resources/app_builds.py | 0 src/{whopsdk => whop_sdk}/resources/apps.py | 0 .../resources/authorized_users.py | 0 .../resources/chat_channels.py | 0 .../resources/checkout_configurations.py | 0 .../resources/companies.py | 0 .../resources/course_lesson_interactions.py | 0 .../resources/entries.py | 0 .../resources/experiences.py | 0 .../resources/forum_posts.py | 0 .../resources/invoices.py | 0 .../resources/ledger_accounts.py | 0 .../resources/memberships.py | 0 .../resources/messages.py | 0 .../resources/payments.py | 0 src/{whopsdk => whop_sdk}/resources/plans.py | 0 .../resources/products.py | 0 .../resources/reactions.py | 0 .../resources/shipments.py | 0 .../resources/support_channels.py | 0 .../resources/transfers.py | 0 src/{whopsdk => whop_sdk}/resources/users.py | 0 .../resources/webhooks.py | 0 src/{whopsdk => whop_sdk}/types/__init__.py | 0 .../types/app_build_create_params.py | 0 .../types/app_build_list_params.py | 0 .../types/app_build_list_response.py | 0 .../types/app_create_params.py | 0 .../types/app_list_params.py | 0 .../types/app_list_response.py | 0 .../types/app_update_params.py | 0 .../types/authorized_user_list_params.py | 0 .../types/authorized_user_list_response.py | 0 .../authorized_user_retrieve_response.py | 0 .../types/chat_channel_list_params.py | 0 .../types/chat_channel_list_response.py | 0 .../types/chat_channel_update_params.py | 0 .../checkout_configuration_create_params.py | 0 .../checkout_configuration_list_params.py | 0 .../checkout_configuration_list_response.py | 0 .../course_lesson_interaction_list_params.py | 0 .../types/entry_approve_response.py | 0 .../types/entry_list_params.py | 0 .../types/entry_list_response.py | 0 .../types/experience_attach_params.py | 0 .../types/experience_create_params.py | 0 .../types/experience_delete_response.py | 0 .../types/experience_detach_params.py | 0 .../types/experience_list_params.py | 0 .../types/experience_list_response.py | 0 .../types/experience_update_params.py | 0 .../types/forum_post_create_params.py | 0 .../types/forum_post_list_params.py | 0 .../types/forum_post_list_response.py | 0 .../types/invoice_create_params.py | 0 .../types/invoice_create_response.py | 0 .../types/invoice_created_webhook_event.py | 0 .../types/invoice_list_params.py | 0 .../types/invoice_paid_webhook_event.py | 0 .../types/invoice_past_due_webhook_event.py | 0 .../types/invoice_void_response.py | 0 .../types/invoice_voided_webhook_event.py | 0 .../types/ledger_account_retrieve_response.py | 0 .../types/membership_cancel_params.py | 0 .../types/membership_list_params.py | 0 .../types/membership_list_response.py | 0 .../types/membership_pause_params.py | 0 .../types/membership_update_params.py | 0 .../types/message_create_params.py | 0 .../types/message_list_params.py | 0 .../types/message_list_response.py | 0 .../types/payment_list_params.py | 0 .../types/payment_list_response.py | 0 .../types/payment_refund_params.py | 0 .../types/plan_create_params.py | 0 .../types/plan_delete_response.py | 0 .../types/plan_list_params.py | 0 .../types/plan_list_response.py | 0 .../types/plan_update_params.py | 0 .../types/product_create_params.py | 0 .../types/product_delete_response.py | 0 .../types/product_list_params.py | 0 .../types/product_update_params.py | 0 .../types/reaction_create_params.py | 0 .../types/reaction_list_params.py | 0 .../types/reaction_list_response.py | 0 .../types/shared/__init__.py | 0 .../types/shared/access_pass_type.py | 0 src/{whopsdk => whop_sdk}/types/shared/app.py | 0 .../types/shared/app_build.py | 0 .../types/shared/app_build_platforms.py | 0 .../types/shared/app_build_statuses.py | 0 .../types/shared/app_statuses.py | 0 .../types/shared/app_view_type.py | 0 .../types/shared/authorized_user_roles.py | 0 .../types/shared/business_types.py | 0 .../types/shared/chat_channel.py | 0 .../types/shared/checkout_configuration.py | 0 .../types/shared/collection_method.py | 0 .../types/shared/company.py | 0 .../types/shared/course_lesson_interaction.py | 0 .../course_lesson_interaction_list_item.py | 0 .../types/shared/currency.py | 0 .../types/shared/custom_cta.py | 0 .../types/shared/direction.py | 0 .../types/shared/dms_post_types.py | 0 .../types/shared/entry.py | 0 .../types/shared/entry_status.py | 0 .../types/shared/experience.py | 0 .../types/shared/forum_post.py | 0 .../types/shared/friendly_receipt_status.py | 0 .../types/shared/global_affiliate_status.py | 0 .../types/shared/industry_types.py | 0 .../types/shared/invoice.py | 0 .../types/shared/invoice_list_item.py | 0 .../types/shared/invoice_status.py | 0 .../types/shared/membership.py | 0 .../types/shared/membership_status.py | 0 .../types/shared/message.py | 0 .../types/shared/page_info.py | 0 .../types/shared/payment.py | 0 .../types/shared/plan.py | 0 .../types/shared/plan_type.py | 0 .../types/shared/product.py | 0 .../types/shared/product_list_item.py | 0 .../types/shared/promo_type.py | 0 .../types/shared/reaction.py | 0 .../types/shared/receipt_status.py | 0 .../types/shared/release_method.py | 0 .../types/shared/shipment.py | 0 .../types/shared/shipment_carrier.py | 0 .../types/shared/shipment_status.py | 0 .../types/shared/shipment_substatus.py | 0 .../types/shared/support_channel.py | 0 .../types/shared/tax_type.py | 0 .../types/shared/transfer.py | 0 .../types/shared/visibility.py | 0 .../types/shared/visibility_filter.py | 0 .../types/shared/who_can_post.py | 0 .../types/shared/who_can_react.py | 0 .../types/shared_params/__init__.py | 0 .../types/shared_params/access_pass_type.py | 0 .../shared_params/app_build_platforms.py | 0 .../types/shared_params/app_build_statuses.py | 0 .../types/shared_params/app_statuses.py | 0 .../types/shared_params/app_view_type.py | 0 .../shared_params/authorized_user_roles.py | 0 .../types/shared_params/business_types.py | 0 .../types/shared_params/collection_method.py | 0 .../types/shared_params/currency.py | 0 .../types/shared_params/custom_cta.py | 0 .../types/shared_params/direction.py | 0 .../types/shared_params/entry_status.py | 0 .../shared_params/friendly_receipt_status.py | 0 .../shared_params/global_affiliate_status.py | 0 .../types/shared_params/industry_types.py | 0 .../types/shared_params/invoice_status.py | 0 .../types/shared_params/membership_status.py | 0 .../types/shared_params/plan_type.py | 0 .../types/shared_params/receipt_status.py | 0 .../types/shared_params/release_method.py | 0 .../types/shared_params/tax_type.py | 0 .../types/shared_params/visibility.py | 0 .../types/shared_params/visibility_filter.py | 0 .../types/shared_params/who_can_post.py | 0 .../types/shared_params/who_can_react.py | 0 .../types/shipment_create_params.py | 0 .../types/shipment_list_params.py | 0 .../types/shipment_list_response.py | 0 .../types/support_channel_create_params.py | 0 .../types/support_channel_list_params.py | 0 .../types/support_channel_list_response.py | 0 .../types/transfer_create_params.py | 0 .../types/transfer_list_params.py | 0 .../types/transfer_list_response.py | 0 .../types/unwrap_webhook_event.py | 0 .../types/user_check_access_response.py | 0 .../types/user_retrieve_response.py | 0 tests/api_resources/test_app_builds.py | 8 +- tests/api_resources/test_apps.py | 8 +- tests/api_resources/test_authorized_users.py | 6 +- tests/api_resources/test_chat_channels.py | 8 +- .../test_checkout_configurations.py | 8 +- tests/api_resources/test_companies.py | 4 +- .../test_course_lesson_interactions.py | 6 +- tests/api_resources/test_entries.py | 8 +- tests/api_resources/test_experiences.py | 8 +- tests/api_resources/test_forum_posts.py | 8 +- tests/api_resources/test_invoices.py | 13 +- tests/api_resources/test_ledger_accounts.py | 4 +- tests/api_resources/test_memberships.py | 10 +- tests/api_resources/test_messages.py | 8 +- tests/api_resources/test_payments.py | 10 +- tests/api_resources/test_plans.py | 8 +- tests/api_resources/test_products.py | 8 +- tests/api_resources/test_reactions.py | 8 +- tests/api_resources/test_shipments.py | 8 +- tests/api_resources/test_support_channels.py | 10 +- tests/api_resources/test_transfers.py | 8 +- tests/api_resources/test_users.py | 4 +- tests/api_resources/test_webhooks.py | 2 +- tests/conftest.py | 6 +- tests/test_client.py | 36 ++-- tests/test_deepcopy.py | 2 +- tests/test_extract_files.py | 4 +- tests/test_files.py | 2 +- tests/test_models.py | 6 +- tests/test_qs.py | 2 +- tests/test_required_args.py | 2 +- tests/test_response.py | 14 +- tests/test_streaming.py | 4 +- tests/test_transform.py | 8 +- tests/test_utils/test_datetime_parse.py | 2 +- tests/test_utils/test_proxy.py | 2 +- tests/test_utils/test_typing.py | 2 +- tests/utils.py | 8 +- 253 files changed, 289 insertions(+), 280 deletions(-) rename src/{whopsdk => whop_sdk}/__init__.py (95%) rename src/{whopsdk => whop_sdk}/_base_client.py (99%) rename src/{whopsdk => whop_sdk}/_client.py (100%) rename src/{whopsdk => whop_sdk}/_compat.py (100%) rename src/{whopsdk => whop_sdk}/_constants.py (100%) rename src/{whopsdk => whop_sdk}/_exceptions.py (100%) rename src/{whopsdk => whop_sdk}/_files.py (100%) rename src/{whopsdk => whop_sdk}/_models.py (100%) rename src/{whopsdk => whop_sdk}/_qs.py (100%) rename src/{whopsdk => whop_sdk}/_resource.py (100%) rename src/{whopsdk => whop_sdk}/_response.py (99%) rename src/{whopsdk => whop_sdk}/_streaming.py (100%) rename src/{whopsdk => whop_sdk}/_types.py (99%) rename src/{whopsdk => whop_sdk}/_utils/__init__.py (100%) rename src/{whopsdk => whop_sdk}/_utils/_compat.py (100%) rename src/{whopsdk => whop_sdk}/_utils/_datetime_parse.py (100%) rename src/{whopsdk => whop_sdk}/_utils/_logs.py (76%) rename src/{whopsdk => whop_sdk}/_utils/_proxy.py (100%) rename src/{whopsdk => whop_sdk}/_utils/_reflection.py (100%) rename src/{whopsdk => whop_sdk}/_utils/_resources_proxy.py (52%) rename src/{whopsdk => whop_sdk}/_utils/_streams.py (100%) rename src/{whopsdk => whop_sdk}/_utils/_sync.py (100%) rename src/{whopsdk => whop_sdk}/_utils/_transform.py (100%) rename src/{whopsdk => whop_sdk}/_utils/_typing.py (100%) rename src/{whopsdk => whop_sdk}/_utils/_utils.py (100%) rename src/{whopsdk => whop_sdk}/_version.py (85%) create mode 100644 src/whop_sdk/lib/.keep rename src/{whopsdk => whop_sdk}/pagination.py (100%) rename src/{whopsdk => whop_sdk}/py.typed (100%) rename src/{whopsdk => whop_sdk}/resources/__init__.py (100%) rename src/{whopsdk => whop_sdk}/resources/app_builds.py (100%) rename src/{whopsdk => whop_sdk}/resources/apps.py (100%) rename src/{whopsdk => whop_sdk}/resources/authorized_users.py (100%) rename src/{whopsdk => whop_sdk}/resources/chat_channels.py (100%) rename src/{whopsdk => whop_sdk}/resources/checkout_configurations.py (100%) rename src/{whopsdk => whop_sdk}/resources/companies.py (100%) rename src/{whopsdk => whop_sdk}/resources/course_lesson_interactions.py (100%) rename src/{whopsdk => whop_sdk}/resources/entries.py (100%) rename src/{whopsdk => whop_sdk}/resources/experiences.py (100%) rename src/{whopsdk => whop_sdk}/resources/forum_posts.py (100%) rename src/{whopsdk => whop_sdk}/resources/invoices.py (100%) rename src/{whopsdk => whop_sdk}/resources/ledger_accounts.py (100%) rename src/{whopsdk => whop_sdk}/resources/memberships.py (100%) rename src/{whopsdk => whop_sdk}/resources/messages.py (100%) rename src/{whopsdk => whop_sdk}/resources/payments.py (100%) rename src/{whopsdk => whop_sdk}/resources/plans.py (100%) rename src/{whopsdk => whop_sdk}/resources/products.py (100%) rename src/{whopsdk => whop_sdk}/resources/reactions.py (100%) rename src/{whopsdk => whop_sdk}/resources/shipments.py (100%) rename src/{whopsdk => whop_sdk}/resources/support_channels.py (100%) rename src/{whopsdk => whop_sdk}/resources/transfers.py (100%) rename src/{whopsdk => whop_sdk}/resources/users.py (100%) rename src/{whopsdk => whop_sdk}/resources/webhooks.py (100%) rename src/{whopsdk => whop_sdk}/types/__init__.py (100%) rename src/{whopsdk => whop_sdk}/types/app_build_create_params.py (100%) rename src/{whopsdk => whop_sdk}/types/app_build_list_params.py (100%) rename src/{whopsdk => whop_sdk}/types/app_build_list_response.py (100%) rename src/{whopsdk => whop_sdk}/types/app_create_params.py (100%) rename src/{whopsdk => whop_sdk}/types/app_list_params.py (100%) rename src/{whopsdk => whop_sdk}/types/app_list_response.py (100%) rename src/{whopsdk => whop_sdk}/types/app_update_params.py (100%) rename src/{whopsdk => whop_sdk}/types/authorized_user_list_params.py (100%) rename src/{whopsdk => whop_sdk}/types/authorized_user_list_response.py (100%) rename src/{whopsdk => whop_sdk}/types/authorized_user_retrieve_response.py (100%) rename src/{whopsdk => whop_sdk}/types/chat_channel_list_params.py (100%) rename src/{whopsdk => whop_sdk}/types/chat_channel_list_response.py (100%) rename src/{whopsdk => whop_sdk}/types/chat_channel_update_params.py (100%) rename src/{whopsdk => whop_sdk}/types/checkout_configuration_create_params.py (100%) rename src/{whopsdk => whop_sdk}/types/checkout_configuration_list_params.py (100%) rename src/{whopsdk => whop_sdk}/types/checkout_configuration_list_response.py (100%) rename src/{whopsdk => whop_sdk}/types/course_lesson_interaction_list_params.py (100%) rename src/{whopsdk => whop_sdk}/types/entry_approve_response.py (100%) rename src/{whopsdk => whop_sdk}/types/entry_list_params.py (100%) rename src/{whopsdk => whop_sdk}/types/entry_list_response.py (100%) rename src/{whopsdk => whop_sdk}/types/experience_attach_params.py (100%) rename src/{whopsdk => whop_sdk}/types/experience_create_params.py (100%) rename src/{whopsdk => whop_sdk}/types/experience_delete_response.py (100%) rename src/{whopsdk => whop_sdk}/types/experience_detach_params.py (100%) rename src/{whopsdk => whop_sdk}/types/experience_list_params.py (100%) rename src/{whopsdk => whop_sdk}/types/experience_list_response.py (100%) rename src/{whopsdk => whop_sdk}/types/experience_update_params.py (100%) rename src/{whopsdk => whop_sdk}/types/forum_post_create_params.py (100%) rename src/{whopsdk => whop_sdk}/types/forum_post_list_params.py (100%) rename src/{whopsdk => whop_sdk}/types/forum_post_list_response.py (100%) rename src/{whopsdk => whop_sdk}/types/invoice_create_params.py (100%) rename src/{whopsdk => whop_sdk}/types/invoice_create_response.py (100%) rename src/{whopsdk => whop_sdk}/types/invoice_created_webhook_event.py (100%) rename src/{whopsdk => whop_sdk}/types/invoice_list_params.py (100%) rename src/{whopsdk => whop_sdk}/types/invoice_paid_webhook_event.py (100%) rename src/{whopsdk => whop_sdk}/types/invoice_past_due_webhook_event.py (100%) rename src/{whopsdk => whop_sdk}/types/invoice_void_response.py (100%) rename src/{whopsdk => whop_sdk}/types/invoice_voided_webhook_event.py (100%) rename src/{whopsdk => whop_sdk}/types/ledger_account_retrieve_response.py (100%) rename src/{whopsdk => whop_sdk}/types/membership_cancel_params.py (100%) rename src/{whopsdk => whop_sdk}/types/membership_list_params.py (100%) rename src/{whopsdk => whop_sdk}/types/membership_list_response.py (100%) rename src/{whopsdk => whop_sdk}/types/membership_pause_params.py (100%) rename src/{whopsdk => whop_sdk}/types/membership_update_params.py (100%) rename src/{whopsdk => whop_sdk}/types/message_create_params.py (100%) rename src/{whopsdk => whop_sdk}/types/message_list_params.py (100%) rename src/{whopsdk => whop_sdk}/types/message_list_response.py (100%) rename src/{whopsdk => whop_sdk}/types/payment_list_params.py (100%) rename src/{whopsdk => whop_sdk}/types/payment_list_response.py (100%) rename src/{whopsdk => whop_sdk}/types/payment_refund_params.py (100%) rename src/{whopsdk => whop_sdk}/types/plan_create_params.py (100%) rename src/{whopsdk => whop_sdk}/types/plan_delete_response.py (100%) rename src/{whopsdk => whop_sdk}/types/plan_list_params.py (100%) rename src/{whopsdk => whop_sdk}/types/plan_list_response.py (100%) rename src/{whopsdk => whop_sdk}/types/plan_update_params.py (100%) rename src/{whopsdk => whop_sdk}/types/product_create_params.py (100%) rename src/{whopsdk => whop_sdk}/types/product_delete_response.py (100%) rename src/{whopsdk => whop_sdk}/types/product_list_params.py (100%) rename src/{whopsdk => whop_sdk}/types/product_update_params.py (100%) rename src/{whopsdk => whop_sdk}/types/reaction_create_params.py (100%) rename src/{whopsdk => whop_sdk}/types/reaction_list_params.py (100%) rename src/{whopsdk => whop_sdk}/types/reaction_list_response.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/__init__.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/access_pass_type.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/app.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/app_build.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/app_build_platforms.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/app_build_statuses.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/app_statuses.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/app_view_type.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/authorized_user_roles.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/business_types.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/chat_channel.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/checkout_configuration.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/collection_method.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/company.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/course_lesson_interaction.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/course_lesson_interaction_list_item.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/currency.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/custom_cta.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/direction.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/dms_post_types.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/entry.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/entry_status.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/experience.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/forum_post.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/friendly_receipt_status.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/global_affiliate_status.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/industry_types.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/invoice.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/invoice_list_item.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/invoice_status.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/membership.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/membership_status.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/message.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/page_info.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/payment.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/plan.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/plan_type.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/product.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/product_list_item.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/promo_type.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/reaction.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/receipt_status.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/release_method.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/shipment.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/shipment_carrier.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/shipment_status.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/shipment_substatus.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/support_channel.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/tax_type.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/transfer.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/visibility.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/visibility_filter.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/who_can_post.py (100%) rename src/{whopsdk => whop_sdk}/types/shared/who_can_react.py (100%) rename src/{whopsdk => whop_sdk}/types/shared_params/__init__.py (100%) rename src/{whopsdk => whop_sdk}/types/shared_params/access_pass_type.py (100%) rename src/{whopsdk => whop_sdk}/types/shared_params/app_build_platforms.py (100%) rename src/{whopsdk => whop_sdk}/types/shared_params/app_build_statuses.py (100%) rename src/{whopsdk => whop_sdk}/types/shared_params/app_statuses.py (100%) rename src/{whopsdk => whop_sdk}/types/shared_params/app_view_type.py (100%) rename src/{whopsdk => whop_sdk}/types/shared_params/authorized_user_roles.py (100%) rename src/{whopsdk => whop_sdk}/types/shared_params/business_types.py (100%) rename src/{whopsdk => whop_sdk}/types/shared_params/collection_method.py (100%) rename src/{whopsdk => whop_sdk}/types/shared_params/currency.py (100%) rename src/{whopsdk => whop_sdk}/types/shared_params/custom_cta.py (100%) rename src/{whopsdk => whop_sdk}/types/shared_params/direction.py (100%) rename src/{whopsdk => whop_sdk}/types/shared_params/entry_status.py (100%) rename src/{whopsdk => whop_sdk}/types/shared_params/friendly_receipt_status.py (100%) rename src/{whopsdk => whop_sdk}/types/shared_params/global_affiliate_status.py (100%) rename src/{whopsdk => whop_sdk}/types/shared_params/industry_types.py (100%) rename src/{whopsdk => whop_sdk}/types/shared_params/invoice_status.py (100%) rename src/{whopsdk => whop_sdk}/types/shared_params/membership_status.py (100%) rename src/{whopsdk => whop_sdk}/types/shared_params/plan_type.py (100%) rename src/{whopsdk => whop_sdk}/types/shared_params/receipt_status.py (100%) rename src/{whopsdk => whop_sdk}/types/shared_params/release_method.py (100%) rename src/{whopsdk => whop_sdk}/types/shared_params/tax_type.py (100%) rename src/{whopsdk => whop_sdk}/types/shared_params/visibility.py (100%) rename src/{whopsdk => whop_sdk}/types/shared_params/visibility_filter.py (100%) rename src/{whopsdk => whop_sdk}/types/shared_params/who_can_post.py (100%) rename src/{whopsdk => whop_sdk}/types/shared_params/who_can_react.py (100%) rename src/{whopsdk => whop_sdk}/types/shipment_create_params.py (100%) rename src/{whopsdk => whop_sdk}/types/shipment_list_params.py (100%) rename src/{whopsdk => whop_sdk}/types/shipment_list_response.py (100%) rename src/{whopsdk => whop_sdk}/types/support_channel_create_params.py (100%) rename src/{whopsdk => whop_sdk}/types/support_channel_list_params.py (100%) rename src/{whopsdk => whop_sdk}/types/support_channel_list_response.py (100%) rename src/{whopsdk => whop_sdk}/types/transfer_create_params.py (100%) rename src/{whopsdk => whop_sdk}/types/transfer_list_params.py (100%) rename src/{whopsdk => whop_sdk}/types/transfer_list_response.py (100%) rename src/{whopsdk => whop_sdk}/types/unwrap_webhook_event.py (100%) rename src/{whopsdk => whop_sdk}/types/user_check_access_response.py (100%) rename src/{whopsdk => whop_sdk}/types/user_retrieve_response.py (100%) diff --git a/.stats.yml b/.stats.yml index 08430ca9..f528b1c0 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 76 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-493b08fc2ae996eaf1758fa74f56163b2e40d4e1abeaa9672b8d1a039df30d75.yml openapi_spec_hash: 212470480a88cabb38a58b5b6867c733 -config_hash: 9628427c59e4953508565376fc44ab35 +config_hash: d8da61cbd45bbc6c4ada7c0663afce12 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 435024a3..76fde4c1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -36,7 +36,7 @@ $ pip install -r requirements-dev.lock Most of the SDK is generated code. Modifications to code will be persisted between generations, but may result in merge conflicts between manual patches and changes from the generator. The generator will never -modify the contents of the `src/whopsdk/lib/` and `examples/` directories. +modify the contents of the `src/whop_sdk/lib/` and `examples/` directories. ## Adding and running examples diff --git a/README.md b/README.md index aae5084c..d1dc47e3 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ The full API of this library can be found in [api.md](api.md). ```python import os -from whopsdk import Whop +from whop_sdk import Whop client = Whop( app_id="app_xxxxxxxxxxxxxx", @@ -51,7 +51,7 @@ Simply import `AsyncWhop` instead of `Whop` and use `await` with each API call: ```python import os import asyncio -from whopsdk import AsyncWhop +from whop_sdk import AsyncWhop client = AsyncWhop( app_id="app_xxxxxxxxxxxxxx", @@ -86,8 +86,8 @@ Then you can enable it by instantiating the client with `http_client=DefaultAioH ```python import asyncio -from whopsdk import DefaultAioHttpClient -from whopsdk import AsyncWhop +from whop_sdk import DefaultAioHttpClient +from whop_sdk import AsyncWhop async def main() -> None: @@ -121,7 +121,7 @@ List methods in the Whop API are paginated. This library provides auto-paginating iterators with each list response, so you do not have to request successive pages manually: ```python -from whopsdk import Whop +from whop_sdk import Whop client = Whop( app_id="app_xxxxxxxxxxxxxx", @@ -141,7 +141,7 @@ Or, asynchronously: ```python import asyncio -from whopsdk import AsyncWhop +from whop_sdk import AsyncWhop client = AsyncWhop( app_id="app_xxxxxxxxxxxxxx", @@ -194,7 +194,7 @@ for payment in first_page.data: Nested parameters are dictionaries, typed using `TypedDict`, for example: ```python -from whopsdk import Whop +from whop_sdk import Whop client = Whop( app_id="app_xxxxxxxxxxxxxx", @@ -209,16 +209,16 @@ print(app.icon) ## Handling errors -When the library is unable to connect to the API (for example, due to network connection problems or a timeout), a subclass of `whopsdk.APIConnectionError` is raised. +When the library is unable to connect to the API (for example, due to network connection problems or a timeout), a subclass of `whop_sdk.APIConnectionError` is raised. When the API returns a non-success status code (that is, 4xx or 5xx -response), a subclass of `whopsdk.APIStatusError` is raised, containing `status_code` and `response` properties. +response), a subclass of `whop_sdk.APIStatusError` is raised, containing `status_code` and `response` properties. -All errors inherit from `whopsdk.APIError`. +All errors inherit from `whop_sdk.APIError`. ```python -import whopsdk -from whopsdk import Whop +import whop_sdk +from whop_sdk import Whop client = Whop( app_id="app_xxxxxxxxxxxxxx", @@ -228,12 +228,12 @@ try: client.payments.list( company_id="biz_xxxxxxxxxxxxxx", ) -except whopsdk.APIConnectionError as e: +except whop_sdk.APIConnectionError as e: print("The server could not be reached") print(e.__cause__) # an underlying Exception, likely raised within httpx. -except whopsdk.RateLimitError as e: +except whop_sdk.RateLimitError as e: print("A 429 status code was received; we should back off a bit.") -except whopsdk.APIStatusError as e: +except whop_sdk.APIStatusError as e: print("Another non-200-range status code was received") print(e.status_code) print(e.response) @@ -261,7 +261,7 @@ Connection errors (for example, due to a network connectivity problem), 408 Requ You can use the `max_retries` option to configure or disable retry settings: ```python -from whopsdk import Whop +from whop_sdk import Whop # Configure the default for all requests: client = Whop( @@ -282,7 +282,7 @@ By default requests time out after 1 minute. You can configure this with a `time which accepts a float or an [`httpx.Timeout`](https://www.python-httpx.org/advanced/timeouts/#fine-tuning-the-configuration) object: ```python -from whopsdk import Whop +from whop_sdk import Whop # Configure the default for all requests: client = Whop( @@ -338,7 +338,7 @@ if response.my_field is None: The "raw" Response object can be accessed by prefixing `.with_raw_response.` to any HTTP method call, e.g., ```py -from whopsdk import Whop +from whop_sdk import Whop client = Whop( app_id="app_xxxxxxxxxxxxxx", @@ -352,9 +352,9 @@ payment = response.parse() # get the object that `payments.list()` would have r print(payment.id) ``` -These methods return an [`APIResponse`](https://github.com/whopio/whopsdk-python/tree/main/src/whopsdk/_response.py) object. +These methods return an [`APIResponse`](https://github.com/whopio/whopsdk-python/tree/main/src/whop_sdk/_response.py) object. -The async client returns an [`AsyncAPIResponse`](https://github.com/whopio/whopsdk-python/tree/main/src/whopsdk/_response.py) with the same structure, the only difference being `await`able methods for reading the response content. +The async client returns an [`AsyncAPIResponse`](https://github.com/whopio/whopsdk-python/tree/main/src/whop_sdk/_response.py) with the same structure, the only difference being `await`able methods for reading the response content. #### `.with_streaming_response` @@ -418,7 +418,7 @@ You can directly override the [httpx client](https://www.python-httpx.org/api/#c ```python import httpx -from whopsdk import Whop, DefaultHttpxClient +from whop_sdk import Whop, DefaultHttpxClient client = Whop( app_id="app_xxxxxxxxxxxxxx", @@ -442,7 +442,7 @@ client.with_options(http_client=DefaultHttpxClient(...)) By default the library closes underlying HTTP connections whenever the client is [garbage collected](https://docs.python.org/3/reference/datamodel.html#object.__del__). You can manually close the client using the `.close()` method if desired, or with a context manager that closes when exiting. ```py -from whopsdk import Whop +from whop_sdk import Whop with Whop( app_id="app_xxxxxxxxxxxxxx", @@ -472,8 +472,8 @@ If you've upgraded to the latest version but aren't seeing any new features you You can determine the version that is being used at runtime with: ```py -import whopsdk -print(whopsdk.__version__) +import whop_sdk +print(whop_sdk.__version__) ``` ## Requirements diff --git a/api.md b/api.md index 63d30f4b..11565652 100644 --- a/api.md +++ b/api.md @@ -1,7 +1,7 @@ # Shared Types ```python -from whopsdk.types import ( +from whop_sdk.types import ( AccessPassType, App, AppBuild, @@ -63,66 +63,66 @@ from whopsdk.types import ( Types: ```python -from whopsdk.types import AppListResponse +from whop_sdk.types import AppListResponse ``` Methods: -- client.apps.create(\*\*params) -> App -- client.apps.retrieve(id) -> App -- client.apps.update(id, \*\*params) -> App -- client.apps.list(\*\*params) -> SyncCursorPage[AppListResponse] +- client.apps.create(\*\*params) -> App +- client.apps.retrieve(id) -> App +- client.apps.update(id, \*\*params) -> App +- client.apps.list(\*\*params) -> SyncCursorPage[AppListResponse] # Invoices Types: ```python -from whopsdk.types import InvoiceCreateResponse, InvoiceVoidResponse +from whop_sdk.types import InvoiceCreateResponse, InvoiceVoidResponse ``` Methods: -- client.invoices.create(\*\*params) -> InvoiceCreateResponse -- client.invoices.retrieve(id) -> Invoice -- client.invoices.list(\*\*params) -> SyncCursorPage[InvoiceListItem] -- client.invoices.void(id) -> InvoiceVoidResponse +- client.invoices.create(\*\*params) -> InvoiceCreateResponse +- client.invoices.retrieve(id) -> Invoice +- client.invoices.list(\*\*params) -> SyncCursorPage[InvoiceListItem] +- client.invoices.void(id) -> InvoiceVoidResponse # CourseLessonInteractions Methods: -- client.course_lesson_interactions.retrieve(id) -> CourseLessonInteraction -- client.course_lesson_interactions.list(\*\*params) -> SyncCursorPage[CourseLessonInteractionListItem] +- client.course_lesson_interactions.retrieve(id) -> CourseLessonInteraction +- client.course_lesson_interactions.list(\*\*params) -> SyncCursorPage[CourseLessonInteractionListItem] # Products Types: ```python -from whopsdk.types import ProductDeleteResponse +from whop_sdk.types import ProductDeleteResponse ``` Methods: -- client.products.create(\*\*params) -> Product -- client.products.retrieve(id) -> Product -- client.products.update(id, \*\*params) -> Product -- client.products.list(\*\*params) -> SyncCursorPage[ProductListItem] -- client.products.delete(id) -> ProductDeleteResponse +- client.products.create(\*\*params) -> Product +- client.products.retrieve(id) -> Product +- client.products.update(id, \*\*params) -> Product +- client.products.list(\*\*params) -> SyncCursorPage[ProductListItem] +- client.products.delete(id) -> ProductDeleteResponse # Companies Methods: -- client.companies.retrieve(id) -> Company +- client.companies.retrieve(id) -> Company # Webhooks Types: ```python -from whopsdk.types import ( +from whop_sdk.types import ( InvoiceCreatedWebhookEvent, InvoicePaidWebhookEvent, InvoicePastDueWebhookEvent, @@ -136,244 +136,244 @@ from whopsdk.types import ( Types: ```python -from whopsdk.types import PlanListResponse, PlanDeleteResponse +from whop_sdk.types import PlanListResponse, PlanDeleteResponse ``` Methods: -- client.plans.create(\*\*params) -> Plan -- client.plans.retrieve(id) -> Plan -- client.plans.update(id, \*\*params) -> Plan -- client.plans.list(\*\*params) -> SyncCursorPage[PlanListResponse] -- client.plans.delete(id) -> PlanDeleteResponse +- client.plans.create(\*\*params) -> Plan +- client.plans.retrieve(id) -> Plan +- client.plans.update(id, \*\*params) -> Plan +- client.plans.list(\*\*params) -> SyncCursorPage[PlanListResponse] +- client.plans.delete(id) -> PlanDeleteResponse # Entries Types: ```python -from whopsdk.types import EntryListResponse, EntryApproveResponse +from whop_sdk.types import EntryListResponse, EntryApproveResponse ``` Methods: -- client.entries.retrieve(id) -> Entry -- client.entries.list(\*\*params) -> SyncCursorPage[EntryListResponse] -- client.entries.approve(id) -> EntryApproveResponse -- client.entries.deny(id) -> Entry +- client.entries.retrieve(id) -> Entry +- client.entries.list(\*\*params) -> SyncCursorPage[EntryListResponse] +- client.entries.approve(id) -> EntryApproveResponse +- client.entries.deny(id) -> Entry # ForumPosts Types: ```python -from whopsdk.types import ForumPostListResponse +from whop_sdk.types import ForumPostListResponse ``` Methods: -- client.forum_posts.create(\*\*params) -> ForumPost -- client.forum_posts.retrieve(id) -> ForumPost -- client.forum_posts.list(\*\*params) -> SyncCursorPage[ForumPostListResponse] +- client.forum_posts.create(\*\*params) -> ForumPost +- client.forum_posts.retrieve(id) -> ForumPost +- client.forum_posts.list(\*\*params) -> SyncCursorPage[ForumPostListResponse] # Transfers Types: ```python -from whopsdk.types import TransferListResponse +from whop_sdk.types import TransferListResponse ``` Methods: -- client.transfers.create(\*\*params) -> Transfer -- client.transfers.retrieve(id) -> Transfer -- client.transfers.list(\*\*params) -> SyncCursorPage[TransferListResponse] +- client.transfers.create(\*\*params) -> Transfer +- client.transfers.retrieve(id) -> Transfer +- client.transfers.list(\*\*params) -> SyncCursorPage[TransferListResponse] # LedgerAccounts Types: ```python -from whopsdk.types import LedgerAccountRetrieveResponse +from whop_sdk.types import LedgerAccountRetrieveResponse ``` Methods: -- client.ledger_accounts.retrieve(id) -> LedgerAccountRetrieveResponse +- client.ledger_accounts.retrieve(id) -> LedgerAccountRetrieveResponse # Memberships Types: ```python -from whopsdk.types import MembershipListResponse +from whop_sdk.types import MembershipListResponse ``` Methods: -- client.memberships.retrieve(id) -> Membership -- client.memberships.update(id, \*\*params) -> Membership -- client.memberships.list(\*\*params) -> SyncCursorPage[MembershipListResponse] -- client.memberships.cancel(id, \*\*params) -> Membership -- client.memberships.pause(id, \*\*params) -> Membership -- client.memberships.resume(id) -> Membership +- client.memberships.retrieve(id) -> Membership +- client.memberships.update(id, \*\*params) -> Membership +- client.memberships.list(\*\*params) -> SyncCursorPage[MembershipListResponse] +- client.memberships.cancel(id, \*\*params) -> Membership +- client.memberships.pause(id, \*\*params) -> Membership +- client.memberships.resume(id) -> Membership # AuthorizedUsers Types: ```python -from whopsdk.types import AuthorizedUserRetrieveResponse, AuthorizedUserListResponse +from whop_sdk.types import AuthorizedUserRetrieveResponse, AuthorizedUserListResponse ``` Methods: -- client.authorized_users.retrieve(id) -> AuthorizedUserRetrieveResponse -- client.authorized_users.list(\*\*params) -> SyncCursorPage[AuthorizedUserListResponse] +- client.authorized_users.retrieve(id) -> AuthorizedUserRetrieveResponse +- client.authorized_users.list(\*\*params) -> SyncCursorPage[AuthorizedUserListResponse] # AppBuilds Types: ```python -from whopsdk.types import AppBuildListResponse +from whop_sdk.types import AppBuildListResponse ``` Methods: -- client.app_builds.create(\*\*params) -> AppBuild -- client.app_builds.retrieve(id) -> AppBuild -- client.app_builds.list(\*\*params) -> SyncCursorPage[AppBuildListResponse] -- client.app_builds.promote(id) -> AppBuild +- client.app_builds.create(\*\*params) -> AppBuild +- client.app_builds.retrieve(id) -> AppBuild +- client.app_builds.list(\*\*params) -> SyncCursorPage[AppBuildListResponse] +- client.app_builds.promote(id) -> AppBuild # Shipments Types: ```python -from whopsdk.types import ShipmentListResponse +from whop_sdk.types import ShipmentListResponse ``` Methods: -- client.shipments.create(\*\*params) -> Shipment -- client.shipments.retrieve(id) -> Shipment -- client.shipments.list(\*\*params) -> SyncCursorPage[ShipmentListResponse] +- client.shipments.create(\*\*params) -> Shipment +- client.shipments.retrieve(id) -> Shipment +- client.shipments.list(\*\*params) -> SyncCursorPage[ShipmentListResponse] # CheckoutConfigurations Types: ```python -from whopsdk.types import CheckoutConfigurationListResponse +from whop_sdk.types import CheckoutConfigurationListResponse ``` Methods: -- client.checkout_configurations.create(\*\*params) -> CheckoutConfiguration -- client.checkout_configurations.retrieve(id) -> CheckoutConfiguration -- client.checkout_configurations.list(\*\*params) -> SyncCursorPage[CheckoutConfigurationListResponse] +- client.checkout_configurations.create(\*\*params) -> CheckoutConfiguration +- client.checkout_configurations.retrieve(id) -> CheckoutConfiguration +- client.checkout_configurations.list(\*\*params) -> SyncCursorPage[CheckoutConfigurationListResponse] # Messages Types: ```python -from whopsdk.types import MessageListResponse +from whop_sdk.types import MessageListResponse ``` Methods: -- client.messages.create(\*\*params) -> Message -- client.messages.retrieve(id) -> Message -- client.messages.list(\*\*params) -> SyncCursorPage[MessageListResponse] +- client.messages.create(\*\*params) -> Message +- client.messages.retrieve(id) -> Message +- client.messages.list(\*\*params) -> SyncCursorPage[MessageListResponse] # ChatChannels Types: ```python -from whopsdk.types import ChatChannelListResponse +from whop_sdk.types import ChatChannelListResponse ``` Methods: -- client.chat_channels.retrieve(id) -> ChatChannel -- client.chat_channels.update(id, \*\*params) -> ChatChannel -- client.chat_channels.list(\*\*params) -> SyncCursorPage[ChatChannelListResponse] +- client.chat_channels.retrieve(id) -> ChatChannel +- client.chat_channels.update(id, \*\*params) -> ChatChannel +- client.chat_channels.list(\*\*params) -> SyncCursorPage[ChatChannelListResponse] # Users Types: ```python -from whopsdk.types import UserRetrieveResponse, UserCheckAccessResponse +from whop_sdk.types import UserRetrieveResponse, UserCheckAccessResponse ``` Methods: -- client.users.retrieve(id) -> UserRetrieveResponse -- client.users.check_access(resource_id, \*, id) -> UserCheckAccessResponse +- client.users.retrieve(id) -> UserRetrieveResponse +- client.users.check_access(resource_id, \*, id) -> UserCheckAccessResponse # Payments Types: ```python -from whopsdk.types import PaymentListResponse +from whop_sdk.types import PaymentListResponse ``` Methods: -- client.payments.retrieve(id) -> Payment -- client.payments.list(\*\*params) -> SyncCursorPage[PaymentListResponse] -- client.payments.refund(id, \*\*params) -> Payment -- client.payments.retry(id) -> Payment -- client.payments.void(id) -> Payment +- client.payments.retrieve(id) -> Payment +- client.payments.list(\*\*params) -> SyncCursorPage[PaymentListResponse] +- client.payments.refund(id, \*\*params) -> Payment +- client.payments.retry(id) -> Payment +- client.payments.void(id) -> Payment # SupportChannels Types: ```python -from whopsdk.types import SupportChannelListResponse +from whop_sdk.types import SupportChannelListResponse ``` Methods: -- client.support_channels.create(\*\*params) -> SupportChannel -- client.support_channels.retrieve(id) -> SupportChannel -- client.support_channels.list(\*\*params) -> SyncCursorPage[SupportChannelListResponse] +- client.support_channels.create(\*\*params) -> SupportChannel +- client.support_channels.retrieve(id) -> SupportChannel +- client.support_channels.list(\*\*params) -> SyncCursorPage[SupportChannelListResponse] # Experiences Types: ```python -from whopsdk.types import ExperienceListResponse, ExperienceDeleteResponse +from whop_sdk.types import ExperienceListResponse, ExperienceDeleteResponse ``` Methods: -- client.experiences.create(\*\*params) -> Experience -- client.experiences.retrieve(id) -> Experience -- client.experiences.update(id, \*\*params) -> Experience -- client.experiences.list(\*\*params) -> SyncCursorPage[ExperienceListResponse] -- client.experiences.delete(id) -> ExperienceDeleteResponse -- client.experiences.attach(id, \*\*params) -> Experience -- client.experiences.detach(id, \*\*params) -> Experience +- client.experiences.create(\*\*params) -> Experience +- client.experiences.retrieve(id) -> Experience +- client.experiences.update(id, \*\*params) -> Experience +- client.experiences.list(\*\*params) -> SyncCursorPage[ExperienceListResponse] +- client.experiences.delete(id) -> ExperienceDeleteResponse +- client.experiences.attach(id, \*\*params) -> Experience +- client.experiences.detach(id, \*\*params) -> Experience # Reactions Types: ```python -from whopsdk.types import ReactionListResponse +from whop_sdk.types import ReactionListResponse ``` Methods: -- client.reactions.create(\*\*params) -> Reaction -- client.reactions.retrieve(id) -> Reaction -- client.reactions.list(\*\*params) -> SyncCursorPage[ReactionListResponse] +- client.reactions.create(\*\*params) -> Reaction +- client.reactions.retrieve(id) -> Reaction +- client.reactions.list(\*\*params) -> SyncCursorPage[ReactionListResponse] diff --git a/pyproject.toml b/pyproject.toml index 1eed9d04..bc987eb1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -79,14 +79,14 @@ format = { chain = [ "check:ruff" = "ruff check ." "fix:ruff" = "ruff check --fix ." -"check:importable" = "python -c 'import whopsdk'" +"check:importable" = "python -c 'import whop_sdk'" typecheck = { chain = [ "typecheck:pyright", "typecheck:mypy" ]} "typecheck:pyright" = "pyright" -"typecheck:verify-types" = "pyright --verifytypes whopsdk --ignoreexternal" +"typecheck:verify-types" = "pyright --verifytypes whop_sdk --ignoreexternal" "typecheck:mypy" = "mypy ." [build-system] @@ -99,7 +99,7 @@ include = [ ] [tool.hatch.build.targets.wheel] -packages = ["src/whopsdk"] +packages = ["src/whop_sdk"] [tool.hatch.build.targets.sdist] # Basically everything except hidden files/directories (such as .github, .devcontainers, .python-version, etc) @@ -167,7 +167,7 @@ show_error_codes = true # # We also exclude our `tests` as mypy doesn't always infer # types correctly and Pyright will still catch any type errors. -exclude = ['src/whopsdk/_files.py', '_dev/.*.py', 'tests/.*'] +exclude = ['src/whop_sdk/_files.py', '_dev/.*.py', 'tests/.*'] strict_equality = true implicit_reexport = true @@ -259,7 +259,7 @@ length-sort = true length-sort-straight = true combine-as-imports = true extra-standard-library = ["typing_extensions"] -known-first-party = ["whopsdk", "tests"] +known-first-party = ["whop_sdk", "tests"] [tool.ruff.lint.per-file-ignores] "bin/**.py" = ["T201", "T203"] diff --git a/release-please-config.json b/release-please-config.json index 694109b6..48f67aed 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -61,6 +61,6 @@ ], "release-type": "python", "extra-files": [ - "src/whopsdk/_version.py" + "src/whop_sdk/_version.py" ] } \ No newline at end of file diff --git a/scripts/lint b/scripts/lint index 83ac279b..8aa7eb94 100755 --- a/scripts/lint +++ b/scripts/lint @@ -8,4 +8,4 @@ echo "==> Running lints" rye run lint echo "==> Making sure it imports" -rye run python -c 'import whopsdk' +rye run python -c 'import whop_sdk' diff --git a/src/whopsdk/__init__.py b/src/whop_sdk/__init__.py similarity index 95% rename from src/whopsdk/__init__.py rename to src/whop_sdk/__init__.py index 983caeeb..20f3270e 100644 --- a/src/whopsdk/__init__.py +++ b/src/whop_sdk/__init__.py @@ -83,12 +83,12 @@ # Update the __module__ attribute for exported symbols so that # error messages point to this module instead of the module # it was originally defined in, e.g. -# whopsdk._exceptions.NotFoundError -> whopsdk.NotFoundError +# whop_sdk._exceptions.NotFoundError -> whop_sdk.NotFoundError __locals = locals() for __name in __all__: if not __name.startswith("__"): try: - __locals[__name].__module__ = "whopsdk" + __locals[__name].__module__ = "whop_sdk" except (TypeError, AttributeError): # Some of our exported symbols are builtins which we can't set attributes for. pass diff --git a/src/whopsdk/_base_client.py b/src/whop_sdk/_base_client.py similarity index 99% rename from src/whopsdk/_base_client.py rename to src/whop_sdk/_base_client.py index 69e782a6..cb03fc5a 100644 --- a/src/whopsdk/_base_client.py +++ b/src/whop_sdk/_base_client.py @@ -389,7 +389,7 @@ def __init__( if max_retries is None: # pyright: ignore[reportUnnecessaryComparison] raise TypeError( - "max_retries cannot be None. If you want to disable retries, pass `0`; if you want unlimited retries, pass `math.inf` or a very high number; if you want the default behavior, pass `whopsdk.DEFAULT_MAX_RETRIES`" + "max_retries cannot be None. If you want to disable retries, pass `0`; if you want unlimited retries, pass `math.inf` or a very high number; if you want the default behavior, pass `whop_sdk.DEFAULT_MAX_RETRIES`" ) def _enforce_trailing_slash(self, url: URL) -> URL: diff --git a/src/whopsdk/_client.py b/src/whop_sdk/_client.py similarity index 100% rename from src/whopsdk/_client.py rename to src/whop_sdk/_client.py diff --git a/src/whopsdk/_compat.py b/src/whop_sdk/_compat.py similarity index 100% rename from src/whopsdk/_compat.py rename to src/whop_sdk/_compat.py diff --git a/src/whopsdk/_constants.py b/src/whop_sdk/_constants.py similarity index 100% rename from src/whopsdk/_constants.py rename to src/whop_sdk/_constants.py diff --git a/src/whopsdk/_exceptions.py b/src/whop_sdk/_exceptions.py similarity index 100% rename from src/whopsdk/_exceptions.py rename to src/whop_sdk/_exceptions.py diff --git a/src/whopsdk/_files.py b/src/whop_sdk/_files.py similarity index 100% rename from src/whopsdk/_files.py rename to src/whop_sdk/_files.py diff --git a/src/whopsdk/_models.py b/src/whop_sdk/_models.py similarity index 100% rename from src/whopsdk/_models.py rename to src/whop_sdk/_models.py diff --git a/src/whopsdk/_qs.py b/src/whop_sdk/_qs.py similarity index 100% rename from src/whopsdk/_qs.py rename to src/whop_sdk/_qs.py diff --git a/src/whopsdk/_resource.py b/src/whop_sdk/_resource.py similarity index 100% rename from src/whopsdk/_resource.py rename to src/whop_sdk/_resource.py diff --git a/src/whopsdk/_response.py b/src/whop_sdk/_response.py similarity index 99% rename from src/whopsdk/_response.py rename to src/whop_sdk/_response.py index fe094a09..ea6a5009 100644 --- a/src/whopsdk/_response.py +++ b/src/whop_sdk/_response.py @@ -217,7 +217,7 @@ def _parse(self, *, to: type[_T] | None = None) -> R | _T: and not issubclass(origin, BaseModel) and issubclass(origin, pydantic.BaseModel) ): - raise TypeError("Pydantic models must subclass our base model type, e.g. `from whopsdk import BaseModel`") + raise TypeError("Pydantic models must subclass our base model type, e.g. `from whop_sdk import BaseModel`") if ( cast_to is not object @@ -283,7 +283,7 @@ def parse(self, *, to: type[_T] | None = None) -> R | _T: the `to` argument, e.g. ```py - from whopsdk import BaseModel + from whop_sdk import BaseModel class MyModel(BaseModel): @@ -385,7 +385,7 @@ async def parse(self, *, to: type[_T] | None = None) -> R | _T: the `to` argument, e.g. ```py - from whopsdk import BaseModel + from whop_sdk import BaseModel class MyModel(BaseModel): @@ -556,7 +556,7 @@ async def stream_to_file( class MissingStreamClassError(TypeError): def __init__(self) -> None: super().__init__( - "The `stream` argument was set to `True` but the `stream_cls` argument was not given. See `whopsdk._streaming` for reference", + "The `stream` argument was set to `True` but the `stream_cls` argument was not given. See `whop_sdk._streaming` for reference", ) diff --git a/src/whopsdk/_streaming.py b/src/whop_sdk/_streaming.py similarity index 100% rename from src/whopsdk/_streaming.py rename to src/whop_sdk/_streaming.py diff --git a/src/whopsdk/_types.py b/src/whop_sdk/_types.py similarity index 99% rename from src/whopsdk/_types.py rename to src/whop_sdk/_types.py index f4efa996..bff722fc 100644 --- a/src/whopsdk/_types.py +++ b/src/whop_sdk/_types.py @@ -92,7 +92,7 @@ # This unfortunately means that you will either have # to import this type and pass it explicitly: # -# from whopsdk import NoneType +# from whop_sdk import NoneType # client.get('/foo', cast_to=NoneType) # # or build it yourself: diff --git a/src/whopsdk/_utils/__init__.py b/src/whop_sdk/_utils/__init__.py similarity index 100% rename from src/whopsdk/_utils/__init__.py rename to src/whop_sdk/_utils/__init__.py diff --git a/src/whopsdk/_utils/_compat.py b/src/whop_sdk/_utils/_compat.py similarity index 100% rename from src/whopsdk/_utils/_compat.py rename to src/whop_sdk/_utils/_compat.py diff --git a/src/whopsdk/_utils/_datetime_parse.py b/src/whop_sdk/_utils/_datetime_parse.py similarity index 100% rename from src/whopsdk/_utils/_datetime_parse.py rename to src/whop_sdk/_utils/_datetime_parse.py diff --git a/src/whopsdk/_utils/_logs.py b/src/whop_sdk/_utils/_logs.py similarity index 76% rename from src/whopsdk/_utils/_logs.py rename to src/whop_sdk/_utils/_logs.py index f66e4efc..f82eedca 100644 --- a/src/whopsdk/_utils/_logs.py +++ b/src/whop_sdk/_utils/_logs.py @@ -1,12 +1,12 @@ import os import logging -logger: logging.Logger = logging.getLogger("whopsdk") +logger: logging.Logger = logging.getLogger("whop_sdk") httpx_logger: logging.Logger = logging.getLogger("httpx") def _basic_config() -> None: - # e.g. [2023-10-05 14:12:26 - whopsdk._base_client:818 - DEBUG] HTTP Request: POST http://127.0.0.1:4010/foo/bar "200 OK" + # e.g. [2023-10-05 14:12:26 - whop_sdk._base_client:818 - DEBUG] HTTP Request: POST http://127.0.0.1:4010/foo/bar "200 OK" logging.basicConfig( format="[%(asctime)s - %(name)s:%(lineno)d - %(levelname)s] %(message)s", datefmt="%Y-%m-%d %H:%M:%S", diff --git a/src/whopsdk/_utils/_proxy.py b/src/whop_sdk/_utils/_proxy.py similarity index 100% rename from src/whopsdk/_utils/_proxy.py rename to src/whop_sdk/_utils/_proxy.py diff --git a/src/whopsdk/_utils/_reflection.py b/src/whop_sdk/_utils/_reflection.py similarity index 100% rename from src/whopsdk/_utils/_reflection.py rename to src/whop_sdk/_utils/_reflection.py diff --git a/src/whopsdk/_utils/_resources_proxy.py b/src/whop_sdk/_utils/_resources_proxy.py similarity index 52% rename from src/whopsdk/_utils/_resources_proxy.py rename to src/whop_sdk/_utils/_resources_proxy.py index 85fa6320..c921f32c 100644 --- a/src/whopsdk/_utils/_resources_proxy.py +++ b/src/whop_sdk/_utils/_resources_proxy.py @@ -7,17 +7,17 @@ class ResourcesProxy(LazyProxy[Any]): - """A proxy for the `whopsdk.resources` module. + """A proxy for the `whop_sdk.resources` module. - This is used so that we can lazily import `whopsdk.resources` only when - needed *and* so that users can just import `whopsdk` and reference `whopsdk.resources` + This is used so that we can lazily import `whop_sdk.resources` only when + needed *and* so that users can just import `whop_sdk` and reference `whop_sdk.resources` """ @override def __load__(self) -> Any: import importlib - mod = importlib.import_module("whopsdk.resources") + mod = importlib.import_module("whop_sdk.resources") return mod diff --git a/src/whopsdk/_utils/_streams.py b/src/whop_sdk/_utils/_streams.py similarity index 100% rename from src/whopsdk/_utils/_streams.py rename to src/whop_sdk/_utils/_streams.py diff --git a/src/whopsdk/_utils/_sync.py b/src/whop_sdk/_utils/_sync.py similarity index 100% rename from src/whopsdk/_utils/_sync.py rename to src/whop_sdk/_utils/_sync.py diff --git a/src/whopsdk/_utils/_transform.py b/src/whop_sdk/_utils/_transform.py similarity index 100% rename from src/whopsdk/_utils/_transform.py rename to src/whop_sdk/_utils/_transform.py diff --git a/src/whopsdk/_utils/_typing.py b/src/whop_sdk/_utils/_typing.py similarity index 100% rename from src/whopsdk/_utils/_typing.py rename to src/whop_sdk/_utils/_typing.py diff --git a/src/whopsdk/_utils/_utils.py b/src/whop_sdk/_utils/_utils.py similarity index 100% rename from src/whopsdk/_utils/_utils.py rename to src/whop_sdk/_utils/_utils.py diff --git a/src/whopsdk/_version.py b/src/whop_sdk/_version.py similarity index 85% rename from src/whopsdk/_version.py rename to src/whop_sdk/_version.py index 5a479d33..35444f45 100644 --- a/src/whopsdk/_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__ = "whopsdk" +__title__ = "whop_sdk" __version__ = "0.0.1" # x-release-please-version diff --git a/src/whop_sdk/lib/.keep b/src/whop_sdk/lib/.keep new file mode 100644 index 00000000..5e2c99fd --- /dev/null +++ b/src/whop_sdk/lib/.keep @@ -0,0 +1,4 @@ +File generated from our OpenAPI spec by Stainless. + +This directory can be used to store custom files to expand the SDK. +It is ignored by Stainless code generation and its content (other than this keep file) won't be touched. \ No newline at end of file diff --git a/src/whopsdk/pagination.py b/src/whop_sdk/pagination.py similarity index 100% rename from src/whopsdk/pagination.py rename to src/whop_sdk/pagination.py diff --git a/src/whopsdk/py.typed b/src/whop_sdk/py.typed similarity index 100% rename from src/whopsdk/py.typed rename to src/whop_sdk/py.typed diff --git a/src/whopsdk/resources/__init__.py b/src/whop_sdk/resources/__init__.py similarity index 100% rename from src/whopsdk/resources/__init__.py rename to src/whop_sdk/resources/__init__.py diff --git a/src/whopsdk/resources/app_builds.py b/src/whop_sdk/resources/app_builds.py similarity index 100% rename from src/whopsdk/resources/app_builds.py rename to src/whop_sdk/resources/app_builds.py diff --git a/src/whopsdk/resources/apps.py b/src/whop_sdk/resources/apps.py similarity index 100% rename from src/whopsdk/resources/apps.py rename to src/whop_sdk/resources/apps.py diff --git a/src/whopsdk/resources/authorized_users.py b/src/whop_sdk/resources/authorized_users.py similarity index 100% rename from src/whopsdk/resources/authorized_users.py rename to src/whop_sdk/resources/authorized_users.py diff --git a/src/whopsdk/resources/chat_channels.py b/src/whop_sdk/resources/chat_channels.py similarity index 100% rename from src/whopsdk/resources/chat_channels.py rename to src/whop_sdk/resources/chat_channels.py diff --git a/src/whopsdk/resources/checkout_configurations.py b/src/whop_sdk/resources/checkout_configurations.py similarity index 100% rename from src/whopsdk/resources/checkout_configurations.py rename to src/whop_sdk/resources/checkout_configurations.py diff --git a/src/whopsdk/resources/companies.py b/src/whop_sdk/resources/companies.py similarity index 100% rename from src/whopsdk/resources/companies.py rename to src/whop_sdk/resources/companies.py diff --git a/src/whopsdk/resources/course_lesson_interactions.py b/src/whop_sdk/resources/course_lesson_interactions.py similarity index 100% rename from src/whopsdk/resources/course_lesson_interactions.py rename to src/whop_sdk/resources/course_lesson_interactions.py diff --git a/src/whopsdk/resources/entries.py b/src/whop_sdk/resources/entries.py similarity index 100% rename from src/whopsdk/resources/entries.py rename to src/whop_sdk/resources/entries.py diff --git a/src/whopsdk/resources/experiences.py b/src/whop_sdk/resources/experiences.py similarity index 100% rename from src/whopsdk/resources/experiences.py rename to src/whop_sdk/resources/experiences.py diff --git a/src/whopsdk/resources/forum_posts.py b/src/whop_sdk/resources/forum_posts.py similarity index 100% rename from src/whopsdk/resources/forum_posts.py rename to src/whop_sdk/resources/forum_posts.py diff --git a/src/whopsdk/resources/invoices.py b/src/whop_sdk/resources/invoices.py similarity index 100% rename from src/whopsdk/resources/invoices.py rename to src/whop_sdk/resources/invoices.py diff --git a/src/whopsdk/resources/ledger_accounts.py b/src/whop_sdk/resources/ledger_accounts.py similarity index 100% rename from src/whopsdk/resources/ledger_accounts.py rename to src/whop_sdk/resources/ledger_accounts.py diff --git a/src/whopsdk/resources/memberships.py b/src/whop_sdk/resources/memberships.py similarity index 100% rename from src/whopsdk/resources/memberships.py rename to src/whop_sdk/resources/memberships.py diff --git a/src/whopsdk/resources/messages.py b/src/whop_sdk/resources/messages.py similarity index 100% rename from src/whopsdk/resources/messages.py rename to src/whop_sdk/resources/messages.py diff --git a/src/whopsdk/resources/payments.py b/src/whop_sdk/resources/payments.py similarity index 100% rename from src/whopsdk/resources/payments.py rename to src/whop_sdk/resources/payments.py diff --git a/src/whopsdk/resources/plans.py b/src/whop_sdk/resources/plans.py similarity index 100% rename from src/whopsdk/resources/plans.py rename to src/whop_sdk/resources/plans.py diff --git a/src/whopsdk/resources/products.py b/src/whop_sdk/resources/products.py similarity index 100% rename from src/whopsdk/resources/products.py rename to src/whop_sdk/resources/products.py diff --git a/src/whopsdk/resources/reactions.py b/src/whop_sdk/resources/reactions.py similarity index 100% rename from src/whopsdk/resources/reactions.py rename to src/whop_sdk/resources/reactions.py diff --git a/src/whopsdk/resources/shipments.py b/src/whop_sdk/resources/shipments.py similarity index 100% rename from src/whopsdk/resources/shipments.py rename to src/whop_sdk/resources/shipments.py diff --git a/src/whopsdk/resources/support_channels.py b/src/whop_sdk/resources/support_channels.py similarity index 100% rename from src/whopsdk/resources/support_channels.py rename to src/whop_sdk/resources/support_channels.py diff --git a/src/whopsdk/resources/transfers.py b/src/whop_sdk/resources/transfers.py similarity index 100% rename from src/whopsdk/resources/transfers.py rename to src/whop_sdk/resources/transfers.py diff --git a/src/whopsdk/resources/users.py b/src/whop_sdk/resources/users.py similarity index 100% rename from src/whopsdk/resources/users.py rename to src/whop_sdk/resources/users.py diff --git a/src/whopsdk/resources/webhooks.py b/src/whop_sdk/resources/webhooks.py similarity index 100% rename from src/whopsdk/resources/webhooks.py rename to src/whop_sdk/resources/webhooks.py diff --git a/src/whopsdk/types/__init__.py b/src/whop_sdk/types/__init__.py similarity index 100% rename from src/whopsdk/types/__init__.py rename to src/whop_sdk/types/__init__.py diff --git a/src/whopsdk/types/app_build_create_params.py b/src/whop_sdk/types/app_build_create_params.py similarity index 100% rename from src/whopsdk/types/app_build_create_params.py rename to src/whop_sdk/types/app_build_create_params.py diff --git a/src/whopsdk/types/app_build_list_params.py b/src/whop_sdk/types/app_build_list_params.py similarity index 100% rename from src/whopsdk/types/app_build_list_params.py rename to src/whop_sdk/types/app_build_list_params.py diff --git a/src/whopsdk/types/app_build_list_response.py b/src/whop_sdk/types/app_build_list_response.py similarity index 100% rename from src/whopsdk/types/app_build_list_response.py rename to src/whop_sdk/types/app_build_list_response.py diff --git a/src/whopsdk/types/app_create_params.py b/src/whop_sdk/types/app_create_params.py similarity index 100% rename from src/whopsdk/types/app_create_params.py rename to src/whop_sdk/types/app_create_params.py diff --git a/src/whopsdk/types/app_list_params.py b/src/whop_sdk/types/app_list_params.py similarity index 100% rename from src/whopsdk/types/app_list_params.py rename to src/whop_sdk/types/app_list_params.py diff --git a/src/whopsdk/types/app_list_response.py b/src/whop_sdk/types/app_list_response.py similarity index 100% rename from src/whopsdk/types/app_list_response.py rename to src/whop_sdk/types/app_list_response.py diff --git a/src/whopsdk/types/app_update_params.py b/src/whop_sdk/types/app_update_params.py similarity index 100% rename from src/whopsdk/types/app_update_params.py rename to src/whop_sdk/types/app_update_params.py diff --git a/src/whopsdk/types/authorized_user_list_params.py b/src/whop_sdk/types/authorized_user_list_params.py similarity index 100% rename from src/whopsdk/types/authorized_user_list_params.py rename to src/whop_sdk/types/authorized_user_list_params.py diff --git a/src/whopsdk/types/authorized_user_list_response.py b/src/whop_sdk/types/authorized_user_list_response.py similarity index 100% rename from src/whopsdk/types/authorized_user_list_response.py rename to src/whop_sdk/types/authorized_user_list_response.py diff --git a/src/whopsdk/types/authorized_user_retrieve_response.py b/src/whop_sdk/types/authorized_user_retrieve_response.py similarity index 100% rename from src/whopsdk/types/authorized_user_retrieve_response.py rename to src/whop_sdk/types/authorized_user_retrieve_response.py diff --git a/src/whopsdk/types/chat_channel_list_params.py b/src/whop_sdk/types/chat_channel_list_params.py similarity index 100% rename from src/whopsdk/types/chat_channel_list_params.py rename to src/whop_sdk/types/chat_channel_list_params.py diff --git a/src/whopsdk/types/chat_channel_list_response.py b/src/whop_sdk/types/chat_channel_list_response.py similarity index 100% rename from src/whopsdk/types/chat_channel_list_response.py rename to src/whop_sdk/types/chat_channel_list_response.py diff --git a/src/whopsdk/types/chat_channel_update_params.py b/src/whop_sdk/types/chat_channel_update_params.py similarity index 100% rename from src/whopsdk/types/chat_channel_update_params.py rename to src/whop_sdk/types/chat_channel_update_params.py diff --git a/src/whopsdk/types/checkout_configuration_create_params.py b/src/whop_sdk/types/checkout_configuration_create_params.py similarity index 100% rename from src/whopsdk/types/checkout_configuration_create_params.py rename to src/whop_sdk/types/checkout_configuration_create_params.py diff --git a/src/whopsdk/types/checkout_configuration_list_params.py b/src/whop_sdk/types/checkout_configuration_list_params.py similarity index 100% rename from src/whopsdk/types/checkout_configuration_list_params.py rename to src/whop_sdk/types/checkout_configuration_list_params.py diff --git a/src/whopsdk/types/checkout_configuration_list_response.py b/src/whop_sdk/types/checkout_configuration_list_response.py similarity index 100% rename from src/whopsdk/types/checkout_configuration_list_response.py rename to src/whop_sdk/types/checkout_configuration_list_response.py diff --git a/src/whopsdk/types/course_lesson_interaction_list_params.py b/src/whop_sdk/types/course_lesson_interaction_list_params.py similarity index 100% rename from src/whopsdk/types/course_lesson_interaction_list_params.py rename to src/whop_sdk/types/course_lesson_interaction_list_params.py diff --git a/src/whopsdk/types/entry_approve_response.py b/src/whop_sdk/types/entry_approve_response.py similarity index 100% rename from src/whopsdk/types/entry_approve_response.py rename to src/whop_sdk/types/entry_approve_response.py diff --git a/src/whopsdk/types/entry_list_params.py b/src/whop_sdk/types/entry_list_params.py similarity index 100% rename from src/whopsdk/types/entry_list_params.py rename to src/whop_sdk/types/entry_list_params.py diff --git a/src/whopsdk/types/entry_list_response.py b/src/whop_sdk/types/entry_list_response.py similarity index 100% rename from src/whopsdk/types/entry_list_response.py rename to src/whop_sdk/types/entry_list_response.py diff --git a/src/whopsdk/types/experience_attach_params.py b/src/whop_sdk/types/experience_attach_params.py similarity index 100% rename from src/whopsdk/types/experience_attach_params.py rename to src/whop_sdk/types/experience_attach_params.py diff --git a/src/whopsdk/types/experience_create_params.py b/src/whop_sdk/types/experience_create_params.py similarity index 100% rename from src/whopsdk/types/experience_create_params.py rename to src/whop_sdk/types/experience_create_params.py diff --git a/src/whopsdk/types/experience_delete_response.py b/src/whop_sdk/types/experience_delete_response.py similarity index 100% rename from src/whopsdk/types/experience_delete_response.py rename to src/whop_sdk/types/experience_delete_response.py diff --git a/src/whopsdk/types/experience_detach_params.py b/src/whop_sdk/types/experience_detach_params.py similarity index 100% rename from src/whopsdk/types/experience_detach_params.py rename to src/whop_sdk/types/experience_detach_params.py diff --git a/src/whopsdk/types/experience_list_params.py b/src/whop_sdk/types/experience_list_params.py similarity index 100% rename from src/whopsdk/types/experience_list_params.py rename to src/whop_sdk/types/experience_list_params.py diff --git a/src/whopsdk/types/experience_list_response.py b/src/whop_sdk/types/experience_list_response.py similarity index 100% rename from src/whopsdk/types/experience_list_response.py rename to src/whop_sdk/types/experience_list_response.py diff --git a/src/whopsdk/types/experience_update_params.py b/src/whop_sdk/types/experience_update_params.py similarity index 100% rename from src/whopsdk/types/experience_update_params.py rename to src/whop_sdk/types/experience_update_params.py diff --git a/src/whopsdk/types/forum_post_create_params.py b/src/whop_sdk/types/forum_post_create_params.py similarity index 100% rename from src/whopsdk/types/forum_post_create_params.py rename to src/whop_sdk/types/forum_post_create_params.py diff --git a/src/whopsdk/types/forum_post_list_params.py b/src/whop_sdk/types/forum_post_list_params.py similarity index 100% rename from src/whopsdk/types/forum_post_list_params.py rename to src/whop_sdk/types/forum_post_list_params.py diff --git a/src/whopsdk/types/forum_post_list_response.py b/src/whop_sdk/types/forum_post_list_response.py similarity index 100% rename from src/whopsdk/types/forum_post_list_response.py rename to src/whop_sdk/types/forum_post_list_response.py diff --git a/src/whopsdk/types/invoice_create_params.py b/src/whop_sdk/types/invoice_create_params.py similarity index 100% rename from src/whopsdk/types/invoice_create_params.py rename to src/whop_sdk/types/invoice_create_params.py diff --git a/src/whopsdk/types/invoice_create_response.py b/src/whop_sdk/types/invoice_create_response.py similarity index 100% rename from src/whopsdk/types/invoice_create_response.py rename to src/whop_sdk/types/invoice_create_response.py diff --git a/src/whopsdk/types/invoice_created_webhook_event.py b/src/whop_sdk/types/invoice_created_webhook_event.py similarity index 100% rename from src/whopsdk/types/invoice_created_webhook_event.py rename to src/whop_sdk/types/invoice_created_webhook_event.py diff --git a/src/whopsdk/types/invoice_list_params.py b/src/whop_sdk/types/invoice_list_params.py similarity index 100% rename from src/whopsdk/types/invoice_list_params.py rename to src/whop_sdk/types/invoice_list_params.py diff --git a/src/whopsdk/types/invoice_paid_webhook_event.py b/src/whop_sdk/types/invoice_paid_webhook_event.py similarity index 100% rename from src/whopsdk/types/invoice_paid_webhook_event.py rename to src/whop_sdk/types/invoice_paid_webhook_event.py diff --git a/src/whopsdk/types/invoice_past_due_webhook_event.py b/src/whop_sdk/types/invoice_past_due_webhook_event.py similarity index 100% rename from src/whopsdk/types/invoice_past_due_webhook_event.py rename to src/whop_sdk/types/invoice_past_due_webhook_event.py diff --git a/src/whopsdk/types/invoice_void_response.py b/src/whop_sdk/types/invoice_void_response.py similarity index 100% rename from src/whopsdk/types/invoice_void_response.py rename to src/whop_sdk/types/invoice_void_response.py diff --git a/src/whopsdk/types/invoice_voided_webhook_event.py b/src/whop_sdk/types/invoice_voided_webhook_event.py similarity index 100% rename from src/whopsdk/types/invoice_voided_webhook_event.py rename to src/whop_sdk/types/invoice_voided_webhook_event.py diff --git a/src/whopsdk/types/ledger_account_retrieve_response.py b/src/whop_sdk/types/ledger_account_retrieve_response.py similarity index 100% rename from src/whopsdk/types/ledger_account_retrieve_response.py rename to src/whop_sdk/types/ledger_account_retrieve_response.py diff --git a/src/whopsdk/types/membership_cancel_params.py b/src/whop_sdk/types/membership_cancel_params.py similarity index 100% rename from src/whopsdk/types/membership_cancel_params.py rename to src/whop_sdk/types/membership_cancel_params.py diff --git a/src/whopsdk/types/membership_list_params.py b/src/whop_sdk/types/membership_list_params.py similarity index 100% rename from src/whopsdk/types/membership_list_params.py rename to src/whop_sdk/types/membership_list_params.py diff --git a/src/whopsdk/types/membership_list_response.py b/src/whop_sdk/types/membership_list_response.py similarity index 100% rename from src/whopsdk/types/membership_list_response.py rename to src/whop_sdk/types/membership_list_response.py diff --git a/src/whopsdk/types/membership_pause_params.py b/src/whop_sdk/types/membership_pause_params.py similarity index 100% rename from src/whopsdk/types/membership_pause_params.py rename to src/whop_sdk/types/membership_pause_params.py diff --git a/src/whopsdk/types/membership_update_params.py b/src/whop_sdk/types/membership_update_params.py similarity index 100% rename from src/whopsdk/types/membership_update_params.py rename to src/whop_sdk/types/membership_update_params.py diff --git a/src/whopsdk/types/message_create_params.py b/src/whop_sdk/types/message_create_params.py similarity index 100% rename from src/whopsdk/types/message_create_params.py rename to src/whop_sdk/types/message_create_params.py diff --git a/src/whopsdk/types/message_list_params.py b/src/whop_sdk/types/message_list_params.py similarity index 100% rename from src/whopsdk/types/message_list_params.py rename to src/whop_sdk/types/message_list_params.py diff --git a/src/whopsdk/types/message_list_response.py b/src/whop_sdk/types/message_list_response.py similarity index 100% rename from src/whopsdk/types/message_list_response.py rename to src/whop_sdk/types/message_list_response.py diff --git a/src/whopsdk/types/payment_list_params.py b/src/whop_sdk/types/payment_list_params.py similarity index 100% rename from src/whopsdk/types/payment_list_params.py rename to src/whop_sdk/types/payment_list_params.py diff --git a/src/whopsdk/types/payment_list_response.py b/src/whop_sdk/types/payment_list_response.py similarity index 100% rename from src/whopsdk/types/payment_list_response.py rename to src/whop_sdk/types/payment_list_response.py diff --git a/src/whopsdk/types/payment_refund_params.py b/src/whop_sdk/types/payment_refund_params.py similarity index 100% rename from src/whopsdk/types/payment_refund_params.py rename to src/whop_sdk/types/payment_refund_params.py diff --git a/src/whopsdk/types/plan_create_params.py b/src/whop_sdk/types/plan_create_params.py similarity index 100% rename from src/whopsdk/types/plan_create_params.py rename to src/whop_sdk/types/plan_create_params.py diff --git a/src/whopsdk/types/plan_delete_response.py b/src/whop_sdk/types/plan_delete_response.py similarity index 100% rename from src/whopsdk/types/plan_delete_response.py rename to src/whop_sdk/types/plan_delete_response.py diff --git a/src/whopsdk/types/plan_list_params.py b/src/whop_sdk/types/plan_list_params.py similarity index 100% rename from src/whopsdk/types/plan_list_params.py rename to src/whop_sdk/types/plan_list_params.py diff --git a/src/whopsdk/types/plan_list_response.py b/src/whop_sdk/types/plan_list_response.py similarity index 100% rename from src/whopsdk/types/plan_list_response.py rename to src/whop_sdk/types/plan_list_response.py diff --git a/src/whopsdk/types/plan_update_params.py b/src/whop_sdk/types/plan_update_params.py similarity index 100% rename from src/whopsdk/types/plan_update_params.py rename to src/whop_sdk/types/plan_update_params.py diff --git a/src/whopsdk/types/product_create_params.py b/src/whop_sdk/types/product_create_params.py similarity index 100% rename from src/whopsdk/types/product_create_params.py rename to src/whop_sdk/types/product_create_params.py diff --git a/src/whopsdk/types/product_delete_response.py b/src/whop_sdk/types/product_delete_response.py similarity index 100% rename from src/whopsdk/types/product_delete_response.py rename to src/whop_sdk/types/product_delete_response.py diff --git a/src/whopsdk/types/product_list_params.py b/src/whop_sdk/types/product_list_params.py similarity index 100% rename from src/whopsdk/types/product_list_params.py rename to src/whop_sdk/types/product_list_params.py diff --git a/src/whopsdk/types/product_update_params.py b/src/whop_sdk/types/product_update_params.py similarity index 100% rename from src/whopsdk/types/product_update_params.py rename to src/whop_sdk/types/product_update_params.py diff --git a/src/whopsdk/types/reaction_create_params.py b/src/whop_sdk/types/reaction_create_params.py similarity index 100% rename from src/whopsdk/types/reaction_create_params.py rename to src/whop_sdk/types/reaction_create_params.py diff --git a/src/whopsdk/types/reaction_list_params.py b/src/whop_sdk/types/reaction_list_params.py similarity index 100% rename from src/whopsdk/types/reaction_list_params.py rename to src/whop_sdk/types/reaction_list_params.py diff --git a/src/whopsdk/types/reaction_list_response.py b/src/whop_sdk/types/reaction_list_response.py similarity index 100% rename from src/whopsdk/types/reaction_list_response.py rename to src/whop_sdk/types/reaction_list_response.py diff --git a/src/whopsdk/types/shared/__init__.py b/src/whop_sdk/types/shared/__init__.py similarity index 100% rename from src/whopsdk/types/shared/__init__.py rename to src/whop_sdk/types/shared/__init__.py diff --git a/src/whopsdk/types/shared/access_pass_type.py b/src/whop_sdk/types/shared/access_pass_type.py similarity index 100% rename from src/whopsdk/types/shared/access_pass_type.py rename to src/whop_sdk/types/shared/access_pass_type.py diff --git a/src/whopsdk/types/shared/app.py b/src/whop_sdk/types/shared/app.py similarity index 100% rename from src/whopsdk/types/shared/app.py rename to src/whop_sdk/types/shared/app.py diff --git a/src/whopsdk/types/shared/app_build.py b/src/whop_sdk/types/shared/app_build.py similarity index 100% rename from src/whopsdk/types/shared/app_build.py rename to src/whop_sdk/types/shared/app_build.py diff --git a/src/whopsdk/types/shared/app_build_platforms.py b/src/whop_sdk/types/shared/app_build_platforms.py similarity index 100% rename from src/whopsdk/types/shared/app_build_platforms.py rename to src/whop_sdk/types/shared/app_build_platforms.py diff --git a/src/whopsdk/types/shared/app_build_statuses.py b/src/whop_sdk/types/shared/app_build_statuses.py similarity index 100% rename from src/whopsdk/types/shared/app_build_statuses.py rename to src/whop_sdk/types/shared/app_build_statuses.py diff --git a/src/whopsdk/types/shared/app_statuses.py b/src/whop_sdk/types/shared/app_statuses.py similarity index 100% rename from src/whopsdk/types/shared/app_statuses.py rename to src/whop_sdk/types/shared/app_statuses.py diff --git a/src/whopsdk/types/shared/app_view_type.py b/src/whop_sdk/types/shared/app_view_type.py similarity index 100% rename from src/whopsdk/types/shared/app_view_type.py rename to src/whop_sdk/types/shared/app_view_type.py diff --git a/src/whopsdk/types/shared/authorized_user_roles.py b/src/whop_sdk/types/shared/authorized_user_roles.py similarity index 100% rename from src/whopsdk/types/shared/authorized_user_roles.py rename to src/whop_sdk/types/shared/authorized_user_roles.py diff --git a/src/whopsdk/types/shared/business_types.py b/src/whop_sdk/types/shared/business_types.py similarity index 100% rename from src/whopsdk/types/shared/business_types.py rename to src/whop_sdk/types/shared/business_types.py diff --git a/src/whopsdk/types/shared/chat_channel.py b/src/whop_sdk/types/shared/chat_channel.py similarity index 100% rename from src/whopsdk/types/shared/chat_channel.py rename to src/whop_sdk/types/shared/chat_channel.py diff --git a/src/whopsdk/types/shared/checkout_configuration.py b/src/whop_sdk/types/shared/checkout_configuration.py similarity index 100% rename from src/whopsdk/types/shared/checkout_configuration.py rename to src/whop_sdk/types/shared/checkout_configuration.py diff --git a/src/whopsdk/types/shared/collection_method.py b/src/whop_sdk/types/shared/collection_method.py similarity index 100% rename from src/whopsdk/types/shared/collection_method.py rename to src/whop_sdk/types/shared/collection_method.py diff --git a/src/whopsdk/types/shared/company.py b/src/whop_sdk/types/shared/company.py similarity index 100% rename from src/whopsdk/types/shared/company.py rename to src/whop_sdk/types/shared/company.py diff --git a/src/whopsdk/types/shared/course_lesson_interaction.py b/src/whop_sdk/types/shared/course_lesson_interaction.py similarity index 100% rename from src/whopsdk/types/shared/course_lesson_interaction.py rename to src/whop_sdk/types/shared/course_lesson_interaction.py diff --git a/src/whopsdk/types/shared/course_lesson_interaction_list_item.py b/src/whop_sdk/types/shared/course_lesson_interaction_list_item.py similarity index 100% rename from src/whopsdk/types/shared/course_lesson_interaction_list_item.py rename to src/whop_sdk/types/shared/course_lesson_interaction_list_item.py diff --git a/src/whopsdk/types/shared/currency.py b/src/whop_sdk/types/shared/currency.py similarity index 100% rename from src/whopsdk/types/shared/currency.py rename to src/whop_sdk/types/shared/currency.py diff --git a/src/whopsdk/types/shared/custom_cta.py b/src/whop_sdk/types/shared/custom_cta.py similarity index 100% rename from src/whopsdk/types/shared/custom_cta.py rename to src/whop_sdk/types/shared/custom_cta.py diff --git a/src/whopsdk/types/shared/direction.py b/src/whop_sdk/types/shared/direction.py similarity index 100% rename from src/whopsdk/types/shared/direction.py rename to src/whop_sdk/types/shared/direction.py diff --git a/src/whopsdk/types/shared/dms_post_types.py b/src/whop_sdk/types/shared/dms_post_types.py similarity index 100% rename from src/whopsdk/types/shared/dms_post_types.py rename to src/whop_sdk/types/shared/dms_post_types.py diff --git a/src/whopsdk/types/shared/entry.py b/src/whop_sdk/types/shared/entry.py similarity index 100% rename from src/whopsdk/types/shared/entry.py rename to src/whop_sdk/types/shared/entry.py diff --git a/src/whopsdk/types/shared/entry_status.py b/src/whop_sdk/types/shared/entry_status.py similarity index 100% rename from src/whopsdk/types/shared/entry_status.py rename to src/whop_sdk/types/shared/entry_status.py diff --git a/src/whopsdk/types/shared/experience.py b/src/whop_sdk/types/shared/experience.py similarity index 100% rename from src/whopsdk/types/shared/experience.py rename to src/whop_sdk/types/shared/experience.py diff --git a/src/whopsdk/types/shared/forum_post.py b/src/whop_sdk/types/shared/forum_post.py similarity index 100% rename from src/whopsdk/types/shared/forum_post.py rename to src/whop_sdk/types/shared/forum_post.py diff --git a/src/whopsdk/types/shared/friendly_receipt_status.py b/src/whop_sdk/types/shared/friendly_receipt_status.py similarity index 100% rename from src/whopsdk/types/shared/friendly_receipt_status.py rename to src/whop_sdk/types/shared/friendly_receipt_status.py diff --git a/src/whopsdk/types/shared/global_affiliate_status.py b/src/whop_sdk/types/shared/global_affiliate_status.py similarity index 100% rename from src/whopsdk/types/shared/global_affiliate_status.py rename to src/whop_sdk/types/shared/global_affiliate_status.py diff --git a/src/whopsdk/types/shared/industry_types.py b/src/whop_sdk/types/shared/industry_types.py similarity index 100% rename from src/whopsdk/types/shared/industry_types.py rename to src/whop_sdk/types/shared/industry_types.py diff --git a/src/whopsdk/types/shared/invoice.py b/src/whop_sdk/types/shared/invoice.py similarity index 100% rename from src/whopsdk/types/shared/invoice.py rename to src/whop_sdk/types/shared/invoice.py diff --git a/src/whopsdk/types/shared/invoice_list_item.py b/src/whop_sdk/types/shared/invoice_list_item.py similarity index 100% rename from src/whopsdk/types/shared/invoice_list_item.py rename to src/whop_sdk/types/shared/invoice_list_item.py diff --git a/src/whopsdk/types/shared/invoice_status.py b/src/whop_sdk/types/shared/invoice_status.py similarity index 100% rename from src/whopsdk/types/shared/invoice_status.py rename to src/whop_sdk/types/shared/invoice_status.py diff --git a/src/whopsdk/types/shared/membership.py b/src/whop_sdk/types/shared/membership.py similarity index 100% rename from src/whopsdk/types/shared/membership.py rename to src/whop_sdk/types/shared/membership.py diff --git a/src/whopsdk/types/shared/membership_status.py b/src/whop_sdk/types/shared/membership_status.py similarity index 100% rename from src/whopsdk/types/shared/membership_status.py rename to src/whop_sdk/types/shared/membership_status.py diff --git a/src/whopsdk/types/shared/message.py b/src/whop_sdk/types/shared/message.py similarity index 100% rename from src/whopsdk/types/shared/message.py rename to src/whop_sdk/types/shared/message.py diff --git a/src/whopsdk/types/shared/page_info.py b/src/whop_sdk/types/shared/page_info.py similarity index 100% rename from src/whopsdk/types/shared/page_info.py rename to src/whop_sdk/types/shared/page_info.py diff --git a/src/whopsdk/types/shared/payment.py b/src/whop_sdk/types/shared/payment.py similarity index 100% rename from src/whopsdk/types/shared/payment.py rename to src/whop_sdk/types/shared/payment.py diff --git a/src/whopsdk/types/shared/plan.py b/src/whop_sdk/types/shared/plan.py similarity index 100% rename from src/whopsdk/types/shared/plan.py rename to src/whop_sdk/types/shared/plan.py diff --git a/src/whopsdk/types/shared/plan_type.py b/src/whop_sdk/types/shared/plan_type.py similarity index 100% rename from src/whopsdk/types/shared/plan_type.py rename to src/whop_sdk/types/shared/plan_type.py diff --git a/src/whopsdk/types/shared/product.py b/src/whop_sdk/types/shared/product.py similarity index 100% rename from src/whopsdk/types/shared/product.py rename to src/whop_sdk/types/shared/product.py diff --git a/src/whopsdk/types/shared/product_list_item.py b/src/whop_sdk/types/shared/product_list_item.py similarity index 100% rename from src/whopsdk/types/shared/product_list_item.py rename to src/whop_sdk/types/shared/product_list_item.py diff --git a/src/whopsdk/types/shared/promo_type.py b/src/whop_sdk/types/shared/promo_type.py similarity index 100% rename from src/whopsdk/types/shared/promo_type.py rename to src/whop_sdk/types/shared/promo_type.py diff --git a/src/whopsdk/types/shared/reaction.py b/src/whop_sdk/types/shared/reaction.py similarity index 100% rename from src/whopsdk/types/shared/reaction.py rename to src/whop_sdk/types/shared/reaction.py diff --git a/src/whopsdk/types/shared/receipt_status.py b/src/whop_sdk/types/shared/receipt_status.py similarity index 100% rename from src/whopsdk/types/shared/receipt_status.py rename to src/whop_sdk/types/shared/receipt_status.py diff --git a/src/whopsdk/types/shared/release_method.py b/src/whop_sdk/types/shared/release_method.py similarity index 100% rename from src/whopsdk/types/shared/release_method.py rename to src/whop_sdk/types/shared/release_method.py diff --git a/src/whopsdk/types/shared/shipment.py b/src/whop_sdk/types/shared/shipment.py similarity index 100% rename from src/whopsdk/types/shared/shipment.py rename to src/whop_sdk/types/shared/shipment.py diff --git a/src/whopsdk/types/shared/shipment_carrier.py b/src/whop_sdk/types/shared/shipment_carrier.py similarity index 100% rename from src/whopsdk/types/shared/shipment_carrier.py rename to src/whop_sdk/types/shared/shipment_carrier.py diff --git a/src/whopsdk/types/shared/shipment_status.py b/src/whop_sdk/types/shared/shipment_status.py similarity index 100% rename from src/whopsdk/types/shared/shipment_status.py rename to src/whop_sdk/types/shared/shipment_status.py diff --git a/src/whopsdk/types/shared/shipment_substatus.py b/src/whop_sdk/types/shared/shipment_substatus.py similarity index 100% rename from src/whopsdk/types/shared/shipment_substatus.py rename to src/whop_sdk/types/shared/shipment_substatus.py diff --git a/src/whopsdk/types/shared/support_channel.py b/src/whop_sdk/types/shared/support_channel.py similarity index 100% rename from src/whopsdk/types/shared/support_channel.py rename to src/whop_sdk/types/shared/support_channel.py diff --git a/src/whopsdk/types/shared/tax_type.py b/src/whop_sdk/types/shared/tax_type.py similarity index 100% rename from src/whopsdk/types/shared/tax_type.py rename to src/whop_sdk/types/shared/tax_type.py diff --git a/src/whopsdk/types/shared/transfer.py b/src/whop_sdk/types/shared/transfer.py similarity index 100% rename from src/whopsdk/types/shared/transfer.py rename to src/whop_sdk/types/shared/transfer.py diff --git a/src/whopsdk/types/shared/visibility.py b/src/whop_sdk/types/shared/visibility.py similarity index 100% rename from src/whopsdk/types/shared/visibility.py rename to src/whop_sdk/types/shared/visibility.py diff --git a/src/whopsdk/types/shared/visibility_filter.py b/src/whop_sdk/types/shared/visibility_filter.py similarity index 100% rename from src/whopsdk/types/shared/visibility_filter.py rename to src/whop_sdk/types/shared/visibility_filter.py diff --git a/src/whopsdk/types/shared/who_can_post.py b/src/whop_sdk/types/shared/who_can_post.py similarity index 100% rename from src/whopsdk/types/shared/who_can_post.py rename to src/whop_sdk/types/shared/who_can_post.py diff --git a/src/whopsdk/types/shared/who_can_react.py b/src/whop_sdk/types/shared/who_can_react.py similarity index 100% rename from src/whopsdk/types/shared/who_can_react.py rename to src/whop_sdk/types/shared/who_can_react.py diff --git a/src/whopsdk/types/shared_params/__init__.py b/src/whop_sdk/types/shared_params/__init__.py similarity index 100% rename from src/whopsdk/types/shared_params/__init__.py rename to src/whop_sdk/types/shared_params/__init__.py diff --git a/src/whopsdk/types/shared_params/access_pass_type.py b/src/whop_sdk/types/shared_params/access_pass_type.py similarity index 100% rename from src/whopsdk/types/shared_params/access_pass_type.py rename to src/whop_sdk/types/shared_params/access_pass_type.py diff --git a/src/whopsdk/types/shared_params/app_build_platforms.py b/src/whop_sdk/types/shared_params/app_build_platforms.py similarity index 100% rename from src/whopsdk/types/shared_params/app_build_platforms.py rename to src/whop_sdk/types/shared_params/app_build_platforms.py diff --git a/src/whopsdk/types/shared_params/app_build_statuses.py b/src/whop_sdk/types/shared_params/app_build_statuses.py similarity index 100% rename from src/whopsdk/types/shared_params/app_build_statuses.py rename to src/whop_sdk/types/shared_params/app_build_statuses.py diff --git a/src/whopsdk/types/shared_params/app_statuses.py b/src/whop_sdk/types/shared_params/app_statuses.py similarity index 100% rename from src/whopsdk/types/shared_params/app_statuses.py rename to src/whop_sdk/types/shared_params/app_statuses.py diff --git a/src/whopsdk/types/shared_params/app_view_type.py b/src/whop_sdk/types/shared_params/app_view_type.py similarity index 100% rename from src/whopsdk/types/shared_params/app_view_type.py rename to src/whop_sdk/types/shared_params/app_view_type.py diff --git a/src/whopsdk/types/shared_params/authorized_user_roles.py b/src/whop_sdk/types/shared_params/authorized_user_roles.py similarity index 100% rename from src/whopsdk/types/shared_params/authorized_user_roles.py rename to src/whop_sdk/types/shared_params/authorized_user_roles.py diff --git a/src/whopsdk/types/shared_params/business_types.py b/src/whop_sdk/types/shared_params/business_types.py similarity index 100% rename from src/whopsdk/types/shared_params/business_types.py rename to src/whop_sdk/types/shared_params/business_types.py diff --git a/src/whopsdk/types/shared_params/collection_method.py b/src/whop_sdk/types/shared_params/collection_method.py similarity index 100% rename from src/whopsdk/types/shared_params/collection_method.py rename to src/whop_sdk/types/shared_params/collection_method.py diff --git a/src/whopsdk/types/shared_params/currency.py b/src/whop_sdk/types/shared_params/currency.py similarity index 100% rename from src/whopsdk/types/shared_params/currency.py rename to src/whop_sdk/types/shared_params/currency.py diff --git a/src/whopsdk/types/shared_params/custom_cta.py b/src/whop_sdk/types/shared_params/custom_cta.py similarity index 100% rename from src/whopsdk/types/shared_params/custom_cta.py rename to src/whop_sdk/types/shared_params/custom_cta.py diff --git a/src/whopsdk/types/shared_params/direction.py b/src/whop_sdk/types/shared_params/direction.py similarity index 100% rename from src/whopsdk/types/shared_params/direction.py rename to src/whop_sdk/types/shared_params/direction.py diff --git a/src/whopsdk/types/shared_params/entry_status.py b/src/whop_sdk/types/shared_params/entry_status.py similarity index 100% rename from src/whopsdk/types/shared_params/entry_status.py rename to src/whop_sdk/types/shared_params/entry_status.py diff --git a/src/whopsdk/types/shared_params/friendly_receipt_status.py b/src/whop_sdk/types/shared_params/friendly_receipt_status.py similarity index 100% rename from src/whopsdk/types/shared_params/friendly_receipt_status.py rename to src/whop_sdk/types/shared_params/friendly_receipt_status.py diff --git a/src/whopsdk/types/shared_params/global_affiliate_status.py b/src/whop_sdk/types/shared_params/global_affiliate_status.py similarity index 100% rename from src/whopsdk/types/shared_params/global_affiliate_status.py rename to src/whop_sdk/types/shared_params/global_affiliate_status.py diff --git a/src/whopsdk/types/shared_params/industry_types.py b/src/whop_sdk/types/shared_params/industry_types.py similarity index 100% rename from src/whopsdk/types/shared_params/industry_types.py rename to src/whop_sdk/types/shared_params/industry_types.py diff --git a/src/whopsdk/types/shared_params/invoice_status.py b/src/whop_sdk/types/shared_params/invoice_status.py similarity index 100% rename from src/whopsdk/types/shared_params/invoice_status.py rename to src/whop_sdk/types/shared_params/invoice_status.py diff --git a/src/whopsdk/types/shared_params/membership_status.py b/src/whop_sdk/types/shared_params/membership_status.py similarity index 100% rename from src/whopsdk/types/shared_params/membership_status.py rename to src/whop_sdk/types/shared_params/membership_status.py diff --git a/src/whopsdk/types/shared_params/plan_type.py b/src/whop_sdk/types/shared_params/plan_type.py similarity index 100% rename from src/whopsdk/types/shared_params/plan_type.py rename to src/whop_sdk/types/shared_params/plan_type.py diff --git a/src/whopsdk/types/shared_params/receipt_status.py b/src/whop_sdk/types/shared_params/receipt_status.py similarity index 100% rename from src/whopsdk/types/shared_params/receipt_status.py rename to src/whop_sdk/types/shared_params/receipt_status.py diff --git a/src/whopsdk/types/shared_params/release_method.py b/src/whop_sdk/types/shared_params/release_method.py similarity index 100% rename from src/whopsdk/types/shared_params/release_method.py rename to src/whop_sdk/types/shared_params/release_method.py diff --git a/src/whopsdk/types/shared_params/tax_type.py b/src/whop_sdk/types/shared_params/tax_type.py similarity index 100% rename from src/whopsdk/types/shared_params/tax_type.py rename to src/whop_sdk/types/shared_params/tax_type.py diff --git a/src/whopsdk/types/shared_params/visibility.py b/src/whop_sdk/types/shared_params/visibility.py similarity index 100% rename from src/whopsdk/types/shared_params/visibility.py rename to src/whop_sdk/types/shared_params/visibility.py diff --git a/src/whopsdk/types/shared_params/visibility_filter.py b/src/whop_sdk/types/shared_params/visibility_filter.py similarity index 100% rename from src/whopsdk/types/shared_params/visibility_filter.py rename to src/whop_sdk/types/shared_params/visibility_filter.py diff --git a/src/whopsdk/types/shared_params/who_can_post.py b/src/whop_sdk/types/shared_params/who_can_post.py similarity index 100% rename from src/whopsdk/types/shared_params/who_can_post.py rename to src/whop_sdk/types/shared_params/who_can_post.py diff --git a/src/whopsdk/types/shared_params/who_can_react.py b/src/whop_sdk/types/shared_params/who_can_react.py similarity index 100% rename from src/whopsdk/types/shared_params/who_can_react.py rename to src/whop_sdk/types/shared_params/who_can_react.py diff --git a/src/whopsdk/types/shipment_create_params.py b/src/whop_sdk/types/shipment_create_params.py similarity index 100% rename from src/whopsdk/types/shipment_create_params.py rename to src/whop_sdk/types/shipment_create_params.py diff --git a/src/whopsdk/types/shipment_list_params.py b/src/whop_sdk/types/shipment_list_params.py similarity index 100% rename from src/whopsdk/types/shipment_list_params.py rename to src/whop_sdk/types/shipment_list_params.py diff --git a/src/whopsdk/types/shipment_list_response.py b/src/whop_sdk/types/shipment_list_response.py similarity index 100% rename from src/whopsdk/types/shipment_list_response.py rename to src/whop_sdk/types/shipment_list_response.py diff --git a/src/whopsdk/types/support_channel_create_params.py b/src/whop_sdk/types/support_channel_create_params.py similarity index 100% rename from src/whopsdk/types/support_channel_create_params.py rename to src/whop_sdk/types/support_channel_create_params.py diff --git a/src/whopsdk/types/support_channel_list_params.py b/src/whop_sdk/types/support_channel_list_params.py similarity index 100% rename from src/whopsdk/types/support_channel_list_params.py rename to src/whop_sdk/types/support_channel_list_params.py diff --git a/src/whopsdk/types/support_channel_list_response.py b/src/whop_sdk/types/support_channel_list_response.py similarity index 100% rename from src/whopsdk/types/support_channel_list_response.py rename to src/whop_sdk/types/support_channel_list_response.py diff --git a/src/whopsdk/types/transfer_create_params.py b/src/whop_sdk/types/transfer_create_params.py similarity index 100% rename from src/whopsdk/types/transfer_create_params.py rename to src/whop_sdk/types/transfer_create_params.py diff --git a/src/whopsdk/types/transfer_list_params.py b/src/whop_sdk/types/transfer_list_params.py similarity index 100% rename from src/whopsdk/types/transfer_list_params.py rename to src/whop_sdk/types/transfer_list_params.py diff --git a/src/whopsdk/types/transfer_list_response.py b/src/whop_sdk/types/transfer_list_response.py similarity index 100% rename from src/whopsdk/types/transfer_list_response.py rename to src/whop_sdk/types/transfer_list_response.py diff --git a/src/whopsdk/types/unwrap_webhook_event.py b/src/whop_sdk/types/unwrap_webhook_event.py similarity index 100% rename from src/whopsdk/types/unwrap_webhook_event.py rename to src/whop_sdk/types/unwrap_webhook_event.py diff --git a/src/whopsdk/types/user_check_access_response.py b/src/whop_sdk/types/user_check_access_response.py similarity index 100% rename from src/whopsdk/types/user_check_access_response.py rename to src/whop_sdk/types/user_check_access_response.py diff --git a/src/whopsdk/types/user_retrieve_response.py b/src/whop_sdk/types/user_retrieve_response.py similarity index 100% rename from src/whopsdk/types/user_retrieve_response.py rename to src/whop_sdk/types/user_retrieve_response.py diff --git a/tests/api_resources/test_app_builds.py b/tests/api_resources/test_app_builds.py index c4e23886..ebf289c7 100644 --- a/tests/api_resources/test_app_builds.py +++ b/tests/api_resources/test_app_builds.py @@ -7,11 +7,11 @@ import pytest -from whopsdk import Whop, AsyncWhop +from whop_sdk import Whop, AsyncWhop from tests.utils import assert_matches_type -from whopsdk.types import AppBuildListResponse -from whopsdk.pagination import SyncCursorPage, AsyncCursorPage -from whopsdk.types.shared import AppBuild +from whop_sdk.types import AppBuildListResponse +from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage +from whop_sdk.types.shared import AppBuild base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") diff --git a/tests/api_resources/test_apps.py b/tests/api_resources/test_apps.py index f8a572c8..0e52d0b8 100644 --- a/tests/api_resources/test_apps.py +++ b/tests/api_resources/test_apps.py @@ -7,11 +7,11 @@ import pytest -from whopsdk import Whop, AsyncWhop +from whop_sdk import Whop, AsyncWhop from tests.utils import assert_matches_type -from whopsdk.types import AppListResponse -from whopsdk.pagination import SyncCursorPage, AsyncCursorPage -from whopsdk.types.shared import App +from whop_sdk.types import AppListResponse +from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage +from whop_sdk.types.shared import App base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") diff --git a/tests/api_resources/test_authorized_users.py b/tests/api_resources/test_authorized_users.py index 454da177..179cab59 100644 --- a/tests/api_resources/test_authorized_users.py +++ b/tests/api_resources/test_authorized_users.py @@ -7,13 +7,13 @@ import pytest -from whopsdk import Whop, AsyncWhop +from whop_sdk import Whop, AsyncWhop from tests.utils import assert_matches_type -from whopsdk.types import ( +from whop_sdk.types import ( AuthorizedUserListResponse, AuthorizedUserRetrieveResponse, ) -from whopsdk.pagination import SyncCursorPage, AsyncCursorPage +from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") diff --git a/tests/api_resources/test_chat_channels.py b/tests/api_resources/test_chat_channels.py index 6243042c..5b9e217f 100644 --- a/tests/api_resources/test_chat_channels.py +++ b/tests/api_resources/test_chat_channels.py @@ -7,11 +7,11 @@ import pytest -from whopsdk import Whop, AsyncWhop +from whop_sdk import Whop, AsyncWhop from tests.utils import assert_matches_type -from whopsdk.types import ChatChannelListResponse -from whopsdk.pagination import SyncCursorPage, AsyncCursorPage -from whopsdk.types.shared import ChatChannel +from whop_sdk.types import ChatChannelListResponse +from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage +from whop_sdk.types.shared import ChatChannel base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") diff --git a/tests/api_resources/test_checkout_configurations.py b/tests/api_resources/test_checkout_configurations.py index 0918ecdb..13ad6753 100644 --- a/tests/api_resources/test_checkout_configurations.py +++ b/tests/api_resources/test_checkout_configurations.py @@ -7,13 +7,13 @@ import pytest -from whopsdk import Whop, AsyncWhop +from whop_sdk import Whop, AsyncWhop from tests.utils import assert_matches_type -from whopsdk.types import ( +from whop_sdk.types import ( CheckoutConfigurationListResponse, ) -from whopsdk.pagination import SyncCursorPage, AsyncCursorPage -from whopsdk.types.shared import CheckoutConfiguration +from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage +from whop_sdk.types.shared import CheckoutConfiguration base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") diff --git a/tests/api_resources/test_companies.py b/tests/api_resources/test_companies.py index 495fb383..f6e41974 100644 --- a/tests/api_resources/test_companies.py +++ b/tests/api_resources/test_companies.py @@ -7,9 +7,9 @@ import pytest -from whopsdk import Whop, AsyncWhop +from whop_sdk import Whop, AsyncWhop from tests.utils import assert_matches_type -from whopsdk.types.shared import Company +from whop_sdk.types.shared import Company base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") diff --git a/tests/api_resources/test_course_lesson_interactions.py b/tests/api_resources/test_course_lesson_interactions.py index 9394c582..f5025c1c 100644 --- a/tests/api_resources/test_course_lesson_interactions.py +++ b/tests/api_resources/test_course_lesson_interactions.py @@ -7,10 +7,10 @@ import pytest -from whopsdk import Whop, AsyncWhop +from whop_sdk import Whop, AsyncWhop from tests.utils import assert_matches_type -from whopsdk.pagination import SyncCursorPage, AsyncCursorPage -from whopsdk.types.shared import CourseLessonInteraction, CourseLessonInteractionListItem +from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage +from whop_sdk.types.shared import CourseLessonInteraction, CourseLessonInteractionListItem base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") diff --git a/tests/api_resources/test_entries.py b/tests/api_resources/test_entries.py index 73f19da5..3d549c16 100644 --- a/tests/api_resources/test_entries.py +++ b/tests/api_resources/test_entries.py @@ -7,11 +7,11 @@ import pytest -from whopsdk import Whop, AsyncWhop +from whop_sdk import Whop, AsyncWhop from tests.utils import assert_matches_type -from whopsdk.types import EntryListResponse, EntryApproveResponse -from whopsdk.pagination import SyncCursorPage, AsyncCursorPage -from whopsdk.types.shared import Entry +from whop_sdk.types import EntryListResponse, EntryApproveResponse +from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage +from whop_sdk.types.shared import Entry base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") diff --git a/tests/api_resources/test_experiences.py b/tests/api_resources/test_experiences.py index 7579b714..9112113c 100644 --- a/tests/api_resources/test_experiences.py +++ b/tests/api_resources/test_experiences.py @@ -7,14 +7,14 @@ import pytest -from whopsdk import Whop, AsyncWhop +from whop_sdk import Whop, AsyncWhop from tests.utils import assert_matches_type -from whopsdk.types import ( +from whop_sdk.types import ( ExperienceListResponse, ExperienceDeleteResponse, ) -from whopsdk.pagination import SyncCursorPage, AsyncCursorPage -from whopsdk.types.shared import Experience +from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage +from whop_sdk.types.shared import Experience base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") diff --git a/tests/api_resources/test_forum_posts.py b/tests/api_resources/test_forum_posts.py index ee2a3b95..9487c0de 100644 --- a/tests/api_resources/test_forum_posts.py +++ b/tests/api_resources/test_forum_posts.py @@ -7,11 +7,11 @@ import pytest -from whopsdk import Whop, AsyncWhop +from whop_sdk import Whop, AsyncWhop from tests.utils import assert_matches_type -from whopsdk.types import ForumPostListResponse -from whopsdk.pagination import SyncCursorPage, AsyncCursorPage -from whopsdk.types.shared import ForumPost +from whop_sdk.types import ForumPostListResponse +from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage +from whop_sdk.types.shared import ForumPost base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") diff --git a/tests/api_resources/test_invoices.py b/tests/api_resources/test_invoices.py index b117dd25..ab6c3c7c 100644 --- a/tests/api_resources/test_invoices.py +++ b/tests/api_resources/test_invoices.py @@ -7,12 +7,15 @@ import pytest -from whopsdk import Whop, AsyncWhop +from whop_sdk import Whop, AsyncWhop from tests.utils import assert_matches_type -from whopsdk.types import InvoiceVoidResponse, InvoiceCreateResponse -from whopsdk._utils import parse_datetime -from whopsdk.pagination import SyncCursorPage, AsyncCursorPage -from whopsdk.types.shared import Invoice, InvoiceListItem +from whop_sdk.types import ( + InvoiceVoidResponse, + InvoiceCreateResponse, +) +from whop_sdk._utils import parse_datetime +from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage +from whop_sdk.types.shared import Invoice, InvoiceListItem base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") diff --git a/tests/api_resources/test_ledger_accounts.py b/tests/api_resources/test_ledger_accounts.py index 6dfd4ae2..036a3034 100644 --- a/tests/api_resources/test_ledger_accounts.py +++ b/tests/api_resources/test_ledger_accounts.py @@ -7,9 +7,9 @@ import pytest -from whopsdk import Whop, AsyncWhop +from whop_sdk import Whop, AsyncWhop from tests.utils import assert_matches_type -from whopsdk.types import LedgerAccountRetrieveResponse +from whop_sdk.types import LedgerAccountRetrieveResponse base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") diff --git a/tests/api_resources/test_memberships.py b/tests/api_resources/test_memberships.py index 8be7ce6a..f0edf0ab 100644 --- a/tests/api_resources/test_memberships.py +++ b/tests/api_resources/test_memberships.py @@ -7,14 +7,14 @@ import pytest -from whopsdk import Whop, AsyncWhop +from whop_sdk import Whop, AsyncWhop from tests.utils import assert_matches_type -from whopsdk.types import ( +from whop_sdk.types import ( MembershipListResponse, ) -from whopsdk._utils import parse_datetime -from whopsdk.pagination import SyncCursorPage, AsyncCursorPage -from whopsdk.types.shared import Membership +from whop_sdk._utils import parse_datetime +from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage +from whop_sdk.types.shared import Membership base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") diff --git a/tests/api_resources/test_messages.py b/tests/api_resources/test_messages.py index f771eb7a..4e79462c 100644 --- a/tests/api_resources/test_messages.py +++ b/tests/api_resources/test_messages.py @@ -7,11 +7,11 @@ import pytest -from whopsdk import Whop, AsyncWhop +from whop_sdk import Whop, AsyncWhop from tests.utils import assert_matches_type -from whopsdk.types import MessageListResponse -from whopsdk.pagination import SyncCursorPage, AsyncCursorPage -from whopsdk.types.shared import Message +from whop_sdk.types import MessageListResponse +from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage +from whop_sdk.types.shared import Message base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") diff --git a/tests/api_resources/test_payments.py b/tests/api_resources/test_payments.py index a25e86d2..3ad24582 100644 --- a/tests/api_resources/test_payments.py +++ b/tests/api_resources/test_payments.py @@ -7,12 +7,12 @@ import pytest -from whopsdk import Whop, AsyncWhop +from whop_sdk import Whop, AsyncWhop from tests.utils import assert_matches_type -from whopsdk.types import PaymentListResponse -from whopsdk._utils import parse_datetime -from whopsdk.pagination import SyncCursorPage, AsyncCursorPage -from whopsdk.types.shared import Payment +from whop_sdk.types import PaymentListResponse +from whop_sdk._utils import parse_datetime +from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage +from whop_sdk.types.shared import Payment base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") diff --git a/tests/api_resources/test_plans.py b/tests/api_resources/test_plans.py index 7f91a249..b86a579f 100644 --- a/tests/api_resources/test_plans.py +++ b/tests/api_resources/test_plans.py @@ -7,14 +7,14 @@ import pytest -from whopsdk import Whop, AsyncWhop +from whop_sdk import Whop, AsyncWhop from tests.utils import assert_matches_type -from whopsdk.types import ( +from whop_sdk.types import ( PlanListResponse, PlanDeleteResponse, ) -from whopsdk.pagination import SyncCursorPage, AsyncCursorPage -from whopsdk.types.shared import Plan +from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage +from whop_sdk.types.shared import Plan base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") diff --git a/tests/api_resources/test_products.py b/tests/api_resources/test_products.py index 52b7dc7e..2d66be66 100644 --- a/tests/api_resources/test_products.py +++ b/tests/api_resources/test_products.py @@ -7,13 +7,13 @@ import pytest -from whopsdk import Whop, AsyncWhop +from whop_sdk import Whop, AsyncWhop from tests.utils import assert_matches_type -from whopsdk.types import ( +from whop_sdk.types import ( ProductDeleteResponse, ) -from whopsdk.pagination import SyncCursorPage, AsyncCursorPage -from whopsdk.types.shared import Product, ProductListItem +from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage +from whop_sdk.types.shared import Product, ProductListItem base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") diff --git a/tests/api_resources/test_reactions.py b/tests/api_resources/test_reactions.py index 2286cccb..68b5b427 100644 --- a/tests/api_resources/test_reactions.py +++ b/tests/api_resources/test_reactions.py @@ -7,11 +7,11 @@ import pytest -from whopsdk import Whop, AsyncWhop +from whop_sdk import Whop, AsyncWhop from tests.utils import assert_matches_type -from whopsdk.types import ReactionListResponse -from whopsdk.pagination import SyncCursorPage, AsyncCursorPage -from whopsdk.types.shared import Reaction +from whop_sdk.types import ReactionListResponse +from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage +from whop_sdk.types.shared import Reaction base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") diff --git a/tests/api_resources/test_shipments.py b/tests/api_resources/test_shipments.py index 948593e8..41d72dbb 100644 --- a/tests/api_resources/test_shipments.py +++ b/tests/api_resources/test_shipments.py @@ -7,11 +7,11 @@ import pytest -from whopsdk import Whop, AsyncWhop +from whop_sdk import Whop, AsyncWhop from tests.utils import assert_matches_type -from whopsdk.types import ShipmentListResponse -from whopsdk.pagination import SyncCursorPage, AsyncCursorPage -from whopsdk.types.shared import Shipment +from whop_sdk.types import ShipmentListResponse +from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage +from whop_sdk.types.shared import Shipment base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") diff --git a/tests/api_resources/test_support_channels.py b/tests/api_resources/test_support_channels.py index bc89ed62..d449fdb0 100644 --- a/tests/api_resources/test_support_channels.py +++ b/tests/api_resources/test_support_channels.py @@ -7,11 +7,13 @@ import pytest -from whopsdk import Whop, AsyncWhop +from whop_sdk import Whop, AsyncWhop from tests.utils import assert_matches_type -from whopsdk.types import SupportChannelListResponse -from whopsdk.pagination import SyncCursorPage, AsyncCursorPage -from whopsdk.types.shared import SupportChannel +from whop_sdk.types import ( + SupportChannelListResponse, +) +from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage +from whop_sdk.types.shared import SupportChannel base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") diff --git a/tests/api_resources/test_transfers.py b/tests/api_resources/test_transfers.py index d50aaa8f..5afce84f 100644 --- a/tests/api_resources/test_transfers.py +++ b/tests/api_resources/test_transfers.py @@ -7,11 +7,11 @@ import pytest -from whopsdk import Whop, AsyncWhop +from whop_sdk import Whop, AsyncWhop from tests.utils import assert_matches_type -from whopsdk.types import TransferListResponse -from whopsdk.pagination import SyncCursorPage, AsyncCursorPage -from whopsdk.types.shared import Transfer +from whop_sdk.types import TransferListResponse +from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage +from whop_sdk.types.shared import Transfer base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") diff --git a/tests/api_resources/test_users.py b/tests/api_resources/test_users.py index dc0b13eb..924e77f6 100644 --- a/tests/api_resources/test_users.py +++ b/tests/api_resources/test_users.py @@ -7,9 +7,9 @@ import pytest -from whopsdk import Whop, AsyncWhop +from whop_sdk import Whop, AsyncWhop from tests.utils import assert_matches_type -from whopsdk.types import UserRetrieveResponse, UserCheckAccessResponse +from whop_sdk.types import UserRetrieveResponse, UserCheckAccessResponse base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") diff --git a/tests/api_resources/test_webhooks.py b/tests/api_resources/test_webhooks.py index 2738aa36..deebdece 100644 --- a/tests/api_resources/test_webhooks.py +++ b/tests/api_resources/test_webhooks.py @@ -8,7 +8,7 @@ import pytest import standardwebhooks -from whopsdk import Whop +from whop_sdk import Whop base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") diff --git a/tests/conftest.py b/tests/conftest.py index 00e86398..b2907519 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -10,15 +10,15 @@ import pytest from pytest_asyncio import is_async_test -from whopsdk import Whop, AsyncWhop, DefaultAioHttpClient -from whopsdk._utils import is_dict +from whop_sdk import Whop, AsyncWhop, DefaultAioHttpClient +from whop_sdk._utils import is_dict if TYPE_CHECKING: from _pytest.fixtures import FixtureRequest # pyright: ignore[reportPrivateImportUsage] pytest.register_assert_rewrite("tests.utils") -logging.getLogger("whopsdk").setLevel(logging.DEBUG) +logging.getLogger("whop_sdk").setLevel(logging.DEBUG) # automatically add `pytest.mark.asyncio()` to all of our async tests diff --git a/tests/test_client.py b/tests/test_client.py index 08c528b7..70ee7fd0 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -18,12 +18,12 @@ from respx import MockRouter from pydantic import ValidationError -from whopsdk import Whop, AsyncWhop, APIResponseValidationError -from whopsdk._types import Omit -from whopsdk._utils import asyncify -from whopsdk._models import BaseModel, FinalRequestOptions -from whopsdk._exceptions import WhopError, APIStatusError, APIResponseValidationError -from whopsdk._base_client import ( +from whop_sdk import Whop, AsyncWhop, APIResponseValidationError +from whop_sdk._types import Omit +from whop_sdk._utils import asyncify +from whop_sdk._models import BaseModel, FinalRequestOptions +from whop_sdk._exceptions import WhopError, APIStatusError, APIResponseValidationError +from whop_sdk._base_client import ( DEFAULT_TIMEOUT, HTTPX_DEFAULT_TIMEOUT, BaseClient, @@ -237,10 +237,10 @@ def add_leak(leaks: list[tracemalloc.StatisticDiff], diff: tracemalloc.Statistic # to_raw_response_wrapper leaks through the @functools.wraps() decorator. # # removing the decorator fixes the leak for reasons we don't understand. - "whopsdk/_legacy_response.py", - "whopsdk/_response.py", + "whop_sdk/_legacy_response.py", + "whop_sdk/_response.py", # pydantic.BaseModel.model_dump || pydantic.BaseModel.dict leak memory for some reason. - "whopsdk/_compat.py", + "whop_sdk/_compat.py", # Standard library leaks we don't care about. "/logging/__init__.py", ] @@ -769,7 +769,7 @@ def test_parse_retry_after_header(self, remaining_retries: int, retry_after: str assert calculated == pytest.approx(timeout, 0.5 * 0.875) # pyright: ignore[reportUnknownMemberType] @pytest.mark.parametrize("failures_before_success", [0, 2, 4]) - @mock.patch("whopsdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) + @mock.patch("whop_sdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) @pytest.mark.respx(base_url=base_url) @pytest.mark.parametrize("failure_mode", ["status", "exception"]) def test_retries_taken( @@ -800,7 +800,7 @@ def retry_handler(_request: httpx.Request) -> httpx.Response: assert int(response.http_request.headers.get("x-stainless-retry-count")) == failures_before_success @pytest.mark.parametrize("failures_before_success", [0, 2, 4]) - @mock.patch("whopsdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) + @mock.patch("whop_sdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) @pytest.mark.respx(base_url=base_url) def test_omit_retry_count_header(self, client: Whop, failures_before_success: int, respx_mock: MockRouter) -> None: client = client.with_options(max_retries=4) @@ -823,7 +823,7 @@ def retry_handler(_request: httpx.Request) -> httpx.Response: assert len(response.http_request.headers.get_list("x-stainless-retry-count")) == 0 @pytest.mark.parametrize("failures_before_success", [0, 2, 4]) - @mock.patch("whopsdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) + @mock.patch("whop_sdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) @pytest.mark.respx(base_url=base_url) def test_overwrite_retry_count_header( self, client: Whop, failures_before_success: int, respx_mock: MockRouter @@ -1085,10 +1085,10 @@ def add_leak(leaks: list[tracemalloc.StatisticDiff], diff: tracemalloc.Statistic # to_raw_response_wrapper leaks through the @functools.wraps() decorator. # # removing the decorator fixes the leak for reasons we don't understand. - "whopsdk/_legacy_response.py", - "whopsdk/_response.py", + "whop_sdk/_legacy_response.py", + "whop_sdk/_response.py", # pydantic.BaseModel.model_dump || pydantic.BaseModel.dict leak memory for some reason. - "whopsdk/_compat.py", + "whop_sdk/_compat.py", # Standard library leaks we don't care about. "/logging/__init__.py", ] @@ -1621,7 +1621,7 @@ async def test_parse_retry_after_header(self, remaining_retries: int, retry_afte assert calculated == pytest.approx(timeout, 0.5 * 0.875) # pyright: ignore[reportUnknownMemberType] @pytest.mark.parametrize("failures_before_success", [0, 2, 4]) - @mock.patch("whopsdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) + @mock.patch("whop_sdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) @pytest.mark.respx(base_url=base_url) @pytest.mark.asyncio @pytest.mark.parametrize("failure_mode", ["status", "exception"]) @@ -1653,7 +1653,7 @@ def retry_handler(_request: httpx.Request) -> httpx.Response: assert int(response.http_request.headers.get("x-stainless-retry-count")) == failures_before_success @pytest.mark.parametrize("failures_before_success", [0, 2, 4]) - @mock.patch("whopsdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) + @mock.patch("whop_sdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) @pytest.mark.respx(base_url=base_url) @pytest.mark.asyncio async def test_omit_retry_count_header( @@ -1679,7 +1679,7 @@ def retry_handler(_request: httpx.Request) -> httpx.Response: assert len(response.http_request.headers.get_list("x-stainless-retry-count")) == 0 @pytest.mark.parametrize("failures_before_success", [0, 2, 4]) - @mock.patch("whopsdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) + @mock.patch("whop_sdk._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) @pytest.mark.respx(base_url=base_url) @pytest.mark.asyncio async def test_overwrite_retry_count_header( diff --git a/tests/test_deepcopy.py b/tests/test_deepcopy.py index b627ef27..4fd36e32 100644 --- a/tests/test_deepcopy.py +++ b/tests/test_deepcopy.py @@ -1,4 +1,4 @@ -from whopsdk._utils import deepcopy_minimal +from whop_sdk._utils import deepcopy_minimal def assert_different_identities(obj1: object, obj2: object) -> None: diff --git a/tests/test_extract_files.py b/tests/test_extract_files.py index 350c2613..a737e4c4 100644 --- a/tests/test_extract_files.py +++ b/tests/test_extract_files.py @@ -4,8 +4,8 @@ import pytest -from whopsdk._types import FileTypes -from whopsdk._utils import extract_files +from whop_sdk._types import FileTypes +from whop_sdk._utils import extract_files def test_removes_files_from_input() -> None: diff --git a/tests/test_files.py b/tests/test_files.py index 7143286b..eb04a93b 100644 --- a/tests/test_files.py +++ b/tests/test_files.py @@ -4,7 +4,7 @@ import pytest from dirty_equals import IsDict, IsList, IsBytes, IsTuple -from whopsdk._files import to_httpx_files, async_to_httpx_files +from whop_sdk._files import to_httpx_files, async_to_httpx_files readme_path = Path(__file__).parent.parent.joinpath("README.md") diff --git a/tests/test_models.py b/tests/test_models.py index 37dce791..982f9b81 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -7,9 +7,9 @@ import pydantic from pydantic import Field -from whopsdk._utils import PropertyInfo -from whopsdk._compat import PYDANTIC_V1, parse_obj, model_dump, model_json -from whopsdk._models import BaseModel, construct_type +from whop_sdk._utils import PropertyInfo +from whop_sdk._compat import PYDANTIC_V1, parse_obj, model_dump, model_json +from whop_sdk._models import BaseModel, construct_type class BasicModel(BaseModel): diff --git a/tests/test_qs.py b/tests/test_qs.py index ed94ddb8..72377037 100644 --- a/tests/test_qs.py +++ b/tests/test_qs.py @@ -4,7 +4,7 @@ import pytest -from whopsdk._qs import Querystring, stringify +from whop_sdk._qs import Querystring, stringify def test_empty() -> None: diff --git a/tests/test_required_args.py b/tests/test_required_args.py index ddd59ecc..6f850cf6 100644 --- a/tests/test_required_args.py +++ b/tests/test_required_args.py @@ -2,7 +2,7 @@ import pytest -from whopsdk._utils import required_args +from whop_sdk._utils import required_args def test_too_many_positional_params() -> None: diff --git a/tests/test_response.py b/tests/test_response.py index aa15cb1e..028c6a20 100644 --- a/tests/test_response.py +++ b/tests/test_response.py @@ -6,8 +6,8 @@ import pytest import pydantic -from whopsdk import Whop, AsyncWhop, BaseModel -from whopsdk._response import ( +from whop_sdk import Whop, AsyncWhop, BaseModel +from whop_sdk._response import ( APIResponse, BaseAPIResponse, AsyncAPIResponse, @@ -15,8 +15,8 @@ AsyncBinaryAPIResponse, extract_response_type, ) -from whopsdk._streaming import Stream -from whopsdk._base_client import FinalRequestOptions +from whop_sdk._streaming import Stream +from whop_sdk._base_client import FinalRequestOptions class ConcreteBaseAPIResponse(APIResponse[bytes]): ... @@ -37,7 +37,7 @@ def test_extract_response_type_direct_classes() -> None: def test_extract_response_type_direct_class_missing_type_arg() -> None: with pytest.raises( RuntimeError, - match="Expected type to have a type argument at index 0 but it did not", + match="Expected type to have a type argument at index 0 but it did not", ): extract_response_type(AsyncAPIResponse) @@ -68,7 +68,7 @@ def test_response_parse_mismatched_basemodel(client: Whop) -> None: with pytest.raises( TypeError, - match="Pydantic models must subclass our base model type, e.g. `from whopsdk import BaseModel`", + match="Pydantic models must subclass our base model type, e.g. `from whop_sdk import BaseModel`", ): response.parse(to=PydanticModel) @@ -86,7 +86,7 @@ async def test_async_response_parse_mismatched_basemodel(async_client: AsyncWhop with pytest.raises( TypeError, - match="Pydantic models must subclass our base model type, e.g. `from whopsdk import BaseModel`", + match="Pydantic models must subclass our base model type, e.g. `from whop_sdk import BaseModel`", ): await response.parse(to=PydanticModel) diff --git a/tests/test_streaming.py b/tests/test_streaming.py index b56d9da8..9eeb70f9 100644 --- a/tests/test_streaming.py +++ b/tests/test_streaming.py @@ -5,8 +5,8 @@ import httpx import pytest -from whopsdk import Whop, AsyncWhop -from whopsdk._streaming import Stream, AsyncStream, ServerSentEvent +from whop_sdk import Whop, AsyncWhop +from whop_sdk._streaming import Stream, AsyncStream, ServerSentEvent @pytest.mark.asyncio diff --git a/tests/test_transform.py b/tests/test_transform.py index a201cd06..388f2f17 100644 --- a/tests/test_transform.py +++ b/tests/test_transform.py @@ -8,15 +8,15 @@ import pytest -from whopsdk._types import Base64FileInput, omit, not_given -from whopsdk._utils import ( +from whop_sdk._types import Base64FileInput, omit, not_given +from whop_sdk._utils import ( PropertyInfo, transform as _transform, parse_datetime, async_transform as _async_transform, ) -from whopsdk._compat import PYDANTIC_V1 -from whopsdk._models import BaseModel +from whop_sdk._compat import PYDANTIC_V1 +from whop_sdk._models import BaseModel _T = TypeVar("_T") diff --git a/tests/test_utils/test_datetime_parse.py b/tests/test_utils/test_datetime_parse.py index 62b1064e..be05afd1 100644 --- a/tests/test_utils/test_datetime_parse.py +++ b/tests/test_utils/test_datetime_parse.py @@ -8,7 +8,7 @@ import pytest -from whopsdk._utils import parse_date, parse_datetime +from whop_sdk._utils import parse_date, parse_datetime def create_tz(minutes: int) -> timezone: diff --git a/tests/test_utils/test_proxy.py b/tests/test_utils/test_proxy.py index b42ccaa6..e920bc5e 100644 --- a/tests/test_utils/test_proxy.py +++ b/tests/test_utils/test_proxy.py @@ -2,7 +2,7 @@ from typing import Any from typing_extensions import override -from whopsdk._utils import LazyProxy +from whop_sdk._utils import LazyProxy class RecursiveLazyProxy(LazyProxy[Any]): diff --git a/tests/test_utils/test_typing.py b/tests/test_utils/test_typing.py index 1a902834..d88b700d 100644 --- a/tests/test_utils/test_typing.py +++ b/tests/test_utils/test_typing.py @@ -2,7 +2,7 @@ from typing import Generic, TypeVar, cast -from whopsdk._utils import extract_type_var_from_base +from whop_sdk._utils import extract_type_var_from_base _T = TypeVar("_T") _T2 = TypeVar("_T2") diff --git a/tests/utils.py b/tests/utils.py index 95b18665..f279898c 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -8,8 +8,8 @@ from datetime import date, datetime from typing_extensions import Literal, get_args, get_origin, assert_type -from whopsdk._types import Omit, NoneType -from whopsdk._utils import ( +from whop_sdk._types import Omit, NoneType +from whop_sdk._utils import ( is_dict, is_list, is_list_type, @@ -19,8 +19,8 @@ is_annotated_type, is_type_alias_type, ) -from whopsdk._compat import PYDANTIC_V1, field_outer_type, get_model_fields -from whopsdk._models import BaseModel +from whop_sdk._compat import PYDANTIC_V1, field_outer_type, get_model_fields +from whop_sdk._models import BaseModel BaseModelT = TypeVar("BaseModelT", bound=BaseModel) From 11fa531570957ba6602836ab07405cffee1b69a6 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 16 Oct 2025 15:37:06 +0000 Subject: [PATCH 05/17] codegen metadata --- .stats.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.stats.yml b/.stats.yml index f528b1c0..ad3ce4a5 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 76 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-493b08fc2ae996eaf1758fa74f56163b2e40d4e1abeaa9672b8d1a039df30d75.yml openapi_spec_hash: 212470480a88cabb38a58b5b6867c733 -config_hash: d8da61cbd45bbc6c4ada7c0663afce12 +config_hash: 308f8c413397c11083a81dacbddd95f2 From d4e19c1fb58ee03e848c8ee36fcdc8272bb0bb9c Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 16 Oct 2025 16:05:44 +0000 Subject: [PATCH 06/17] codegen metadata --- .stats.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.stats.yml b/.stats.yml index ad3ce4a5..3f7f73d5 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 76 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-493b08fc2ae996eaf1758fa74f56163b2e40d4e1abeaa9672b8d1a039df30d75.yml openapi_spec_hash: 212470480a88cabb38a58b5b6867c733 -config_hash: 308f8c413397c11083a81dacbddd95f2 +config_hash: d72e5036b7f668d3a99a5a96248c4052 From d66c08873a123a5b65a5fa6f17e66ec6668e37a3 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 16 Oct 2025 18:24:44 +0000 Subject: [PATCH 07/17] feat(api): api update --- .stats.yml | 4 ++-- .../resources/checkout_configurations.py | 24 +++++++++---------- .../checkout_configuration_create_params.py | 10 ++++---- .../checkout_configuration_list_response.py | 14 +++++------ .../types/shared/checkout_configuration.py | 14 +++++------ 5 files changed, 33 insertions(+), 33 deletions(-) diff --git a/.stats.yml b/.stats.yml index 3f7f73d5..a7e90a63 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 76 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-493b08fc2ae996eaf1758fa74f56163b2e40d4e1abeaa9672b8d1a039df30d75.yml -openapi_spec_hash: 212470480a88cabb38a58b5b6867c733 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-3ae7c5724a6b6587099a0eb3b6f38d4e08f8e37d9496287446f05b8dd16b9eed.yml +openapi_spec_hash: 983d5947e6bf06afdc833cec1d419881 config_hash: d72e5036b7f668d3a99a5a96248c4052 diff --git a/src/whop_sdk/resources/checkout_configurations.py b/src/whop_sdk/resources/checkout_configurations.py index d2a63268..756aaa60 100644 --- a/src/whop_sdk/resources/checkout_configurations.py +++ b/src/whop_sdk/resources/checkout_configurations.py @@ -62,7 +62,7 @@ def create( timeout: float | httpx.Timeout | None | NotGiven = not_given, ) -> CheckoutConfiguration: """ - Creates a new checkout session + Creates a new checkout configuration Required permissions: @@ -70,15 +70,15 @@ def create( - `plan:create` Args: - affiliate_code: The affiliate code to use for the checkout session + affiliate_code: The affiliate code to use for the checkout configuration - metadata: The metadata to use for the checkout session + metadata: The metadata to use for the checkout configuration - plan: Pass this object to create a new plan for this checkout session + plan: Pass this object to create a new plan for this checkout configuration - plan_id: The ID of the plan to use for the checkout session + plan_id: The ID of the plan to use for the checkout configuration - redirect_url: The URL to redirect the user to after the checkout session is created + redirect_url: The URL to redirect the user to after the checkout configuration is created extra_headers: Send extra headers @@ -251,7 +251,7 @@ async def create( timeout: float | httpx.Timeout | None | NotGiven = not_given, ) -> CheckoutConfiguration: """ - Creates a new checkout session + Creates a new checkout configuration Required permissions: @@ -259,15 +259,15 @@ async def create( - `plan:create` Args: - affiliate_code: The affiliate code to use for the checkout session + affiliate_code: The affiliate code to use for the checkout configuration - metadata: The metadata to use for the checkout session + metadata: The metadata to use for the checkout configuration - plan: Pass this object to create a new plan for this checkout session + plan: Pass this object to create a new plan for this checkout configuration - plan_id: The ID of the plan to use for the checkout session + plan_id: The ID of the plan to use for the checkout configuration - redirect_url: The URL to redirect the user to after the checkout session is created + redirect_url: The URL to redirect the user to after the checkout configuration is created extra_headers: Send extra headers diff --git a/src/whop_sdk/types/checkout_configuration_create_params.py b/src/whop_sdk/types/checkout_configuration_create_params.py index d20a63e6..4d40fff3 100644 --- a/src/whop_sdk/types/checkout_configuration_create_params.py +++ b/src/whop_sdk/types/checkout_configuration_create_params.py @@ -16,19 +16,19 @@ class CheckoutConfigurationCreateParams(TypedDict, total=False): affiliate_code: Optional[str] - """The affiliate code to use for the checkout session""" + """The affiliate code to use for the checkout configuration""" metadata: Optional[Dict[str, object]] - """The metadata to use for the checkout session""" + """The metadata to use for the checkout configuration""" plan: Optional[Plan] - """Pass this object to create a new plan for this checkout session""" + """Pass this object to create a new plan for this checkout configuration""" plan_id: Optional[str] - """The ID of the plan to use for the checkout session""" + """The ID of the plan to use for the checkout configuration""" redirect_url: Optional[str] - """The URL to redirect the user to after the checkout session is created""" + """The URL to redirect the user to after the checkout configuration is created""" class PlanCustomField(TypedDict, total=False): diff --git a/src/whop_sdk/types/checkout_configuration_list_response.py b/src/whop_sdk/types/checkout_configuration_list_response.py index b8582b94..6f3d261b 100644 --- a/src/whop_sdk/types/checkout_configuration_list_response.py +++ b/src/whop_sdk/types/checkout_configuration_list_response.py @@ -45,22 +45,22 @@ class Plan(BaseModel): class CheckoutConfigurationListResponse(BaseModel): id: str - """The ID of the checkout session""" + """The ID of the checkout configuration""" affiliate_code: str - """The affiliate code to use for the checkout session""" + """The affiliate code to use for the checkout configuration""" company_id: str - """The ID of the company to use for the checkout session""" + """The ID of the company to use for the checkout configuration""" metadata: Dict[str, object] - """The metadata to use for the checkout session""" + """The metadata to use for the checkout configuration""" plan: Plan - """The plan to use for the checkout session""" + """The plan to use for the checkout configuration""" purchase_url: str - """The URL to redirect the user to after the checkout session is created""" + """The URL to redirect the user to after the checkout configuration is created""" redirect_url: str - """The URL to redirect the user to after the checkout session is created""" + """The URL to redirect the user to after the checkout configuration is created""" diff --git a/src/whop_sdk/types/shared/checkout_configuration.py b/src/whop_sdk/types/shared/checkout_configuration.py index a30b9e9b..31f8eab2 100644 --- a/src/whop_sdk/types/shared/checkout_configuration.py +++ b/src/whop_sdk/types/shared/checkout_configuration.py @@ -45,22 +45,22 @@ class Plan(BaseModel): class CheckoutConfiguration(BaseModel): id: str - """The ID of the checkout session""" + """The ID of the checkout configuration""" affiliate_code: str - """The affiliate code to use for the checkout session""" + """The affiliate code to use for the checkout configuration""" company_id: str - """The ID of the company to use for the checkout session""" + """The ID of the company to use for the checkout configuration""" metadata: Dict[str, object] - """The metadata to use for the checkout session""" + """The metadata to use for the checkout configuration""" plan: Plan - """The plan to use for the checkout session""" + """The plan to use for the checkout configuration""" purchase_url: str - """The URL to redirect the user to after the checkout session is created""" + """The URL to redirect the user to after the checkout configuration is created""" redirect_url: str - """The URL to redirect the user to after the checkout session is created""" + """The URL to redirect the user to after the checkout configuration is created""" From af1c24bd7e8aab7c7d773574d79e208d25187829 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 16 Oct 2025 21:24:37 +0000 Subject: [PATCH 08/17] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index a7e90a63..4257150e 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 76 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-3ae7c5724a6b6587099a0eb3b6f38d4e08f8e37d9496287446f05b8dd16b9eed.yml -openapi_spec_hash: 983d5947e6bf06afdc833cec1d419881 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-5aff848f75cde8300a1b01c1ebebded1c34bcd85fafc8d26f4204734ddcd7033.yml +openapi_spec_hash: 50a91399b8d58d89ca97d3007571a5fa config_hash: d72e5036b7f668d3a99a5a96248c4052 From e0bea9ff169b03e85ba7111ccd7cbe1f4a1eb4cf Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 16 Oct 2025 21:33:52 +0000 Subject: [PATCH 09/17] feat(api): manual updates --- .stats.yml | 4 +- api.md | 34 ++ src/whop_sdk/_client.py | 18 + src/whop_sdk/resources/__init__.py | 28 ++ src/whop_sdk/resources/forums.py | 446 ++++++++++++++++++ src/whop_sdk/resources/members.py | 421 +++++++++++++++++ src/whop_sdk/types/__init__.py | 13 + src/whop_sdk/types/forum_list_params.py | 28 ++ src/whop_sdk/types/forum_list_response.py | 33 ++ src/whop_sdk/types/forum_update_params.py | 23 + src/whop_sdk/types/member_list_params.py | 70 +++ src/whop_sdk/types/member_list_response.py | 65 +++ .../types/member_retrieve_response.py | 79 ++++ src/whop_sdk/types/shared/__init__.py | 7 + src/whop_sdk/types/shared/access_level.py | 7 + .../shared/email_notification_preferences.py | 7 + src/whop_sdk/types/shared/forum.py | 33 ++ .../shared/member_most_recent_actions.py | 22 + src/whop_sdk/types/shared/member_statuses.py | 7 + .../types/shared/who_can_comment_types.py | 7 + .../types/shared/who_can_post_types.py | 7 + src/whop_sdk/types/shared_params/__init__.py | 6 + .../types/shared_params/access_level.py | 9 + .../email_notification_preferences.py | 9 + .../member_most_recent_actions.py | 24 + .../types/shared_params/member_statuses.py | 9 + .../shared_params/who_can_comment_types.py | 9 + .../types/shared_params/who_can_post_types.py | 9 + .../types/user_check_access_response.py | 5 +- tests/api_resources/test_forums.py | 310 ++++++++++++ tests/api_resources/test_members.py | 224 +++++++++ 31 files changed, 1968 insertions(+), 5 deletions(-) create mode 100644 src/whop_sdk/resources/forums.py create mode 100644 src/whop_sdk/resources/members.py create mode 100644 src/whop_sdk/types/forum_list_params.py create mode 100644 src/whop_sdk/types/forum_list_response.py create mode 100644 src/whop_sdk/types/forum_update_params.py create mode 100644 src/whop_sdk/types/member_list_params.py create mode 100644 src/whop_sdk/types/member_list_response.py create mode 100644 src/whop_sdk/types/member_retrieve_response.py create mode 100644 src/whop_sdk/types/shared/access_level.py create mode 100644 src/whop_sdk/types/shared/email_notification_preferences.py create mode 100644 src/whop_sdk/types/shared/forum.py create mode 100644 src/whop_sdk/types/shared/member_most_recent_actions.py create mode 100644 src/whop_sdk/types/shared/member_statuses.py create mode 100644 src/whop_sdk/types/shared/who_can_comment_types.py create mode 100644 src/whop_sdk/types/shared/who_can_post_types.py create mode 100644 src/whop_sdk/types/shared_params/access_level.py create mode 100644 src/whop_sdk/types/shared_params/email_notification_preferences.py create mode 100644 src/whop_sdk/types/shared_params/member_most_recent_actions.py create mode 100644 src/whop_sdk/types/shared_params/member_statuses.py create mode 100644 src/whop_sdk/types/shared_params/who_can_comment_types.py create mode 100644 src/whop_sdk/types/shared_params/who_can_post_types.py create mode 100644 tests/api_resources/test_forums.py create mode 100644 tests/api_resources/test_members.py diff --git a/.stats.yml b/.stats.yml index 4257150e..225b5482 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ -configured_endpoints: 76 +configured_endpoints: 81 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-5aff848f75cde8300a1b01c1ebebded1c34bcd85fafc8d26f4204734ddcd7033.yml openapi_spec_hash: 50a91399b8d58d89ca97d3007571a5fa -config_hash: d72e5036b7f668d3a99a5a96248c4052 +config_hash: 335abeb0dd84526555f7d83ddb84af97 diff --git a/api.md b/api.md index 11565652..7f71baa3 100644 --- a/api.md +++ b/api.md @@ -2,6 +2,7 @@ ```python from whop_sdk.types import ( + AccessLevel, AccessPassType, App, AppBuild, @@ -21,9 +22,11 @@ from whop_sdk.types import ( CustomCta, Direction, DmsPostTypes, + EmailNotificationPreferences, Entry, EntryStatus, Experience, + Forum, ForumPost, FriendlyReceiptStatus, GlobalAffiliateStatus, @@ -31,6 +34,8 @@ from whop_sdk.types import ( Invoice, InvoiceListItem, InvoiceStatus, + MemberMostRecentActions, + MemberStatuses, Membership, MembershipStatus, Message, @@ -53,7 +58,9 @@ from whop_sdk.types import ( Transfer, Visibility, VisibilityFilter, + WhoCanCommentTypes, WhoCanPost, + WhoCanPostTypes, WhoCanReact, ) ``` @@ -377,3 +384,30 @@ Methods: - client.reactions.create(\*\*params) -> Reaction - client.reactions.retrieve(id) -> Reaction - client.reactions.list(\*\*params) -> SyncCursorPage[ReactionListResponse] + +# Members + +Types: + +```python +from whop_sdk.types import MemberRetrieveResponse, MemberListResponse +``` + +Methods: + +- client.members.retrieve(id) -> MemberRetrieveResponse +- client.members.list(\*\*params) -> SyncCursorPage[MemberListResponse] + +# Forums + +Types: + +```python +from whop_sdk.types import ForumListResponse +``` + +Methods: + +- client.forums.retrieve(id) -> Forum +- client.forums.update(id, \*\*params) -> Forum +- client.forums.list(\*\*params) -> SyncCursorPage[ForumListResponse] diff --git a/src/whop_sdk/_client.py b/src/whop_sdk/_client.py index 68216b31..196ca7fb 100644 --- a/src/whop_sdk/_client.py +++ b/src/whop_sdk/_client.py @@ -25,7 +25,9 @@ apps, plans, users, + forums, entries, + members, invoices, messages, payments, @@ -81,6 +83,8 @@ class Whop(SyncAPIClient): support_channels: support_channels.SupportChannelsResource experiences: experiences.ExperiencesResource reactions: reactions.ReactionsResource + members: members.MembersResource + forums: forums.ForumsResource with_raw_response: WhopWithRawResponse with_streaming_response: WhopWithStreamedResponse @@ -180,6 +184,8 @@ def __init__( self.support_channels = support_channels.SupportChannelsResource(self) self.experiences = experiences.ExperiencesResource(self) self.reactions = reactions.ReactionsResource(self) + self.members = members.MembersResource(self) + self.forums = forums.ForumsResource(self) self.with_raw_response = WhopWithRawResponse(self) self.with_streaming_response = WhopWithStreamedResponse(self) @@ -317,6 +323,8 @@ class AsyncWhop(AsyncAPIClient): support_channels: support_channels.AsyncSupportChannelsResource experiences: experiences.AsyncExperiencesResource reactions: reactions.AsyncReactionsResource + members: members.AsyncMembersResource + forums: forums.AsyncForumsResource with_raw_response: AsyncWhopWithRawResponse with_streaming_response: AsyncWhopWithStreamedResponse @@ -416,6 +424,8 @@ def __init__( self.support_channels = support_channels.AsyncSupportChannelsResource(self) self.experiences = experiences.AsyncExperiencesResource(self) self.reactions = reactions.AsyncReactionsResource(self) + self.members = members.AsyncMembersResource(self) + self.forums = forums.AsyncForumsResource(self) self.with_raw_response = AsyncWhopWithRawResponse(self) self.with_streaming_response = AsyncWhopWithStreamedResponse(self) @@ -557,6 +567,8 @@ def __init__(self, client: Whop) -> None: self.support_channels = support_channels.SupportChannelsResourceWithRawResponse(client.support_channels) self.experiences = experiences.ExperiencesResourceWithRawResponse(client.experiences) self.reactions = reactions.ReactionsResourceWithRawResponse(client.reactions) + self.members = members.MembersResourceWithRawResponse(client.members) + self.forums = forums.ForumsResourceWithRawResponse(client.forums) class AsyncWhopWithRawResponse: @@ -589,6 +601,8 @@ def __init__(self, client: AsyncWhop) -> None: self.support_channels = support_channels.AsyncSupportChannelsResourceWithRawResponse(client.support_channels) self.experiences = experiences.AsyncExperiencesResourceWithRawResponse(client.experiences) self.reactions = reactions.AsyncReactionsResourceWithRawResponse(client.reactions) + self.members = members.AsyncMembersResourceWithRawResponse(client.members) + self.forums = forums.AsyncForumsResourceWithRawResponse(client.forums) class WhopWithStreamedResponse: @@ -621,6 +635,8 @@ def __init__(self, client: Whop) -> None: self.support_channels = support_channels.SupportChannelsResourceWithStreamingResponse(client.support_channels) self.experiences = experiences.ExperiencesResourceWithStreamingResponse(client.experiences) self.reactions = reactions.ReactionsResourceWithStreamingResponse(client.reactions) + self.members = members.MembersResourceWithStreamingResponse(client.members) + self.forums = forums.ForumsResourceWithStreamingResponse(client.forums) class AsyncWhopWithStreamedResponse: @@ -657,6 +673,8 @@ def __init__(self, client: AsyncWhop) -> None: ) self.experiences = experiences.AsyncExperiencesResourceWithStreamingResponse(client.experiences) self.reactions = reactions.AsyncReactionsResourceWithStreamingResponse(client.reactions) + self.members = members.AsyncMembersResourceWithStreamingResponse(client.members) + self.forums = forums.AsyncForumsResourceWithStreamingResponse(client.forums) Client = Whop diff --git a/src/whop_sdk/resources/__init__.py b/src/whop_sdk/resources/__init__.py index 44113820..f3d55211 100644 --- a/src/whop_sdk/resources/__init__.py +++ b/src/whop_sdk/resources/__init__.py @@ -24,6 +24,14 @@ UsersResourceWithStreamingResponse, AsyncUsersResourceWithStreamingResponse, ) +from .forums import ( + ForumsResource, + AsyncForumsResource, + ForumsResourceWithRawResponse, + AsyncForumsResourceWithRawResponse, + ForumsResourceWithStreamingResponse, + AsyncForumsResourceWithStreamingResponse, +) from .entries import ( EntriesResource, AsyncEntriesResource, @@ -32,6 +40,14 @@ EntriesResourceWithStreamingResponse, AsyncEntriesResourceWithStreamingResponse, ) +from .members import ( + MembersResource, + AsyncMembersResource, + MembersResourceWithRawResponse, + AsyncMembersResourceWithRawResponse, + MembersResourceWithStreamingResponse, + AsyncMembersResourceWithStreamingResponse, +) from .invoices import ( InvoicesResource, AsyncInvoicesResource, @@ -313,4 +329,16 @@ "AsyncReactionsResourceWithRawResponse", "ReactionsResourceWithStreamingResponse", "AsyncReactionsResourceWithStreamingResponse", + "MembersResource", + "AsyncMembersResource", + "MembersResourceWithRawResponse", + "AsyncMembersResourceWithRawResponse", + "MembersResourceWithStreamingResponse", + "AsyncMembersResourceWithStreamingResponse", + "ForumsResource", + "AsyncForumsResource", + "ForumsResourceWithRawResponse", + "AsyncForumsResourceWithRawResponse", + "ForumsResourceWithStreamingResponse", + "AsyncForumsResourceWithStreamingResponse", ] diff --git a/src/whop_sdk/resources/forums.py b/src/whop_sdk/resources/forums.py new file mode 100644 index 00000000..57c19dfa --- /dev/null +++ b/src/whop_sdk/resources/forums.py @@ -0,0 +1,446 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import Optional + +import httpx + +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 .._compat import cached_property +from .._resource import SyncAPIResource, AsyncAPIResource +from .._response import ( + to_raw_response_wrapper, + to_streamed_response_wrapper, + async_to_raw_response_wrapper, + async_to_streamed_response_wrapper, +) +from ..pagination import SyncCursorPage, AsyncCursorPage +from .._base_client import AsyncPaginator, make_request_options +from ..types.shared.forum import Forum +from ..types.forum_list_response import ForumListResponse +from ..types.shared.who_can_post_types import WhoCanPostTypes +from ..types.shared.who_can_comment_types import WhoCanCommentTypes +from ..types.shared.email_notification_preferences import EmailNotificationPreferences + +__all__ = ["ForumsResource", "AsyncForumsResource"] + + +class ForumsResource(SyncAPIResource): + @cached_property + def with_raw_response(self) -> ForumsResourceWithRawResponse: + """ + This property can be used as a prefix for any HTTP method call to return + the raw response object instead of the parsed content. + + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers + """ + return ForumsResourceWithRawResponse(self) + + @cached_property + def with_streaming_response(self) -> ForumsResourceWithStreamingResponse: + """ + An alternative to `.with_raw_response` that doesn't eagerly read the response body. + + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response + """ + return ForumsResourceWithStreamingResponse(self) + + def retrieve( + self, + id: str, + *, + # 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, + ) -> Forum: + """ + Retrieves a forum + + Required permissions: + + - `forum:read` + + Args: + 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._get( + f"/forums/{id}", + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=Forum, + ) + + def update( + self, + id: str, + *, + email_notification_preference: Optional[EmailNotificationPreferences] | Omit = omit, + who_can_comment: Optional[WhoCanCommentTypes] | Omit = omit, + who_can_post: Optional[WhoCanPostTypes] | Omit = omit, + # 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, + ) -> Forum: + """ + Updates a forum + + Required permissions: + + - `forum:moderate` + + Args: + email_notification_preference: Email notification preference option for a forum feed + + who_can_comment: Who can comment on a forum feed + + who_can_post: Who can post on a forum feed + + 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._patch( + f"/forums/{id}", + body=maybe_transform( + { + "email_notification_preference": email_notification_preference, + "who_can_comment": who_can_comment, + "who_can_post": who_can_post, + }, + forum_update_params.ForumUpdateParams, + ), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=Forum, + ) + + def list( + self, + *, + company_id: str, + after: Optional[str] | Omit = omit, + before: Optional[str] | Omit = omit, + first: Optional[int] | Omit = omit, + last: Optional[int] | Omit = omit, + product_id: Optional[str] | Omit = omit, + # 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, + ) -> SyncCursorPage[ForumListResponse]: + """ + Lists forums inside a company + + Required permissions: + + - `forum:read` + + Args: + company_id: The ID of the company to list forums for + + after: Returns the elements in the list that come after the specified cursor. + + before: Returns the elements in the list that come before the specified cursor. + + first: Returns the first _n_ elements from the list. + + last: Returns the last _n_ elements from the list. + + product_id: If provided, only forums connected to this product are returned + + 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 + """ + return self._get_api_list( + "/forums", + page=SyncCursorPage[ForumListResponse], + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=maybe_transform( + { + "company_id": company_id, + "after": after, + "before": before, + "first": first, + "last": last, + "product_id": product_id, + }, + forum_list_params.ForumListParams, + ), + ), + model=ForumListResponse, + ) + + +class AsyncForumsResource(AsyncAPIResource): + @cached_property + def with_raw_response(self) -> AsyncForumsResourceWithRawResponse: + """ + This property can be used as a prefix for any HTTP method call to return + the raw response object instead of the parsed content. + + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers + """ + return AsyncForumsResourceWithRawResponse(self) + + @cached_property + def with_streaming_response(self) -> AsyncForumsResourceWithStreamingResponse: + """ + An alternative to `.with_raw_response` that doesn't eagerly read the response body. + + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response + """ + return AsyncForumsResourceWithStreamingResponse(self) + + async def retrieve( + self, + id: str, + *, + # 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, + ) -> Forum: + """ + Retrieves a forum + + Required permissions: + + - `forum:read` + + Args: + 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._get( + f"/forums/{id}", + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=Forum, + ) + + async def update( + self, + id: str, + *, + email_notification_preference: Optional[EmailNotificationPreferences] | Omit = omit, + who_can_comment: Optional[WhoCanCommentTypes] | Omit = omit, + who_can_post: Optional[WhoCanPostTypes] | Omit = omit, + # 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, + ) -> Forum: + """ + Updates a forum + + Required permissions: + + - `forum:moderate` + + Args: + email_notification_preference: Email notification preference option for a forum feed + + who_can_comment: Who can comment on a forum feed + + who_can_post: Who can post on a forum feed + + 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._patch( + f"/forums/{id}", + body=await async_maybe_transform( + { + "email_notification_preference": email_notification_preference, + "who_can_comment": who_can_comment, + "who_can_post": who_can_post, + }, + forum_update_params.ForumUpdateParams, + ), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=Forum, + ) + + def list( + self, + *, + company_id: str, + after: Optional[str] | Omit = omit, + before: Optional[str] | Omit = omit, + first: Optional[int] | Omit = omit, + last: Optional[int] | Omit = omit, + product_id: Optional[str] | Omit = omit, + # 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, + ) -> AsyncPaginator[ForumListResponse, AsyncCursorPage[ForumListResponse]]: + """ + Lists forums inside a company + + Required permissions: + + - `forum:read` + + Args: + company_id: The ID of the company to list forums for + + after: Returns the elements in the list that come after the specified cursor. + + before: Returns the elements in the list that come before the specified cursor. + + first: Returns the first _n_ elements from the list. + + last: Returns the last _n_ elements from the list. + + product_id: If provided, only forums connected to this product are returned + + 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 + """ + return self._get_api_list( + "/forums", + page=AsyncCursorPage[ForumListResponse], + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=maybe_transform( + { + "company_id": company_id, + "after": after, + "before": before, + "first": first, + "last": last, + "product_id": product_id, + }, + forum_list_params.ForumListParams, + ), + ), + model=ForumListResponse, + ) + + +class ForumsResourceWithRawResponse: + def __init__(self, forums: ForumsResource) -> None: + self._forums = forums + + self.retrieve = to_raw_response_wrapper( + forums.retrieve, + ) + self.update = to_raw_response_wrapper( + forums.update, + ) + self.list = to_raw_response_wrapper( + forums.list, + ) + + +class AsyncForumsResourceWithRawResponse: + def __init__(self, forums: AsyncForumsResource) -> None: + self._forums = forums + + self.retrieve = async_to_raw_response_wrapper( + forums.retrieve, + ) + self.update = async_to_raw_response_wrapper( + forums.update, + ) + self.list = async_to_raw_response_wrapper( + forums.list, + ) + + +class ForumsResourceWithStreamingResponse: + def __init__(self, forums: ForumsResource) -> None: + self._forums = forums + + self.retrieve = to_streamed_response_wrapper( + forums.retrieve, + ) + self.update = to_streamed_response_wrapper( + forums.update, + ) + self.list = to_streamed_response_wrapper( + forums.list, + ) + + +class AsyncForumsResourceWithStreamingResponse: + def __init__(self, forums: AsyncForumsResource) -> None: + self._forums = forums + + self.retrieve = async_to_streamed_response_wrapper( + forums.retrieve, + ) + self.update = async_to_streamed_response_wrapper( + forums.update, + ) + self.list = async_to_streamed_response_wrapper( + forums.list, + ) diff --git a/src/whop_sdk/resources/members.py b/src/whop_sdk/resources/members.py new file mode 100644 index 00000000..5cf6f0cf --- /dev/null +++ b/src/whop_sdk/resources/members.py @@ -0,0 +1,421 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import List, Union, Optional +from datetime import datetime +from typing_extensions import Literal + +import httpx + +from ..types import member_list_params +from .._types import Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given +from .._utils import maybe_transform +from .._compat import cached_property +from .._resource import SyncAPIResource, AsyncAPIResource +from .._response import ( + to_raw_response_wrapper, + to_streamed_response_wrapper, + async_to_raw_response_wrapper, + async_to_streamed_response_wrapper, +) +from ..pagination import SyncCursorPage, AsyncCursorPage +from .._base_client import AsyncPaginator, make_request_options +from ..types.shared.direction import Direction +from ..types.shared.access_level import AccessLevel +from ..types.member_list_response import MemberListResponse +from ..types.shared.member_statuses import MemberStatuses +from ..types.member_retrieve_response import MemberRetrieveResponse +from ..types.shared.member_most_recent_actions import MemberMostRecentActions + +__all__ = ["MembersResource", "AsyncMembersResource"] + + +class MembersResource(SyncAPIResource): + @cached_property + def with_raw_response(self) -> MembersResourceWithRawResponse: + """ + This property can be used as a prefix for any HTTP method call to return + the raw response object instead of the parsed content. + + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers + """ + return MembersResourceWithRawResponse(self) + + @cached_property + def with_streaming_response(self) -> MembersResourceWithStreamingResponse: + """ + An alternative to `.with_raw_response` that doesn't eagerly read the response body. + + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response + """ + return MembersResourceWithStreamingResponse(self) + + def retrieve( + self, + id: str, + *, + # 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, + ) -> MemberRetrieveResponse: + """ + Retrieves a member of a company by ID + + Required permissions: + + - `member:basic:read` + - `member:email:read` + - `member:phone:read` + + Args: + 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._get( + f"/members/{id}", + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=MemberRetrieveResponse, + ) + + def list( + self, + *, + company_id: str, + access_level: Optional[AccessLevel] | Omit = omit, + access_pass_ids: Optional[SequenceNotStr[str]] | Omit = omit, + after: Optional[str] | Omit = omit, + before: Optional[str] | Omit = omit, + created_after: Union[str, datetime, None] | Omit = omit, + created_before: Union[str, datetime, None] | Omit = omit, + direction: Optional[Direction] | Omit = omit, + first: Optional[int] | Omit = omit, + last: Optional[int] | Omit = omit, + most_recent_actions: Optional[List[MemberMostRecentActions]] | Omit = omit, + order: Optional[Literal["id", "usd_total_spent", "created_at", "joined_at", "most_recent_action"]] + | Omit = omit, + plan_ids: Optional[SequenceNotStr[str]] | Omit = omit, + promo_code_ids: Optional[SequenceNotStr[str]] | Omit = omit, + query: Optional[str] | Omit = omit, + statuses: Optional[List[MemberStatuses]] | Omit = omit, + # 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, + ) -> SyncCursorPage[MemberListResponse]: + """ + List the members of a company + + Required permissions: + + - `member:basic:read` + - `member:email:read` + - `member:phone:read` + + Args: + company_id: The ID of the company to list members for + + access_level: The access level a given user (or company) has to an access pass or company. + + access_pass_ids: The access pass IDs to filter the members by + + after: Returns the elements in the list that come after the specified cursor. + + before: Returns the elements in the list that come before the specified cursor. + + created_after: The minimum creation date to filter by + + created_before: The maximum creation date to filter by + + direction: The direction of the sort. + + first: Returns the first _n_ elements from the list. + + last: Returns the last _n_ elements from the list. + + most_recent_actions: The most recent actions to filter the members by + + order: Which columns can be used to sort. + + plan_ids: The plan IDs to filter the members by + + promo_code_ids: The promo code IDs to filter the members by + + query: The name, username, or email to filter the members by. The email filter will + only apply if the current actor has the `member:email:read` permission. + + statuses: The statuses to filter the members by + + 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 + """ + return self._get_api_list( + "/members", + page=SyncCursorPage[MemberListResponse], + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=maybe_transform( + { + "company_id": company_id, + "access_level": access_level, + "access_pass_ids": access_pass_ids, + "after": after, + "before": before, + "created_after": created_after, + "created_before": created_before, + "direction": direction, + "first": first, + "last": last, + "most_recent_actions": most_recent_actions, + "order": order, + "plan_ids": plan_ids, + "promo_code_ids": promo_code_ids, + "query": query, + "statuses": statuses, + }, + member_list_params.MemberListParams, + ), + ), + model=MemberListResponse, + ) + + +class AsyncMembersResource(AsyncAPIResource): + @cached_property + def with_raw_response(self) -> AsyncMembersResourceWithRawResponse: + """ + This property can be used as a prefix for any HTTP method call to return + the raw response object instead of the parsed content. + + For more information, see https://www.github.com/whopio/whopsdk-python#accessing-raw-response-data-eg-headers + """ + return AsyncMembersResourceWithRawResponse(self) + + @cached_property + def with_streaming_response(self) -> AsyncMembersResourceWithStreamingResponse: + """ + An alternative to `.with_raw_response` that doesn't eagerly read the response body. + + For more information, see https://www.github.com/whopio/whopsdk-python#with_streaming_response + """ + return AsyncMembersResourceWithStreamingResponse(self) + + async def retrieve( + self, + id: str, + *, + # 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, + ) -> MemberRetrieveResponse: + """ + Retrieves a member of a company by ID + + Required permissions: + + - `member:basic:read` + - `member:email:read` + - `member:phone:read` + + Args: + 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._get( + f"/members/{id}", + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=MemberRetrieveResponse, + ) + + def list( + self, + *, + company_id: str, + access_level: Optional[AccessLevel] | Omit = omit, + access_pass_ids: Optional[SequenceNotStr[str]] | Omit = omit, + after: Optional[str] | Omit = omit, + before: Optional[str] | Omit = omit, + created_after: Union[str, datetime, None] | Omit = omit, + created_before: Union[str, datetime, None] | Omit = omit, + direction: Optional[Direction] | Omit = omit, + first: Optional[int] | Omit = omit, + last: Optional[int] | Omit = omit, + most_recent_actions: Optional[List[MemberMostRecentActions]] | Omit = omit, + order: Optional[Literal["id", "usd_total_spent", "created_at", "joined_at", "most_recent_action"]] + | Omit = omit, + plan_ids: Optional[SequenceNotStr[str]] | Omit = omit, + promo_code_ids: Optional[SequenceNotStr[str]] | Omit = omit, + query: Optional[str] | Omit = omit, + statuses: Optional[List[MemberStatuses]] | Omit = omit, + # 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, + ) -> AsyncPaginator[MemberListResponse, AsyncCursorPage[MemberListResponse]]: + """ + List the members of a company + + Required permissions: + + - `member:basic:read` + - `member:email:read` + - `member:phone:read` + + Args: + company_id: The ID of the company to list members for + + access_level: The access level a given user (or company) has to an access pass or company. + + access_pass_ids: The access pass IDs to filter the members by + + after: Returns the elements in the list that come after the specified cursor. + + before: Returns the elements in the list that come before the specified cursor. + + created_after: The minimum creation date to filter by + + created_before: The maximum creation date to filter by + + direction: The direction of the sort. + + first: Returns the first _n_ elements from the list. + + last: Returns the last _n_ elements from the list. + + most_recent_actions: The most recent actions to filter the members by + + order: Which columns can be used to sort. + + plan_ids: The plan IDs to filter the members by + + promo_code_ids: The promo code IDs to filter the members by + + query: The name, username, or email to filter the members by. The email filter will + only apply if the current actor has the `member:email:read` permission. + + statuses: The statuses to filter the members by + + 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 + """ + return self._get_api_list( + "/members", + page=AsyncCursorPage[MemberListResponse], + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=maybe_transform( + { + "company_id": company_id, + "access_level": access_level, + "access_pass_ids": access_pass_ids, + "after": after, + "before": before, + "created_after": created_after, + "created_before": created_before, + "direction": direction, + "first": first, + "last": last, + "most_recent_actions": most_recent_actions, + "order": order, + "plan_ids": plan_ids, + "promo_code_ids": promo_code_ids, + "query": query, + "statuses": statuses, + }, + member_list_params.MemberListParams, + ), + ), + model=MemberListResponse, + ) + + +class MembersResourceWithRawResponse: + def __init__(self, members: MembersResource) -> None: + self._members = members + + self.retrieve = to_raw_response_wrapper( + members.retrieve, + ) + self.list = to_raw_response_wrapper( + members.list, + ) + + +class AsyncMembersResourceWithRawResponse: + def __init__(self, members: AsyncMembersResource) -> None: + self._members = members + + self.retrieve = async_to_raw_response_wrapper( + members.retrieve, + ) + self.list = async_to_raw_response_wrapper( + members.list, + ) + + +class MembersResourceWithStreamingResponse: + def __init__(self, members: MembersResource) -> None: + self._members = members + + self.retrieve = to_streamed_response_wrapper( + members.retrieve, + ) + self.list = to_streamed_response_wrapper( + members.list, + ) + + +class AsyncMembersResourceWithStreamingResponse: + def __init__(self, members: AsyncMembersResource) -> None: + self._members = members + + self.retrieve = async_to_streamed_response_wrapper( + members.retrieve, + ) + self.list = async_to_streamed_response_wrapper( + members.list, + ) diff --git a/src/whop_sdk/types/__init__.py b/src/whop_sdk/types/__init__.py index f1d170f3..a10186aa 100644 --- a/src/whop_sdk/types/__init__.py +++ b/src/whop_sdk/types/__init__.py @@ -6,6 +6,7 @@ App as App, Plan as Plan, Entry as Entry, + Forum as Forum, Company as Company, Invoice as Invoice, Message as Message, @@ -27,6 +28,7 @@ Membership as Membership, Visibility as Visibility, WhoCanPost as WhoCanPost, + AccessLevel as AccessLevel, AppStatuses as AppStatuses, AppViewType as AppViewType, ChatChannel as ChatChannel, @@ -39,22 +41,27 @@ ReceiptStatus as ReceiptStatus, ReleaseMethod as ReleaseMethod, AccessPassType as AccessPassType, + MemberStatuses as MemberStatuses, ShipmentStatus as ShipmentStatus, SupportChannel as SupportChannel, InvoiceListItem as InvoiceListItem, ProductListItem as ProductListItem, ShipmentCarrier as ShipmentCarrier, + WhoCanPostTypes as WhoCanPostTypes, AppBuildStatuses as AppBuildStatuses, CollectionMethod as CollectionMethod, MembershipStatus as MembershipStatus, VisibilityFilter as VisibilityFilter, AppBuildPlatforms as AppBuildPlatforms, ShipmentSubstatus as ShipmentSubstatus, + WhoCanCommentTypes as WhoCanCommentTypes, AuthorizedUserRoles as AuthorizedUserRoles, CheckoutConfiguration as CheckoutConfiguration, FriendlyReceiptStatus as FriendlyReceiptStatus, GlobalAffiliateStatus as GlobalAffiliateStatus, CourseLessonInteraction as CourseLessonInteraction, + MemberMostRecentActions as MemberMostRecentActions, + EmailNotificationPreferences as EmailNotificationPreferences, CourseLessonInteractionListItem as CourseLessonInteractionListItem, ) from .app_list_params import AppListParams as AppListParams @@ -63,14 +70,19 @@ from .app_list_response import AppListResponse as AppListResponse from .app_update_params import AppUpdateParams as AppUpdateParams from .entry_list_params import EntryListParams as EntryListParams +from .forum_list_params import ForumListParams as ForumListParams +from .member_list_params import MemberListParams as MemberListParams from .plan_create_params import PlanCreateParams as PlanCreateParams from .plan_list_response import PlanListResponse as PlanListResponse from .plan_update_params import PlanUpdateParams as PlanUpdateParams from .entry_list_response import EntryListResponse as EntryListResponse +from .forum_list_response import ForumListResponse as ForumListResponse +from .forum_update_params import ForumUpdateParams as ForumUpdateParams from .invoice_list_params import InvoiceListParams as InvoiceListParams from .message_list_params import MessageListParams as MessageListParams from .payment_list_params import PaymentListParams as PaymentListParams from .product_list_params import ProductListParams as ProductListParams +from .member_list_response import MemberListResponse as MemberListResponse from .plan_delete_response import PlanDeleteResponse as PlanDeleteResponse from .reaction_list_params import ReactionListParams as ReactionListParams from .shipment_list_params import ShipmentListParams as ShipmentListParams @@ -109,6 +121,7 @@ from .experience_update_params import ExperienceUpdateParams as ExperienceUpdateParams from .forum_post_create_params import ForumPostCreateParams as ForumPostCreateParams from .forum_post_list_response import ForumPostListResponse as ForumPostListResponse +from .member_retrieve_response import MemberRetrieveResponse as MemberRetrieveResponse from .membership_cancel_params import MembershipCancelParams as MembershipCancelParams from .membership_list_response import MembershipListResponse as MembershipListResponse from .membership_update_params import MembershipUpdateParams as MembershipUpdateParams diff --git a/src/whop_sdk/types/forum_list_params.py b/src/whop_sdk/types/forum_list_params.py new file mode 100644 index 00000000..1e8e6d53 --- /dev/null +++ b/src/whop_sdk/types/forum_list_params.py @@ -0,0 +1,28 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import Optional +from typing_extensions import Required, TypedDict + +__all__ = ["ForumListParams"] + + +class ForumListParams(TypedDict, total=False): + company_id: Required[str] + """The ID of the company to list forums for""" + + after: Optional[str] + """Returns the elements in the list that come after the specified cursor.""" + + before: Optional[str] + """Returns the elements in the list that come before the specified cursor.""" + + first: Optional[int] + """Returns the first _n_ elements from the list.""" + + last: Optional[int] + """Returns the last _n_ elements from the list.""" + + product_id: Optional[str] + """If provided, only forums connected to this product are returned""" diff --git a/src/whop_sdk/types/forum_list_response.py b/src/whop_sdk/types/forum_list_response.py new file mode 100644 index 00000000..c2baf84a --- /dev/null +++ b/src/whop_sdk/types/forum_list_response.py @@ -0,0 +1,33 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from .._models import BaseModel +from .shared.who_can_post_types import WhoCanPostTypes +from .shared.who_can_comment_types import WhoCanCommentTypes +from .shared.email_notification_preferences import EmailNotificationPreferences + +__all__ = ["ForumListResponse", "Experience"] + + +class Experience(BaseModel): + id: str + """The unique ID representing this experience""" + + name: str + """The written name of the description.""" + + +class ForumListResponse(BaseModel): + id: str + """The unique identifier for the entity""" + + email_notification_preference: EmailNotificationPreferences + """The email notification preference for this forum""" + + experience: Experience + """The experience for this forum""" + + who_can_comment: WhoCanCommentTypes + """Who can comment on this forum""" + + who_can_post: WhoCanPostTypes + """Who can post on this forum""" diff --git a/src/whop_sdk/types/forum_update_params.py b/src/whop_sdk/types/forum_update_params.py new file mode 100644 index 00000000..2e2a97bc --- /dev/null +++ b/src/whop_sdk/types/forum_update_params.py @@ -0,0 +1,23 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import Optional +from typing_extensions import TypedDict + +from .shared.who_can_post_types import WhoCanPostTypes +from .shared.who_can_comment_types import WhoCanCommentTypes +from .shared.email_notification_preferences import EmailNotificationPreferences + +__all__ = ["ForumUpdateParams"] + + +class ForumUpdateParams(TypedDict, total=False): + email_notification_preference: Optional[EmailNotificationPreferences] + """Email notification preference option for a forum feed""" + + who_can_comment: Optional[WhoCanCommentTypes] + """Who can comment on a forum feed""" + + who_can_post: Optional[WhoCanPostTypes] + """Who can post on a forum feed""" diff --git a/src/whop_sdk/types/member_list_params.py b/src/whop_sdk/types/member_list_params.py new file mode 100644 index 00000000..f139719e --- /dev/null +++ b/src/whop_sdk/types/member_list_params.py @@ -0,0 +1,70 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import List, Union, Optional +from datetime import datetime +from typing_extensions import Literal, Required, Annotated, TypedDict + +from .._types import SequenceNotStr +from .._utils import PropertyInfo +from .shared.direction import Direction +from .shared.access_level import AccessLevel +from .shared.member_statuses import MemberStatuses +from .shared.member_most_recent_actions import MemberMostRecentActions + +__all__ = ["MemberListParams"] + + +class MemberListParams(TypedDict, total=False): + company_id: Required[str] + """The ID of the company to list members for""" + + access_level: Optional[AccessLevel] + """The access level a given user (or company) has to an access pass or company.""" + + access_pass_ids: Optional[SequenceNotStr[str]] + """The access pass IDs to filter the members by""" + + after: Optional[str] + """Returns the elements in the list that come after the specified cursor.""" + + before: Optional[str] + """Returns the elements in the list that come before the specified cursor.""" + + created_after: Annotated[Union[str, datetime, None], PropertyInfo(format="iso8601")] + """The minimum creation date to filter by""" + + created_before: Annotated[Union[str, datetime, None], PropertyInfo(format="iso8601")] + """The maximum creation date to filter by""" + + direction: Optional[Direction] + """The direction of the sort.""" + + first: Optional[int] + """Returns the first _n_ elements from the list.""" + + last: Optional[int] + """Returns the last _n_ elements from the list.""" + + most_recent_actions: Optional[List[MemberMostRecentActions]] + """The most recent actions to filter the members by""" + + order: Optional[Literal["id", "usd_total_spent", "created_at", "joined_at", "most_recent_action"]] + """Which columns can be used to sort.""" + + plan_ids: Optional[SequenceNotStr[str]] + """The plan IDs to filter the members by""" + + promo_code_ids: Optional[SequenceNotStr[str]] + """The promo code IDs to filter the members by""" + + query: Optional[str] + """The name, username, or email to filter the members by. + + The email filter will only apply if the current actor has the + `member:email:read` permission. + """ + + statuses: Optional[List[MemberStatuses]] + """The statuses to filter the members by""" diff --git a/src/whop_sdk/types/member_list_response.py b/src/whop_sdk/types/member_list_response.py new file mode 100644 index 00000000..f1fb1708 --- /dev/null +++ b/src/whop_sdk/types/member_list_response.py @@ -0,0 +1,65 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import Optional +from datetime import datetime + +from .._models import BaseModel +from .shared.access_level import AccessLevel +from .shared.member_statuses import MemberStatuses +from .shared.member_most_recent_actions import MemberMostRecentActions + +__all__ = ["MemberListResponse", "User"] + + +class User(BaseModel): + id: str + """The internal ID of the user account.""" + + email: Optional[str] = None + """The digital mailing address of the user.""" + + name: Optional[str] = None + """The user's full name.""" + + username: str + """The whop username.""" + + +class MemberListResponse(BaseModel): + id: str + """The ID of the member""" + + access_level: AccessLevel + """The access level of the product member. + + If its admin, the member is an authorized user of the access pass. If its + customer, the member has a valid membership to the access pass. If its + no_access, the member does not have access to the access pass. + """ + + created_at: datetime + """When the member was created""" + + joined_at: datetime + """When the member joined the company""" + + most_recent_action: Optional[MemberMostRecentActions] = None + """The different most recent actions a member can have.""" + + most_recent_action_at: Optional[datetime] = None + """The time for the most recent action, if applicable.""" + + phone: Optional[str] = None + """The phone number for the member, if available.""" + + status: MemberStatuses + """The status of the member""" + + updated_at: datetime + """The timestamp of when this member was last updated""" + + usd_total_spent: float + """How much money this customer has spent on the company's products and plans""" + + user: Optional[User] = None + """The user for this member, if any.""" diff --git a/src/whop_sdk/types/member_retrieve_response.py b/src/whop_sdk/types/member_retrieve_response.py new file mode 100644 index 00000000..c45b1b62 --- /dev/null +++ b/src/whop_sdk/types/member_retrieve_response.py @@ -0,0 +1,79 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import Optional +from datetime import datetime + +from .._models import BaseModel +from .shared.access_level import AccessLevel +from .shared.member_statuses import MemberStatuses +from .shared.member_most_recent_actions import MemberMostRecentActions + +__all__ = ["MemberRetrieveResponse", "Company", "User"] + + +class Company(BaseModel): + id: str + """The ID of the company""" + + route: str + """The slug/route of the company on the Whop site.""" + + title: str + """The written name of the company.""" + + +class User(BaseModel): + id: str + """The internal ID of the user account.""" + + email: Optional[str] = None + """The digital mailing address of the user.""" + + name: Optional[str] = None + """The user's full name.""" + + username: str + """The whop username.""" + + +class MemberRetrieveResponse(BaseModel): + id: str + """The ID of the member""" + + access_level: AccessLevel + """The access level of the product member. + + If its admin, the member is an authorized user of the access pass. If its + customer, the member has a valid membership to the access pass. If its + no_access, the member does not have access to the access pass. + """ + + company: Company + """The company for the member.""" + + created_at: datetime + """When the member was created""" + + joined_at: datetime + """When the member joined the company""" + + most_recent_action: Optional[MemberMostRecentActions] = None + """The different most recent actions a member can have.""" + + most_recent_action_at: Optional[datetime] = None + """The time for the most recent action, if applicable.""" + + phone: Optional[str] = None + """The phone number for the member, if available.""" + + status: MemberStatuses + """The status of the member""" + + updated_at: datetime + """The timestamp of when this member was last updated""" + + usd_total_spent: float + """How much money this customer has spent on the company's products and plans""" + + user: Optional[User] = None + """The user for this member, if any.""" diff --git a/src/whop_sdk/types/shared/__init__.py b/src/whop_sdk/types/shared/__init__.py index 8738118d..e35962fe 100644 --- a/src/whop_sdk/types/shared/__init__.py +++ b/src/whop_sdk/types/shared/__init__.py @@ -3,6 +3,7 @@ from .app import App as App from .plan import Plan as Plan from .entry import Entry as Entry +from .forum import Forum as Forum from .company import Company as Company from .invoice import Invoice as Invoice from .message import Message as Message @@ -23,6 +24,7 @@ from .membership import Membership as Membership from .promo_type import PromoType as PromoType from .visibility import Visibility as Visibility +from .access_level import AccessLevel as AccessLevel from .app_statuses import AppStatuses as AppStatuses from .chat_channel import ChatChannel as ChatChannel from .entry_status import EntryStatus as EntryStatus @@ -35,6 +37,7 @@ from .invoice_status import InvoiceStatus as InvoiceStatus from .receipt_status import ReceiptStatus as ReceiptStatus from .release_method import ReleaseMethod as ReleaseMethod +from .member_statuses import MemberStatuses as MemberStatuses from .shipment_status import ShipmentStatus as ShipmentStatus from .support_channel import SupportChannel as SupportChannel from .access_pass_type import AccessPassType as AccessPassType @@ -46,10 +49,14 @@ from .visibility_filter import VisibilityFilter as VisibilityFilter from .app_build_statuses import AppBuildStatuses as AppBuildStatuses from .shipment_substatus import ShipmentSubstatus as ShipmentSubstatus +from .who_can_post_types import WhoCanPostTypes as WhoCanPostTypes from .app_build_platforms import AppBuildPlatforms as AppBuildPlatforms from .authorized_user_roles import AuthorizedUserRoles as AuthorizedUserRoles +from .who_can_comment_types import WhoCanCommentTypes as WhoCanCommentTypes from .checkout_configuration import CheckoutConfiguration as CheckoutConfiguration from .friendly_receipt_status import FriendlyReceiptStatus as FriendlyReceiptStatus from .global_affiliate_status import GlobalAffiliateStatus as GlobalAffiliateStatus from .course_lesson_interaction import CourseLessonInteraction as CourseLessonInteraction +from .member_most_recent_actions import MemberMostRecentActions as MemberMostRecentActions +from .email_notification_preferences import EmailNotificationPreferences as EmailNotificationPreferences from .course_lesson_interaction_list_item import CourseLessonInteractionListItem as CourseLessonInteractionListItem diff --git a/src/whop_sdk/types/shared/access_level.py b/src/whop_sdk/types/shared/access_level.py new file mode 100644 index 00000000..f5dd8ca1 --- /dev/null +++ b/src/whop_sdk/types/shared/access_level.py @@ -0,0 +1,7 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing_extensions import Literal, TypeAlias + +__all__ = ["AccessLevel"] + +AccessLevel: TypeAlias = Literal["no_access", "admin", "customer"] diff --git a/src/whop_sdk/types/shared/email_notification_preferences.py b/src/whop_sdk/types/shared/email_notification_preferences.py new file mode 100644 index 00000000..2ab81c77 --- /dev/null +++ b/src/whop_sdk/types/shared/email_notification_preferences.py @@ -0,0 +1,7 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing_extensions import Literal, TypeAlias + +__all__ = ["EmailNotificationPreferences"] + +EmailNotificationPreferences: TypeAlias = Literal["all_admin_posts", "only_weekly_summary", "none"] diff --git a/src/whop_sdk/types/shared/forum.py b/src/whop_sdk/types/shared/forum.py new file mode 100644 index 00000000..0f9202f4 --- /dev/null +++ b/src/whop_sdk/types/shared/forum.py @@ -0,0 +1,33 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from ..._models import BaseModel +from .who_can_post_types import WhoCanPostTypes +from .who_can_comment_types import WhoCanCommentTypes +from .email_notification_preferences import EmailNotificationPreferences + +__all__ = ["Forum", "Experience"] + + +class Experience(BaseModel): + id: str + """The unique ID representing this experience""" + + name: str + """The written name of the description.""" + + +class Forum(BaseModel): + id: str + """The unique identifier for the entity""" + + email_notification_preference: EmailNotificationPreferences + """The email notification preference for this forum""" + + experience: Experience + """The experience for this forum""" + + who_can_comment: WhoCanCommentTypes + """Who can comment on this forum""" + + who_can_post: WhoCanPostTypes + """Who can post on this forum""" diff --git a/src/whop_sdk/types/shared/member_most_recent_actions.py b/src/whop_sdk/types/shared/member_most_recent_actions.py new file mode 100644 index 00000000..4c102e4f --- /dev/null +++ b/src/whop_sdk/types/shared/member_most_recent_actions.py @@ -0,0 +1,22 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing_extensions import Literal, TypeAlias + +__all__ = ["MemberMostRecentActions"] + +MemberMostRecentActions: TypeAlias = Literal[ + "canceling", + "churned", + "finished_split_pay", + "paused", + "paid_subscriber", + "paid_once", + "expiring", + "joined", + "drafted", + "left", + "trialing", + "pending_entry", + "renewing", + "past_due", +] diff --git a/src/whop_sdk/types/shared/member_statuses.py b/src/whop_sdk/types/shared/member_statuses.py new file mode 100644 index 00000000..a3616845 --- /dev/null +++ b/src/whop_sdk/types/shared/member_statuses.py @@ -0,0 +1,7 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing_extensions import Literal, TypeAlias + +__all__ = ["MemberStatuses"] + +MemberStatuses: TypeAlias = Literal["drafted", "joined", "left"] diff --git a/src/whop_sdk/types/shared/who_can_comment_types.py b/src/whop_sdk/types/shared/who_can_comment_types.py new file mode 100644 index 00000000..6512c5f5 --- /dev/null +++ b/src/whop_sdk/types/shared/who_can_comment_types.py @@ -0,0 +1,7 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing_extensions import Literal, TypeAlias + +__all__ = ["WhoCanCommentTypes"] + +WhoCanCommentTypes: TypeAlias = Literal["everyone", "admins"] diff --git a/src/whop_sdk/types/shared/who_can_post_types.py b/src/whop_sdk/types/shared/who_can_post_types.py new file mode 100644 index 00000000..ac315cb6 --- /dev/null +++ b/src/whop_sdk/types/shared/who_can_post_types.py @@ -0,0 +1,7 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing_extensions import Literal, TypeAlias + +__all__ = ["WhoCanPostTypes"] + +WhoCanPostTypes: TypeAlias = Literal["everyone", "admins"] diff --git a/src/whop_sdk/types/shared_params/__init__.py b/src/whop_sdk/types/shared_params/__init__.py index aeba1edc..c6e79558 100644 --- a/src/whop_sdk/types/shared_params/__init__.py +++ b/src/whop_sdk/types/shared_params/__init__.py @@ -6,6 +6,7 @@ from .plan_type import PlanType as PlanType from .custom_cta import CustomCta as CustomCta from .visibility import Visibility as Visibility +from .access_level import AccessLevel as AccessLevel from .app_statuses import AppStatuses as AppStatuses from .entry_status import EntryStatus as EntryStatus from .who_can_post import WhoCanPost as WhoCanPost @@ -16,12 +17,17 @@ from .invoice_status import InvoiceStatus as InvoiceStatus from .receipt_status import ReceiptStatus as ReceiptStatus from .release_method import ReleaseMethod as ReleaseMethod +from .member_statuses import MemberStatuses as MemberStatuses from .access_pass_type import AccessPassType as AccessPassType from .collection_method import CollectionMethod as CollectionMethod from .membership_status import MembershipStatus as MembershipStatus from .visibility_filter import VisibilityFilter as VisibilityFilter from .app_build_statuses import AppBuildStatuses as AppBuildStatuses +from .who_can_post_types import WhoCanPostTypes as WhoCanPostTypes from .app_build_platforms import AppBuildPlatforms as AppBuildPlatforms from .authorized_user_roles import AuthorizedUserRoles as AuthorizedUserRoles +from .who_can_comment_types import WhoCanCommentTypes as WhoCanCommentTypes from .friendly_receipt_status import FriendlyReceiptStatus as FriendlyReceiptStatus from .global_affiliate_status import GlobalAffiliateStatus as GlobalAffiliateStatus +from .member_most_recent_actions import MemberMostRecentActions as MemberMostRecentActions +from .email_notification_preferences import EmailNotificationPreferences as EmailNotificationPreferences diff --git a/src/whop_sdk/types/shared_params/access_level.py b/src/whop_sdk/types/shared_params/access_level.py new file mode 100644 index 00000000..79610b07 --- /dev/null +++ b/src/whop_sdk/types/shared_params/access_level.py @@ -0,0 +1,9 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing_extensions import Literal, TypeAlias + +__all__ = ["AccessLevel"] + +AccessLevel: TypeAlias = Literal["no_access", "admin", "customer"] diff --git a/src/whop_sdk/types/shared_params/email_notification_preferences.py b/src/whop_sdk/types/shared_params/email_notification_preferences.py new file mode 100644 index 00000000..a745925b --- /dev/null +++ b/src/whop_sdk/types/shared_params/email_notification_preferences.py @@ -0,0 +1,9 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing_extensions import Literal, TypeAlias + +__all__ = ["EmailNotificationPreferences"] + +EmailNotificationPreferences: TypeAlias = Literal["all_admin_posts", "only_weekly_summary", "none"] diff --git a/src/whop_sdk/types/shared_params/member_most_recent_actions.py b/src/whop_sdk/types/shared_params/member_most_recent_actions.py new file mode 100644 index 00000000..5f666c8c --- /dev/null +++ b/src/whop_sdk/types/shared_params/member_most_recent_actions.py @@ -0,0 +1,24 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing_extensions import Literal, TypeAlias + +__all__ = ["MemberMostRecentActions"] + +MemberMostRecentActions: TypeAlias = Literal[ + "canceling", + "churned", + "finished_split_pay", + "paused", + "paid_subscriber", + "paid_once", + "expiring", + "joined", + "drafted", + "left", + "trialing", + "pending_entry", + "renewing", + "past_due", +] diff --git a/src/whop_sdk/types/shared_params/member_statuses.py b/src/whop_sdk/types/shared_params/member_statuses.py new file mode 100644 index 00000000..cb6d01f9 --- /dev/null +++ b/src/whop_sdk/types/shared_params/member_statuses.py @@ -0,0 +1,9 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing_extensions import Literal, TypeAlias + +__all__ = ["MemberStatuses"] + +MemberStatuses: TypeAlias = Literal["drafted", "joined", "left"] diff --git a/src/whop_sdk/types/shared_params/who_can_comment_types.py b/src/whop_sdk/types/shared_params/who_can_comment_types.py new file mode 100644 index 00000000..c9cd36fe --- /dev/null +++ b/src/whop_sdk/types/shared_params/who_can_comment_types.py @@ -0,0 +1,9 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing_extensions import Literal, TypeAlias + +__all__ = ["WhoCanCommentTypes"] + +WhoCanCommentTypes: TypeAlias = Literal["everyone", "admins"] diff --git a/src/whop_sdk/types/shared_params/who_can_post_types.py b/src/whop_sdk/types/shared_params/who_can_post_types.py new file mode 100644 index 00000000..bba45e1a --- /dev/null +++ b/src/whop_sdk/types/shared_params/who_can_post_types.py @@ -0,0 +1,9 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing_extensions import Literal, TypeAlias + +__all__ = ["WhoCanPostTypes"] + +WhoCanPostTypes: TypeAlias = Literal["everyone", "admins"] diff --git a/src/whop_sdk/types/user_check_access_response.py b/src/whop_sdk/types/user_check_access_response.py index bf382cc0..2f56acf0 100644 --- a/src/whop_sdk/types/user_check_access_response.py +++ b/src/whop_sdk/types/user_check_access_response.py @@ -1,14 +1,13 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -from typing_extensions import Literal - from .._models import BaseModel +from .shared.access_level import AccessLevel __all__ = ["UserCheckAccessResponse"] class UserCheckAccessResponse(BaseModel): - access_level: Literal["no_access", "admin", "customer"] + access_level: AccessLevel """The permission level of the user""" has_access: bool diff --git a/tests/api_resources/test_forums.py b/tests/api_resources/test_forums.py new file mode 100644 index 00000000..83f4a8c5 --- /dev/null +++ b/tests/api_resources/test_forums.py @@ -0,0 +1,310 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +import os +from typing import Any, cast + +import pytest + +from whop_sdk import Whop, AsyncWhop +from tests.utils import assert_matches_type +from whop_sdk.types import ForumListResponse +from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage +from whop_sdk.types.shared import Forum + +base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") + + +class TestForums: + parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"]) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + def test_method_retrieve(self, client: Whop) -> None: + forum = client.forums.retrieve( + "id", + ) + assert_matches_type(Forum, forum, path=["response"]) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + def test_raw_response_retrieve(self, client: Whop) -> None: + response = client.forums.with_raw_response.retrieve( + "id", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + forum = response.parse() + assert_matches_type(Forum, forum, path=["response"]) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + def test_streaming_response_retrieve(self, client: Whop) -> None: + with client.forums.with_streaming_response.retrieve( + "id", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + forum = response.parse() + assert_matches_type(Forum, forum, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + def test_path_params_retrieve(self, client: Whop) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): + client.forums.with_raw_response.retrieve( + "", + ) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + def test_method_update(self, client: Whop) -> None: + forum = client.forums.update( + id="id", + ) + assert_matches_type(Forum, forum, path=["response"]) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + def test_method_update_with_all_params(self, client: Whop) -> None: + forum = client.forums.update( + id="id", + email_notification_preference="all_admin_posts", + who_can_comment="everyone", + who_can_post="everyone", + ) + assert_matches_type(Forum, forum, path=["response"]) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + def test_raw_response_update(self, client: Whop) -> None: + response = client.forums.with_raw_response.update( + id="id", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + forum = response.parse() + assert_matches_type(Forum, forum, path=["response"]) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + def test_streaming_response_update(self, client: Whop) -> None: + with client.forums.with_streaming_response.update( + id="id", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + forum = response.parse() + assert_matches_type(Forum, forum, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + def test_path_params_update(self, client: Whop) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): + client.forums.with_raw_response.update( + id="", + ) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + def test_method_list(self, client: Whop) -> None: + forum = client.forums.list( + company_id="biz_xxxxxxxxxxxxxx", + ) + assert_matches_type(SyncCursorPage[ForumListResponse], forum, path=["response"]) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + def test_method_list_with_all_params(self, client: Whop) -> None: + forum = client.forums.list( + company_id="biz_xxxxxxxxxxxxxx", + after="after", + before="before", + first=42, + last=42, + product_id="prod_xxxxxxxxxxxxx", + ) + assert_matches_type(SyncCursorPage[ForumListResponse], forum, path=["response"]) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + def test_raw_response_list(self, client: Whop) -> None: + response = client.forums.with_raw_response.list( + company_id="biz_xxxxxxxxxxxxxx", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + forum = response.parse() + assert_matches_type(SyncCursorPage[ForumListResponse], forum, path=["response"]) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + def test_streaming_response_list(self, client: Whop) -> None: + with client.forums.with_streaming_response.list( + company_id="biz_xxxxxxxxxxxxxx", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + forum = response.parse() + assert_matches_type(SyncCursorPage[ForumListResponse], forum, path=["response"]) + + assert cast(Any, response.is_closed) is True + + +class TestAsyncForums: + parametrize = pytest.mark.parametrize( + "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"] + ) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + async def test_method_retrieve(self, async_client: AsyncWhop) -> None: + forum = await async_client.forums.retrieve( + "id", + ) + assert_matches_type(Forum, forum, path=["response"]) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + async def test_raw_response_retrieve(self, async_client: AsyncWhop) -> None: + response = await async_client.forums.with_raw_response.retrieve( + "id", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + forum = await response.parse() + assert_matches_type(Forum, forum, path=["response"]) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + async def test_streaming_response_retrieve(self, async_client: AsyncWhop) -> None: + async with async_client.forums.with_streaming_response.retrieve( + "id", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + forum = await response.parse() + assert_matches_type(Forum, forum, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + async def test_path_params_retrieve(self, async_client: AsyncWhop) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): + await async_client.forums.with_raw_response.retrieve( + "", + ) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + async def test_method_update(self, async_client: AsyncWhop) -> None: + forum = await async_client.forums.update( + id="id", + ) + assert_matches_type(Forum, forum, path=["response"]) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + async def test_method_update_with_all_params(self, async_client: AsyncWhop) -> None: + forum = await async_client.forums.update( + id="id", + email_notification_preference="all_admin_posts", + who_can_comment="everyone", + who_can_post="everyone", + ) + assert_matches_type(Forum, forum, path=["response"]) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + async def test_raw_response_update(self, async_client: AsyncWhop) -> None: + response = await async_client.forums.with_raw_response.update( + id="id", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + forum = await response.parse() + assert_matches_type(Forum, forum, path=["response"]) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + async def test_streaming_response_update(self, async_client: AsyncWhop) -> None: + async with async_client.forums.with_streaming_response.update( + id="id", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + forum = await response.parse() + assert_matches_type(Forum, forum, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + async def test_path_params_update(self, async_client: AsyncWhop) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): + await async_client.forums.with_raw_response.update( + id="", + ) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + async def test_method_list(self, async_client: AsyncWhop) -> None: + forum = await async_client.forums.list( + company_id="biz_xxxxxxxxxxxxxx", + ) + assert_matches_type(AsyncCursorPage[ForumListResponse], forum, path=["response"]) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + async def test_method_list_with_all_params(self, async_client: AsyncWhop) -> None: + forum = await async_client.forums.list( + company_id="biz_xxxxxxxxxxxxxx", + after="after", + before="before", + first=42, + last=42, + product_id="prod_xxxxxxxxxxxxx", + ) + assert_matches_type(AsyncCursorPage[ForumListResponse], forum, path=["response"]) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + async def test_raw_response_list(self, async_client: AsyncWhop) -> None: + response = await async_client.forums.with_raw_response.list( + company_id="biz_xxxxxxxxxxxxxx", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + forum = await response.parse() + assert_matches_type(AsyncCursorPage[ForumListResponse], forum, path=["response"]) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + async def test_streaming_response_list(self, async_client: AsyncWhop) -> None: + async with async_client.forums.with_streaming_response.list( + company_id="biz_xxxxxxxxxxxxxx", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + forum = await response.parse() + assert_matches_type(AsyncCursorPage[ForumListResponse], forum, path=["response"]) + + assert cast(Any, response.is_closed) is True diff --git a/tests/api_resources/test_members.py b/tests/api_resources/test_members.py new file mode 100644 index 00000000..fc600750 --- /dev/null +++ b/tests/api_resources/test_members.py @@ -0,0 +1,224 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +import os +from typing import Any, cast + +import pytest + +from whop_sdk import Whop, AsyncWhop +from tests.utils import assert_matches_type +from whop_sdk.types import MemberListResponse, MemberRetrieveResponse +from whop_sdk._utils import parse_datetime +from whop_sdk.pagination import SyncCursorPage, AsyncCursorPage + +base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") + + +class TestMembers: + parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"]) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + def test_method_retrieve(self, client: Whop) -> None: + member = client.members.retrieve( + "id", + ) + assert_matches_type(MemberRetrieveResponse, member, path=["response"]) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + def test_raw_response_retrieve(self, client: Whop) -> None: + response = client.members.with_raw_response.retrieve( + "id", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + member = response.parse() + assert_matches_type(MemberRetrieveResponse, member, path=["response"]) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + def test_streaming_response_retrieve(self, client: Whop) -> None: + with client.members.with_streaming_response.retrieve( + "id", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + member = response.parse() + assert_matches_type(MemberRetrieveResponse, member, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + def test_path_params_retrieve(self, client: Whop) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): + client.members.with_raw_response.retrieve( + "", + ) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + def test_method_list(self, client: Whop) -> None: + member = client.members.list( + company_id="biz_xxxxxxxxxxxxxx", + ) + assert_matches_type(SyncCursorPage[MemberListResponse], member, path=["response"]) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + def test_method_list_with_all_params(self, client: Whop) -> None: + member = client.members.list( + company_id="biz_xxxxxxxxxxxxxx", + access_level="no_access", + access_pass_ids=["string"], + after="after", + before="before", + created_after=parse_datetime("2023-12-01T05:00:00.401Z"), + created_before=parse_datetime("2023-12-01T05:00:00.401Z"), + direction="asc", + first=42, + last=42, + most_recent_actions=["canceling"], + order="id", + plan_ids=["string"], + promo_code_ids=["string"], + query="query", + statuses=["drafted"], + ) + assert_matches_type(SyncCursorPage[MemberListResponse], member, path=["response"]) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + def test_raw_response_list(self, client: Whop) -> None: + response = client.members.with_raw_response.list( + company_id="biz_xxxxxxxxxxxxxx", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + member = response.parse() + assert_matches_type(SyncCursorPage[MemberListResponse], member, path=["response"]) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + def test_streaming_response_list(self, client: Whop) -> None: + with client.members.with_streaming_response.list( + company_id="biz_xxxxxxxxxxxxxx", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + member = response.parse() + assert_matches_type(SyncCursorPage[MemberListResponse], member, path=["response"]) + + assert cast(Any, response.is_closed) is True + + +class TestAsyncMembers: + parametrize = pytest.mark.parametrize( + "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"] + ) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + async def test_method_retrieve(self, async_client: AsyncWhop) -> None: + member = await async_client.members.retrieve( + "id", + ) + assert_matches_type(MemberRetrieveResponse, member, path=["response"]) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + async def test_raw_response_retrieve(self, async_client: AsyncWhop) -> None: + response = await async_client.members.with_raw_response.retrieve( + "id", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + member = await response.parse() + assert_matches_type(MemberRetrieveResponse, member, path=["response"]) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + async def test_streaming_response_retrieve(self, async_client: AsyncWhop) -> None: + async with async_client.members.with_streaming_response.retrieve( + "id", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + member = await response.parse() + assert_matches_type(MemberRetrieveResponse, member, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + async def test_path_params_retrieve(self, async_client: AsyncWhop) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"): + await async_client.members.with_raw_response.retrieve( + "", + ) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + async def test_method_list(self, async_client: AsyncWhop) -> None: + member = await async_client.members.list( + company_id="biz_xxxxxxxxxxxxxx", + ) + assert_matches_type(AsyncCursorPage[MemberListResponse], member, path=["response"]) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + async def test_method_list_with_all_params(self, async_client: AsyncWhop) -> None: + member = await async_client.members.list( + company_id="biz_xxxxxxxxxxxxxx", + access_level="no_access", + access_pass_ids=["string"], + after="after", + before="before", + created_after=parse_datetime("2023-12-01T05:00:00.401Z"), + created_before=parse_datetime("2023-12-01T05:00:00.401Z"), + direction="asc", + first=42, + last=42, + most_recent_actions=["canceling"], + order="id", + plan_ids=["string"], + promo_code_ids=["string"], + query="query", + statuses=["drafted"], + ) + assert_matches_type(AsyncCursorPage[MemberListResponse], member, path=["response"]) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + async def test_raw_response_list(self, async_client: AsyncWhop) -> None: + response = await async_client.members.with_raw_response.list( + company_id="biz_xxxxxxxxxxxxxx", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + member = await response.parse() + assert_matches_type(AsyncCursorPage[MemberListResponse], member, path=["response"]) + + @pytest.mark.skip(reason="Prism tests are disabled") + @parametrize + async def test_streaming_response_list(self, async_client: AsyncWhop) -> None: + async with async_client.members.with_streaming_response.list( + company_id="biz_xxxxxxxxxxxxxx", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + member = await response.parse() + assert_matches_type(AsyncCursorPage[MemberListResponse], member, path=["response"]) + + assert cast(Any, response.is_closed) is True From cb2935feaef3aa0fe324bf2bb2bb193c96b12275 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 17 Oct 2025 13:24:44 +0000 Subject: [PATCH 10/17] feat(api): api update --- .stats.yml | 4 ++-- src/whop_sdk/resources/plans.py | 14 ++++++++++---- src/whop_sdk/types/invoice_create_params.py | 12 ++++++++++-- src/whop_sdk/types/plan_create_params.py | 12 ++++++++++-- 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/.stats.yml b/.stats.yml index 225b5482..a9cb37ff 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 81 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-5aff848f75cde8300a1b01c1ebebded1c34bcd85fafc8d26f4204734ddcd7033.yml -openapi_spec_hash: 50a91399b8d58d89ca97d3007571a5fa +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-5b3a4ecdbb658015a67b0abd3dce61a538a2b83ba09d682e1397fdd2635f0582.yml +openapi_spec_hash: b46f39bc2a57e1596c7dbafd6b8f2068 config_hash: 335abeb0dd84526555f7d83ddb84af97 diff --git a/src/whop_sdk/resources/plans.py b/src/whop_sdk/resources/plans.py index d536a330..873be659 100644 --- a/src/whop_sdk/resources/plans.py +++ b/src/whop_sdk/resources/plans.py @@ -107,7 +107,9 @@ def create( image: An image for the plan. This will be visible on the product page to customers. - initial_price: An additional amount charged upon first purchase. + initial_price: An additional amount charged upon first purchase. Use only if a one time payment + OR you want to charge an additional amount on top of the renewal price. Provided + as a number in dollars. Eg: 10.43 for $10.43 internal_notes: A personal description or notes section for the business. @@ -118,7 +120,8 @@ def create( release_method: The methods of how a plan can be released. - renewal_price: The amount the customer is charged every billing period. + renewal_price: The amount the customer is charged every billing period. Use only if a recurring + payment. Provided as a number in dollars. Eg: 10.43 for $10.43 title: The title of the plan. This will be visible on the product page to customers. @@ -501,7 +504,9 @@ async def create( image: An image for the plan. This will be visible on the product page to customers. - initial_price: An additional amount charged upon first purchase. + initial_price: An additional amount charged upon first purchase. Use only if a one time payment + OR you want to charge an additional amount on top of the renewal price. Provided + as a number in dollars. Eg: 10.43 for $10.43 internal_notes: A personal description or notes section for the business. @@ -512,7 +517,8 @@ async def create( release_method: The methods of how a plan can be released. - renewal_price: The amount the customer is charged every billing period. + renewal_price: The amount the customer is charged every billing period. Use only if a recurring + payment. Provided as a number in dollars. Eg: 10.43 for $10.43 title: The title of the plan. This will be visible on the product page to customers. diff --git a/src/whop_sdk/types/invoice_create_params.py b/src/whop_sdk/types/invoice_create_params.py index a5cef691..803f0ccb 100644 --- a/src/whop_sdk/types/invoice_create_params.py +++ b/src/whop_sdk/types/invoice_create_params.py @@ -108,7 +108,11 @@ class Plan(TypedDict, total=False): """The interval at which the plan charges (expiration plans).""" initial_price: Optional[float] - """An additional amount charged upon first purchase.""" + """An additional amount charged upon first purchase. + + Use only if a one time payment OR you want to charge an additional amount on top + of the renewal price. Provided as a number in dollars. Eg: 10.43 for $10.43 + """ internal_notes: Optional[str] """A personal description or notes section for the business.""" @@ -120,7 +124,11 @@ class Plan(TypedDict, total=False): """The methods of how a plan can be released.""" renewal_price: Optional[float] - """The amount the customer is charged every billing period.""" + """The amount the customer is charged every billing period. + + Use only if a recurring payment. Provided as a number in dollars. Eg: 10.43 for + $10.43 + """ trial_period_days: Optional[int] """The number of free trial days added before a renewal plan.""" diff --git a/src/whop_sdk/types/plan_create_params.py b/src/whop_sdk/types/plan_create_params.py index 3de2cab1..04aee462 100644 --- a/src/whop_sdk/types/plan_create_params.py +++ b/src/whop_sdk/types/plan_create_params.py @@ -40,7 +40,11 @@ class PlanCreateParams(TypedDict, total=False): """An image for the plan. This will be visible on the product page to customers.""" initial_price: Optional[float] - """An additional amount charged upon first purchase.""" + """An additional amount charged upon first purchase. + + Use only if a one time payment OR you want to charge an additional amount on top + of the renewal price. Provided as a number in dollars. Eg: 10.43 for $10.43 + """ internal_notes: Optional[str] """A personal description or notes section for the business.""" @@ -58,7 +62,11 @@ class PlanCreateParams(TypedDict, total=False): """The methods of how a plan can be released.""" renewal_price: Optional[float] - """The amount the customer is charged every billing period.""" + """The amount the customer is charged every billing period. + + Use only if a recurring payment. Provided as a number in dollars. Eg: 10.43 for + $10.43 + """ title: Optional[str] """The title of the plan. This will be visible on the product page to customers.""" From a946c15a8d418258f8d259714e725922e44c9389 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 18 Oct 2025 02:20:11 +0000 Subject: [PATCH 11/17] chore: bump `httpx-aiohttp` version to 0.1.9 --- pyproject.toml | 2 +- requirements-dev.lock | 2 +- requirements.lock | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index bc987eb1..c3788c26 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,7 @@ Homepage = "https://github.com/whopio/whopsdk-python" Repository = "https://github.com/whopio/whopsdk-python" [project.optional-dependencies] -aiohttp = ["aiohttp", "httpx_aiohttp>=0.1.8"] +aiohttp = ["aiohttp", "httpx_aiohttp>=0.1.9"] webhooks = ["standardwebhooks"] [tool.rye] diff --git a/requirements-dev.lock b/requirements-dev.lock index a64267f8..ffac584f 100644 --- a/requirements-dev.lock +++ b/requirements-dev.lock @@ -60,7 +60,7 @@ httpx==0.28.1 # via respx # via standardwebhooks # via whop-sdk -httpx-aiohttp==0.1.8 +httpx-aiohttp==0.1.9 # via whop-sdk idna==3.4 # via anyio diff --git a/requirements.lock b/requirements.lock index 62e1973c..2f47ddb5 100644 --- a/requirements.lock +++ b/requirements.lock @@ -47,7 +47,7 @@ httpx==0.28.1 # via httpx-aiohttp # via standardwebhooks # via whop-sdk -httpx-aiohttp==0.1.8 +httpx-aiohttp==0.1.9 # via whop-sdk idna==3.4 # via anyio From f05be6fd65bbd8fca4400d2e38e727153a72de43 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 21 Oct 2025 17:24:29 +0000 Subject: [PATCH 12/17] feat(api): api update --- .stats.yml | 4 +-- src/whop_sdk/types/app_list_response.py | 17 ++++++++++- .../types/experience_list_response.py | 28 ++++++++++++++++++- src/whop_sdk/types/shared/app.py | 26 ++++++++++++++++- src/whop_sdk/types/shared/company.py | 16 ++++++++++- src/whop_sdk/types/shared/experience.py | 28 ++++++++++++++++++- src/whop_sdk/types/user_retrieve_response.py | 13 ++++++++- 7 files changed, 124 insertions(+), 8 deletions(-) diff --git a/.stats.yml b/.stats.yml index a9cb37ff..c7768168 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 81 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-5b3a4ecdbb658015a67b0abd3dce61a538a2b83ba09d682e1397fdd2635f0582.yml -openapi_spec_hash: b46f39bc2a57e1596c7dbafd6b8f2068 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-cbc6845e3fd18db375851706ba67949f7066112df50300bf2de8b7c84a07c104.yml +openapi_spec_hash: 0e91e81087a5de73d54e50147cc6cfd7 config_hash: 335abeb0dd84526555f7d83ddb84af97 diff --git a/src/whop_sdk/types/app_list_response.py b/src/whop_sdk/types/app_list_response.py index 09b1f1ff..cd049343 100644 --- a/src/whop_sdk/types/app_list_response.py +++ b/src/whop_sdk/types/app_list_response.py @@ -5,7 +5,7 @@ from .._models import BaseModel from .shared.app_statuses import AppStatuses -__all__ = ["AppListResponse", "Company", "Creator"] +__all__ = ["AppListResponse", "Company", "Creator", "Icon"] class Company(BaseModel): @@ -27,6 +27,14 @@ class Creator(BaseModel): """The username of the user from their Whop account.""" +class Icon(BaseModel): + url: Optional[str] = None + """This is the URL you use to render optimized attachments on the client. + + This should be used for apps. + """ + + class AppListResponse(BaseModel): id: str """The ID of the app""" @@ -71,6 +79,13 @@ class AppListResponse(BaseModel): /experiences/[experienceId] """ + icon: Optional[Icon] = None + """The icon for the app. + + This icon is shown on discovery, on the product page, on checkout, and as a + default icon for the experiences. + """ + name: str """The name of the app""" diff --git a/src/whop_sdk/types/experience_list_response.py b/src/whop_sdk/types/experience_list_response.py index 13c5444e..1322df0d 100644 --- a/src/whop_sdk/types/experience_list_response.py +++ b/src/whop_sdk/types/experience_list_response.py @@ -5,13 +5,28 @@ from .._models import BaseModel -__all__ = ["ExperienceListResponse", "App", "Company"] +__all__ = ["ExperienceListResponse", "App", "AppIcon", "Company", "Image"] + + +class AppIcon(BaseModel): + url: Optional[str] = None + """This is the URL you use to render optimized attachments on the client. + + This should be used for apps. + """ class App(BaseModel): id: str """The ID of the app""" + icon: Optional[AppIcon] = None + """The icon for the app. + + This icon is shown on discovery, on the product page, on checkout, and as a + default icon for the experiences. + """ + name: str """The name of the app""" @@ -27,6 +42,14 @@ class Company(BaseModel): """The title of the company.""" +class Image(BaseModel): + url: Optional[str] = None + """This is the URL you use to render optimized attachments on the client. + + This should be used for apps. + """ + + class ExperienceListResponse(BaseModel): id: str """The unique ID representing this experience""" @@ -40,6 +63,9 @@ class ExperienceListResponse(BaseModel): created_at: datetime """The timestamp of when this experience was created.""" + image: Optional[Image] = None + """The logo for the experience.""" + name: str """The written name of the description.""" diff --git a/src/whop_sdk/types/shared/app.py b/src/whop_sdk/types/shared/app.py index 04fad1f0..c4725e98 100644 --- a/src/whop_sdk/types/shared/app.py +++ b/src/whop_sdk/types/shared/app.py @@ -6,7 +6,16 @@ from ..._models import BaseModel from .app_statuses import AppStatuses -__all__ = ["App", "APIKey", "Company", "Creator", "RequestedPermission", "RequestedPermissionPermissionAction", "Stats"] +__all__ = [ + "App", + "APIKey", + "Company", + "Creator", + "Icon", + "RequestedPermission", + "RequestedPermissionPermissionAction", + "Stats", +] class APIKey(BaseModel): @@ -39,6 +48,14 @@ class Creator(BaseModel): """The username of the user from their Whop account.""" +class Icon(BaseModel): + url: Optional[str] = None + """This is the URL you use to render optimized attachments on the client. + + This should be used for apps. + """ + + class RequestedPermissionPermissionAction(BaseModel): action: str """The identifier of the action.""" @@ -130,6 +147,13 @@ class App(BaseModel): /experiences/[experienceId] """ + icon: Optional[Icon] = None + """The icon for the app. + + This icon is shown on discovery, on the product page, on checkout, and as a + default icon for the experiences. + """ + name: str """The name of the app""" diff --git a/src/whop_sdk/types/shared/company.py b/src/whop_sdk/types/shared/company.py index cafd1cef..620cffde 100644 --- a/src/whop_sdk/types/shared/company.py +++ b/src/whop_sdk/types/shared/company.py @@ -8,7 +8,15 @@ from .business_types import BusinessTypes from .industry_types import IndustryTypes -__all__ = ["Company", "OwnerUser", "SocialLink"] +__all__ = ["Company", "Logo", "OwnerUser", "SocialLink"] + + +class Logo(BaseModel): + url: Optional[str] = None + """This is the URL you use to render optimized attachments on the client. + + This should be used for apps. + """ class OwnerUser(BaseModel): @@ -43,9 +51,15 @@ class Company(BaseModel): created_at: datetime """When the company was created (signed up)""" + description: Optional[str] = None + """The creator pitch for the company.""" + industry_type: Optional[IndustryTypes] = None """The different industry types a company can be in.""" + logo: Optional[Logo] = None + """The company's logo.""" + member_count: int """The number of members in the company.""" diff --git a/src/whop_sdk/types/shared/experience.py b/src/whop_sdk/types/shared/experience.py index 4cc54c9b..7c39c5b2 100644 --- a/src/whop_sdk/types/shared/experience.py +++ b/src/whop_sdk/types/shared/experience.py @@ -5,13 +5,28 @@ from ..._models import BaseModel -__all__ = ["Experience", "App", "Company", "Product"] +__all__ = ["Experience", "App", "AppIcon", "Company", "Image", "Product"] + + +class AppIcon(BaseModel): + url: Optional[str] = None + """This is the URL you use to render optimized attachments on the client. + + This should be used for apps. + """ class App(BaseModel): id: str """The ID of the app""" + icon: Optional[AppIcon] = None + """The icon for the app. + + This icon is shown on discovery, on the product page, on checkout, and as a + default icon for the experiences. + """ + name: str """The name of the app""" @@ -27,6 +42,14 @@ class Company(BaseModel): """The title of the company.""" +class Image(BaseModel): + url: Optional[str] = None + """This is the URL you use to render optimized attachments on the client. + + This should be used for apps. + """ + + class Product(BaseModel): id: str """The internal ID of the public product.""" @@ -51,6 +74,9 @@ class Experience(BaseModel): created_at: datetime """The timestamp of when this experience was created.""" + image: Optional[Image] = None + """The logo for the experience.""" + name: str """The written name of the description.""" diff --git a/src/whop_sdk/types/user_retrieve_response.py b/src/whop_sdk/types/user_retrieve_response.py index 26969eb7..24016e3d 100644 --- a/src/whop_sdk/types/user_retrieve_response.py +++ b/src/whop_sdk/types/user_retrieve_response.py @@ -5,7 +5,15 @@ from .._models import BaseModel -__all__ = ["UserRetrieveResponse"] +__all__ = ["UserRetrieveResponse", "ProfilePicture"] + + +class ProfilePicture(BaseModel): + url: Optional[str] = None + """This is the URL you use to render optimized attachments on the client. + + This should be used for apps. + """ class UserRetrieveResponse(BaseModel): @@ -21,5 +29,8 @@ class UserRetrieveResponse(BaseModel): name: Optional[str] = None """The name of the user from their Whop account.""" + profile_picture: Optional[ProfilePicture] = None + """The user's profile picture""" + username: str """The username of the user from their Whop account.""" From 214e669e3849358762d02f3bb923f337d6b9f399 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 21 Oct 2025 17:36:56 +0000 Subject: [PATCH 13/17] codegen metadata --- .stats.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.stats.yml b/.stats.yml index c7768168..81c9dced 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 81 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-cbc6845e3fd18db375851706ba67949f7066112df50300bf2de8b7c84a07c104.yml openapi_spec_hash: 0e91e81087a5de73d54e50147cc6cfd7 -config_hash: 335abeb0dd84526555f7d83ddb84af97 +config_hash: 131e5271eed10cf11ebc421d5a0c5f8a From d3d6d2364fbac6ec7e828471093c27e5bdba8527 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 21 Oct 2025 21:24:34 +0000 Subject: [PATCH 14/17] feat(api): api update --- .stats.yml | 4 ++-- src/whop_sdk/types/checkout_configuration_list_response.py | 4 ++-- src/whop_sdk/types/shared/checkout_configuration.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.stats.yml b/.stats.yml index 81c9dced..268d6ab8 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 81 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-cbc6845e3fd18db375851706ba67949f7066112df50300bf2de8b7c84a07c104.yml -openapi_spec_hash: 0e91e81087a5de73d54e50147cc6cfd7 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-d14c5c92d8834391e163f3f86d111f78d44475ce6a0f9e272c0910d94470a508.yml +openapi_spec_hash: 2c1075fb38205b66f7492b902fc322cb config_hash: 131e5271eed10cf11ebc421d5a0c5f8a diff --git a/src/whop_sdk/types/checkout_configuration_list_response.py b/src/whop_sdk/types/checkout_configuration_list_response.py index 6f3d261b..07c1f4b2 100644 --- a/src/whop_sdk/types/checkout_configuration_list_response.py +++ b/src/whop_sdk/types/checkout_configuration_list_response.py @@ -47,7 +47,7 @@ class CheckoutConfigurationListResponse(BaseModel): id: str """The ID of the checkout configuration""" - affiliate_code: str + affiliate_code: Optional[str] = None """The affiliate code to use for the checkout configuration""" company_id: str @@ -62,5 +62,5 @@ class CheckoutConfigurationListResponse(BaseModel): purchase_url: str """The URL to redirect the user to after the checkout configuration is created""" - redirect_url: str + redirect_url: Optional[str] = None """The URL to redirect the user to after the checkout configuration is created""" diff --git a/src/whop_sdk/types/shared/checkout_configuration.py b/src/whop_sdk/types/shared/checkout_configuration.py index 31f8eab2..0812fa47 100644 --- a/src/whop_sdk/types/shared/checkout_configuration.py +++ b/src/whop_sdk/types/shared/checkout_configuration.py @@ -47,7 +47,7 @@ class CheckoutConfiguration(BaseModel): id: str """The ID of the checkout configuration""" - affiliate_code: str + affiliate_code: Optional[str] = None """The affiliate code to use for the checkout configuration""" company_id: str @@ -62,5 +62,5 @@ class CheckoutConfiguration(BaseModel): purchase_url: str """The URL to redirect the user to after the checkout configuration is created""" - redirect_url: str + redirect_url: Optional[str] = None """The URL to redirect the user to after the checkout configuration is created""" From 5663cf45944bf6f9d236b7a77aac23ce7f17fb61 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 22 Oct 2025 15:24:29 +0000 Subject: [PATCH 15/17] feat(api): api update --- .stats.yml | 4 +-- api.md | 5 ++++ src/whop_sdk/types/__init__.py | 5 ++++ .../membership_activated_webhook_event.py | 29 +++++++++++++++++++ .../membership_deactivated_webhook_event.py | 29 +++++++++++++++++++ .../types/payment_failed_webhook_event.py | 26 +++++++++++++++++ .../types/payment_pending_webhook_event.py | 26 +++++++++++++++++ .../types/payment_succeeded_webhook_event.py | 26 +++++++++++++++++ src/whop_sdk/types/unwrap_webhook_event.py | 15 +++++++++- 9 files changed, 162 insertions(+), 3 deletions(-) create mode 100644 src/whop_sdk/types/membership_activated_webhook_event.py create mode 100644 src/whop_sdk/types/membership_deactivated_webhook_event.py create mode 100644 src/whop_sdk/types/payment_failed_webhook_event.py create mode 100644 src/whop_sdk/types/payment_pending_webhook_event.py create mode 100644 src/whop_sdk/types/payment_succeeded_webhook_event.py diff --git a/.stats.yml b/.stats.yml index 268d6ab8..ab14c302 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 81 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-d14c5c92d8834391e163f3f86d111f78d44475ce6a0f9e272c0910d94470a508.yml -openapi_spec_hash: 2c1075fb38205b66f7492b902fc322cb +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-d91d60417bc5284c347c5b5d7987372c67162442e3254a8dc25fe2724c2de1ef.yml +openapi_spec_hash: dba4f56c933e32fddf08056f5b927a49 config_hash: 131e5271eed10cf11ebc421d5a0c5f8a diff --git a/api.md b/api.md index 7f71baa3..9695d201 100644 --- a/api.md +++ b/api.md @@ -134,6 +134,11 @@ from whop_sdk.types import ( InvoicePaidWebhookEvent, InvoicePastDueWebhookEvent, InvoiceVoidedWebhookEvent, + MembershipActivatedWebhookEvent, + MembershipDeactivatedWebhookEvent, + PaymentSucceededWebhookEvent, + PaymentFailedWebhookEvent, + PaymentPendingWebhookEvent, UnwrapWebhookEvent, ) ``` diff --git a/src/whop_sdk/types/__init__.py b/src/whop_sdk/types/__init__.py index a10186aa..1939a286 100644 --- a/src/whop_sdk/types/__init__.py +++ b/src/whop_sdk/types/__init__.py @@ -133,16 +133,21 @@ from .authorized_user_list_params import AuthorizedUserListParams as AuthorizedUserListParams from .support_channel_list_params import SupportChannelListParams as SupportChannelListParams from .invoice_voided_webhook_event import InvoiceVoidedWebhookEvent as InvoiceVoidedWebhookEvent +from .payment_failed_webhook_event import PaymentFailedWebhookEvent as PaymentFailedWebhookEvent from .authorized_user_list_response import AuthorizedUserListResponse as AuthorizedUserListResponse from .invoice_created_webhook_event import InvoiceCreatedWebhookEvent as InvoiceCreatedWebhookEvent +from .payment_pending_webhook_event import PaymentPendingWebhookEvent as PaymentPendingWebhookEvent from .support_channel_create_params import SupportChannelCreateParams as SupportChannelCreateParams from .support_channel_list_response import SupportChannelListResponse as SupportChannelListResponse from .invoice_past_due_webhook_event import InvoicePastDueWebhookEvent as InvoicePastDueWebhookEvent +from .payment_succeeded_webhook_event import PaymentSucceededWebhookEvent as PaymentSucceededWebhookEvent from .ledger_account_retrieve_response import LedgerAccountRetrieveResponse as LedgerAccountRetrieveResponse from .authorized_user_retrieve_response import AuthorizedUserRetrieveResponse as AuthorizedUserRetrieveResponse from .checkout_configuration_list_params import CheckoutConfigurationListParams as CheckoutConfigurationListParams +from .membership_activated_webhook_event import MembershipActivatedWebhookEvent as MembershipActivatedWebhookEvent from .checkout_configuration_create_params import CheckoutConfigurationCreateParams as CheckoutConfigurationCreateParams from .checkout_configuration_list_response import CheckoutConfigurationListResponse as CheckoutConfigurationListResponse +from .membership_deactivated_webhook_event import MembershipDeactivatedWebhookEvent as MembershipDeactivatedWebhookEvent from .course_lesson_interaction_list_params import ( CourseLessonInteractionListParams as CourseLessonInteractionListParams, ) diff --git a/src/whop_sdk/types/membership_activated_webhook_event.py b/src/whop_sdk/types/membership_activated_webhook_event.py new file mode 100644 index 00000000..0c636159 --- /dev/null +++ b/src/whop_sdk/types/membership_activated_webhook_event.py @@ -0,0 +1,29 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from datetime import datetime +from typing_extensions import Literal + +from .._models import BaseModel +from .shared.membership import Membership + +__all__ = ["MembershipActivatedWebhookEvent"] + + +class MembershipActivatedWebhookEvent(BaseModel): + id: str + """A unique ID for every single webhook request""" + + api_version: Literal["v1"] + """The API version for this webhook""" + + data: Membership + """ + A membership represents a purchase between a User and a Company for a specific + Product. + """ + + timestamp: datetime + """The timestamp in ISO 8601 format that the webhook was sent at on the server""" + + type: Literal["membership.activated"] + """The webhook event type""" diff --git a/src/whop_sdk/types/membership_deactivated_webhook_event.py b/src/whop_sdk/types/membership_deactivated_webhook_event.py new file mode 100644 index 00000000..34e28d7c --- /dev/null +++ b/src/whop_sdk/types/membership_deactivated_webhook_event.py @@ -0,0 +1,29 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from datetime import datetime +from typing_extensions import Literal + +from .._models import BaseModel +from .shared.membership import Membership + +__all__ = ["MembershipDeactivatedWebhookEvent"] + + +class MembershipDeactivatedWebhookEvent(BaseModel): + id: str + """A unique ID for every single webhook request""" + + api_version: Literal["v1"] + """The API version for this webhook""" + + data: Membership + """ + A membership represents a purchase between a User and a Company for a specific + Product. + """ + + timestamp: datetime + """The timestamp in ISO 8601 format that the webhook was sent at on the server""" + + type: Literal["membership.deactivated"] + """The webhook event type""" diff --git a/src/whop_sdk/types/payment_failed_webhook_event.py b/src/whop_sdk/types/payment_failed_webhook_event.py new file mode 100644 index 00000000..98a848c1 --- /dev/null +++ b/src/whop_sdk/types/payment_failed_webhook_event.py @@ -0,0 +1,26 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from datetime import datetime +from typing_extensions import Literal + +from .._models import BaseModel +from .shared.payment import Payment + +__all__ = ["PaymentFailedWebhookEvent"] + + +class PaymentFailedWebhookEvent(BaseModel): + id: str + """A unique ID for every single webhook request""" + + api_version: Literal["v1"] + """The API version for this webhook""" + + data: Payment + """An object representing a receipt for a membership.""" + + timestamp: datetime + """The timestamp in ISO 8601 format that the webhook was sent at on the server""" + + type: Literal["payment.failed"] + """The webhook event type""" diff --git a/src/whop_sdk/types/payment_pending_webhook_event.py b/src/whop_sdk/types/payment_pending_webhook_event.py new file mode 100644 index 00000000..e5919ff2 --- /dev/null +++ b/src/whop_sdk/types/payment_pending_webhook_event.py @@ -0,0 +1,26 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from datetime import datetime +from typing_extensions import Literal + +from .._models import BaseModel +from .shared.payment import Payment + +__all__ = ["PaymentPendingWebhookEvent"] + + +class PaymentPendingWebhookEvent(BaseModel): + id: str + """A unique ID for every single webhook request""" + + api_version: Literal["v1"] + """The API version for this webhook""" + + data: Payment + """An object representing a receipt for a membership.""" + + timestamp: datetime + """The timestamp in ISO 8601 format that the webhook was sent at on the server""" + + type: Literal["payment.pending"] + """The webhook event type""" diff --git a/src/whop_sdk/types/payment_succeeded_webhook_event.py b/src/whop_sdk/types/payment_succeeded_webhook_event.py new file mode 100644 index 00000000..f4427c17 --- /dev/null +++ b/src/whop_sdk/types/payment_succeeded_webhook_event.py @@ -0,0 +1,26 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from datetime import datetime +from typing_extensions import Literal + +from .._models import BaseModel +from .shared.payment import Payment + +__all__ = ["PaymentSucceededWebhookEvent"] + + +class PaymentSucceededWebhookEvent(BaseModel): + id: str + """A unique ID for every single webhook request""" + + api_version: Literal["v1"] + """The API version for this webhook""" + + data: Payment + """An object representing a receipt for a membership.""" + + timestamp: datetime + """The timestamp in ISO 8601 format that the webhook was sent at on the server""" + + type: Literal["payment.succeeded"] + """The webhook event type""" diff --git a/src/whop_sdk/types/unwrap_webhook_event.py b/src/whop_sdk/types/unwrap_webhook_event.py index 19638b00..a86f390b 100644 --- a/src/whop_sdk/types/unwrap_webhook_event.py +++ b/src/whop_sdk/types/unwrap_webhook_event.py @@ -5,11 +5,24 @@ from .invoice_paid_webhook_event import InvoicePaidWebhookEvent from .invoice_voided_webhook_event import InvoiceVoidedWebhookEvent +from .payment_failed_webhook_event import PaymentFailedWebhookEvent from .invoice_created_webhook_event import InvoiceCreatedWebhookEvent +from .payment_pending_webhook_event import PaymentPendingWebhookEvent from .invoice_past_due_webhook_event import InvoicePastDueWebhookEvent +from .payment_succeeded_webhook_event import PaymentSucceededWebhookEvent +from .membership_activated_webhook_event import MembershipActivatedWebhookEvent +from .membership_deactivated_webhook_event import MembershipDeactivatedWebhookEvent __all__ = ["UnwrapWebhookEvent"] UnwrapWebhookEvent: TypeAlias = Union[ - InvoiceCreatedWebhookEvent, InvoicePaidWebhookEvent, InvoicePastDueWebhookEvent, InvoiceVoidedWebhookEvent + InvoiceCreatedWebhookEvent, + InvoicePaidWebhookEvent, + InvoicePastDueWebhookEvent, + InvoiceVoidedWebhookEvent, + MembershipActivatedWebhookEvent, + MembershipDeactivatedWebhookEvent, + PaymentSucceededWebhookEvent, + PaymentFailedWebhookEvent, + PaymentPendingWebhookEvent, ] From 2d9ebeebfa02aed3ec8b515d0e5b11de07062a38 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 22 Oct 2025 17:08:19 +0000 Subject: [PATCH 16/17] feat(api): api update --- .stats.yml | 4 +-- api.md | 5 ++++ src/whop_sdk/types/__init__.py | 7 +++++ ...son_interaction_completed_webhook_event.py | 26 +++++++++++++++++++ .../types/entry_approved_webhook_event.py | 26 +++++++++++++++++++ .../types/entry_created_webhook_event.py | 26 +++++++++++++++++++ .../types/entry_deleted_webhook_event.py | 26 +++++++++++++++++++ .../types/entry_denied_webhook_event.py | 26 +++++++++++++++++++ .../types/shared/course_lesson_interaction.py | 21 ++++++++++++++- src/whop_sdk/types/unwrap_webhook_event.py | 10 +++++++ 10 files changed, 174 insertions(+), 3 deletions(-) create mode 100644 src/whop_sdk/types/course_lesson_interaction_completed_webhook_event.py create mode 100644 src/whop_sdk/types/entry_approved_webhook_event.py create mode 100644 src/whop_sdk/types/entry_created_webhook_event.py create mode 100644 src/whop_sdk/types/entry_deleted_webhook_event.py create mode 100644 src/whop_sdk/types/entry_denied_webhook_event.py diff --git a/.stats.yml b/.stats.yml index ab14c302..ff4a3e82 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 81 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-d91d60417bc5284c347c5b5d7987372c67162442e3254a8dc25fe2724c2de1ef.yml -openapi_spec_hash: dba4f56c933e32fddf08056f5b927a49 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/frostedinc%2Fwhopsdk-e8bcfd8a19f54624e644a1bc061df234a2e12af010a6c595d5a698cdd0e20682.yml +openapi_spec_hash: b47bb36fbc4c9ebdf3cf6b06f33356ef config_hash: 131e5271eed10cf11ebc421d5a0c5f8a diff --git a/api.md b/api.md index 9695d201..4195aa21 100644 --- a/api.md +++ b/api.md @@ -136,6 +136,11 @@ from whop_sdk.types import ( InvoiceVoidedWebhookEvent, MembershipActivatedWebhookEvent, MembershipDeactivatedWebhookEvent, + EntryCreatedWebhookEvent, + EntryApprovedWebhookEvent, + EntryDeniedWebhookEvent, + EntryDeletedWebhookEvent, + CourseLessonInteractionCompletedWebhookEvent, PaymentSucceededWebhookEvent, PaymentFailedWebhookEvent, PaymentPendingWebhookEvent, diff --git a/src/whop_sdk/types/__init__.py b/src/whop_sdk/types/__init__.py index 1939a286..37c1e57a 100644 --- a/src/whop_sdk/types/__init__.py +++ b/src/whop_sdk/types/__init__.py @@ -127,11 +127,15 @@ from .membership_update_params import MembershipUpdateParams as MembershipUpdateParams from .chat_channel_list_response import ChatChannelListResponse as ChatChannelListResponse from .chat_channel_update_params import ChatChannelUpdateParams as ChatChannelUpdateParams +from .entry_denied_webhook_event import EntryDeniedWebhookEvent as EntryDeniedWebhookEvent from .experience_delete_response import ExperienceDeleteResponse as ExperienceDeleteResponse from .invoice_paid_webhook_event import InvoicePaidWebhookEvent as InvoicePaidWebhookEvent from .user_check_access_response import UserCheckAccessResponse as UserCheckAccessResponse from .authorized_user_list_params import AuthorizedUserListParams as AuthorizedUserListParams +from .entry_created_webhook_event import EntryCreatedWebhookEvent as EntryCreatedWebhookEvent +from .entry_deleted_webhook_event import EntryDeletedWebhookEvent as EntryDeletedWebhookEvent from .support_channel_list_params import SupportChannelListParams as SupportChannelListParams +from .entry_approved_webhook_event import EntryApprovedWebhookEvent as EntryApprovedWebhookEvent from .invoice_voided_webhook_event import InvoiceVoidedWebhookEvent as InvoiceVoidedWebhookEvent from .payment_failed_webhook_event import PaymentFailedWebhookEvent as PaymentFailedWebhookEvent from .authorized_user_list_response import AuthorizedUserListResponse as AuthorizedUserListResponse @@ -151,3 +155,6 @@ from .course_lesson_interaction_list_params import ( CourseLessonInteractionListParams as CourseLessonInteractionListParams, ) +from .course_lesson_interaction_completed_webhook_event import ( + CourseLessonInteractionCompletedWebhookEvent as CourseLessonInteractionCompletedWebhookEvent, +) diff --git a/src/whop_sdk/types/course_lesson_interaction_completed_webhook_event.py b/src/whop_sdk/types/course_lesson_interaction_completed_webhook_event.py new file mode 100644 index 00000000..afe55710 --- /dev/null +++ b/src/whop_sdk/types/course_lesson_interaction_completed_webhook_event.py @@ -0,0 +1,26 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from datetime import datetime +from typing_extensions import Literal + +from .._models import BaseModel +from .shared.course_lesson_interaction import CourseLessonInteraction + +__all__ = ["CourseLessonInteractionCompletedWebhookEvent"] + + +class CourseLessonInteractionCompletedWebhookEvent(BaseModel): + id: str + """A unique ID for every single webhook request""" + + api_version: Literal["v1"] + """The API version for this webhook""" + + data: CourseLessonInteraction + """A lesson interaction tracking user progress in courses""" + + timestamp: datetime + """The timestamp in ISO 8601 format that the webhook was sent at on the server""" + + type: Literal["course_lesson_interaction.completed"] + """The webhook event type""" diff --git a/src/whop_sdk/types/entry_approved_webhook_event.py b/src/whop_sdk/types/entry_approved_webhook_event.py new file mode 100644 index 00000000..29f31d4f --- /dev/null +++ b/src/whop_sdk/types/entry_approved_webhook_event.py @@ -0,0 +1,26 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from datetime import datetime +from typing_extensions import Literal + +from .._models import BaseModel +from .shared.entry import Entry + +__all__ = ["EntryApprovedWebhookEvent"] + + +class EntryApprovedWebhookEvent(BaseModel): + id: str + """A unique ID for every single webhook request""" + + api_version: Literal["v1"] + """The API version for this webhook""" + + data: Entry + """An object representing an entry in a waitlist.""" + + timestamp: datetime + """The timestamp in ISO 8601 format that the webhook was sent at on the server""" + + type: Literal["entry.approved"] + """The webhook event type""" diff --git a/src/whop_sdk/types/entry_created_webhook_event.py b/src/whop_sdk/types/entry_created_webhook_event.py new file mode 100644 index 00000000..e8c80656 --- /dev/null +++ b/src/whop_sdk/types/entry_created_webhook_event.py @@ -0,0 +1,26 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from datetime import datetime +from typing_extensions import Literal + +from .._models import BaseModel +from .shared.entry import Entry + +__all__ = ["EntryCreatedWebhookEvent"] + + +class EntryCreatedWebhookEvent(BaseModel): + id: str + """A unique ID for every single webhook request""" + + api_version: Literal["v1"] + """The API version for this webhook""" + + data: Entry + """An object representing an entry in a waitlist.""" + + timestamp: datetime + """The timestamp in ISO 8601 format that the webhook was sent at on the server""" + + type: Literal["entry.created"] + """The webhook event type""" diff --git a/src/whop_sdk/types/entry_deleted_webhook_event.py b/src/whop_sdk/types/entry_deleted_webhook_event.py new file mode 100644 index 00000000..abe3e7e1 --- /dev/null +++ b/src/whop_sdk/types/entry_deleted_webhook_event.py @@ -0,0 +1,26 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from datetime import datetime +from typing_extensions import Literal + +from .._models import BaseModel +from .shared.entry import Entry + +__all__ = ["EntryDeletedWebhookEvent"] + + +class EntryDeletedWebhookEvent(BaseModel): + id: str + """A unique ID for every single webhook request""" + + api_version: Literal["v1"] + """The API version for this webhook""" + + data: Entry + """An object representing an entry in a waitlist.""" + + timestamp: datetime + """The timestamp in ISO 8601 format that the webhook was sent at on the server""" + + type: Literal["entry.deleted"] + """The webhook event type""" diff --git a/src/whop_sdk/types/entry_denied_webhook_event.py b/src/whop_sdk/types/entry_denied_webhook_event.py new file mode 100644 index 00000000..94df91e7 --- /dev/null +++ b/src/whop_sdk/types/entry_denied_webhook_event.py @@ -0,0 +1,26 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from datetime import datetime +from typing_extensions import Literal + +from .._models import BaseModel +from .shared.entry import Entry + +__all__ = ["EntryDeniedWebhookEvent"] + + +class EntryDeniedWebhookEvent(BaseModel): + id: str + """A unique ID for every single webhook request""" + + api_version: Literal["v1"] + """The API version for this webhook""" + + data: Entry + """An object representing an entry in a waitlist.""" + + timestamp: datetime + """The timestamp in ISO 8601 format that the webhook was sent at on the server""" + + type: Literal["entry.denied"] + """The webhook event type""" diff --git a/src/whop_sdk/types/shared/course_lesson_interaction.py b/src/whop_sdk/types/shared/course_lesson_interaction.py index 223acc52..f8c617b7 100644 --- a/src/whop_sdk/types/shared/course_lesson_interaction.py +++ b/src/whop_sdk/types/shared/course_lesson_interaction.py @@ -5,7 +5,23 @@ from ..._models import BaseModel -__all__ = ["CourseLessonInteraction", "Lesson", "User"] +__all__ = ["CourseLessonInteraction", "Course", "CourseExperience", "Lesson", "User"] + + +class CourseExperience(BaseModel): + id: str + """The unique ID representing this experience""" + + +class Course(BaseModel): + id: str + """The ID of the course. Looks like cors_XXX""" + + experience: CourseExperience + """The experience that the course belongs to""" + + title: Optional[str] = None + """The title of the course""" class Lesson(BaseModel): @@ -34,6 +50,9 @@ class CourseLessonInteraction(BaseModel): completed: bool """Whether the lesson has been completed by the user""" + course: Course + """The course for this lesson interaction""" + created_at: datetime """When the interaction was created""" diff --git a/src/whop_sdk/types/unwrap_webhook_event.py b/src/whop_sdk/types/unwrap_webhook_event.py index a86f390b..aa869c77 100644 --- a/src/whop_sdk/types/unwrap_webhook_event.py +++ b/src/whop_sdk/types/unwrap_webhook_event.py @@ -3,7 +3,11 @@ from typing import Union from typing_extensions import TypeAlias +from .entry_denied_webhook_event import EntryDeniedWebhookEvent from .invoice_paid_webhook_event import InvoicePaidWebhookEvent +from .entry_created_webhook_event import EntryCreatedWebhookEvent +from .entry_deleted_webhook_event import EntryDeletedWebhookEvent +from .entry_approved_webhook_event import EntryApprovedWebhookEvent from .invoice_voided_webhook_event import InvoiceVoidedWebhookEvent from .payment_failed_webhook_event import PaymentFailedWebhookEvent from .invoice_created_webhook_event import InvoiceCreatedWebhookEvent @@ -12,6 +16,7 @@ from .payment_succeeded_webhook_event import PaymentSucceededWebhookEvent from .membership_activated_webhook_event import MembershipActivatedWebhookEvent from .membership_deactivated_webhook_event import MembershipDeactivatedWebhookEvent +from .course_lesson_interaction_completed_webhook_event import CourseLessonInteractionCompletedWebhookEvent __all__ = ["UnwrapWebhookEvent"] @@ -22,6 +27,11 @@ InvoiceVoidedWebhookEvent, MembershipActivatedWebhookEvent, MembershipDeactivatedWebhookEvent, + EntryCreatedWebhookEvent, + EntryApprovedWebhookEvent, + EntryDeniedWebhookEvent, + EntryDeletedWebhookEvent, + CourseLessonInteractionCompletedWebhookEvent, PaymentSucceededWebhookEvent, PaymentFailedWebhookEvent, PaymentPendingWebhookEvent, From 2105ec789ad95b265fedbd643b5dbfe099a9353b Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 22 Oct 2025 18:22:47 +0000 Subject: [PATCH 17/17] release: 0.0.2 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 19 +++++++++++++++++++ pyproject.toml | 2 +- src/whop_sdk/_version.py | 2 +- 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 1332969b..c7159c1a 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.0.1" + ".": "0.0.2" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 56ea1ae3..c5c855ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,24 @@ # Changelog +## 0.0.2 (2025-10-22) + +Full Changelog: [v0.0.1...v0.0.2](https://github.com/whopio/whopsdk-python/compare/v0.0.1...v0.0.2) + +### Features + +* **api:** api update ([2d9ebee](https://github.com/whopio/whopsdk-python/commit/2d9ebeebfa02aed3ec8b515d0e5b11de07062a38)) +* **api:** api update ([5663cf4](https://github.com/whopio/whopsdk-python/commit/5663cf45944bf6f9d236b7a77aac23ce7f17fb61)) +* **api:** api update ([d3d6d23](https://github.com/whopio/whopsdk-python/commit/d3d6d2364fbac6ec7e828471093c27e5bdba8527)) +* **api:** api update ([f05be6f](https://github.com/whopio/whopsdk-python/commit/f05be6fd65bbd8fca4400d2e38e727153a72de43)) +* **api:** api update ([cb2935f](https://github.com/whopio/whopsdk-python/commit/cb2935feaef3aa0fe324bf2bb2bb193c96b12275)) +* **api:** api update ([d66c088](https://github.com/whopio/whopsdk-python/commit/d66c08873a123a5b65a5fa6f17e66ec6668e37a3)) +* **api:** manual updates ([e0bea9f](https://github.com/whopio/whopsdk-python/commit/e0bea9ff169b03e85ba7111ccd7cbe1f4a1eb4cf)) + + +### Chores + +* bump `httpx-aiohttp` version to 0.1.9 ([a946c15](https://github.com/whopio/whopsdk-python/commit/a946c15a8d418258f8d259714e725922e44c9389)) + ## 0.0.1 (2025-10-16) Full Changelog: [v0.0.1...v0.0.1](https://github.com/whopio/whopsdk-python/compare/v0.0.1...v0.0.1) diff --git a/pyproject.toml b/pyproject.toml index c3788c26..1af33a1c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "whop-sdk" -version = "0.0.1" +version = "0.0.2" 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 35444f45..d3607fd9 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.1" # x-release-please-version +__version__ = "0.0.2" # x-release-please-version