diff --git a/.clusterfuzzlite/build.sh b/.clusterfuzzlite/build.sh index 290452b..ef216a0 100755 --- a/.clusterfuzzlite/build.sh +++ b/.clusterfuzzlite/build.sh @@ -1,5 +1,9 @@ #!/bin/bash -eu +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + export PYTHONPATH="$SRC/x-twitter-scraper-python/src" compile_python_fuzzer \ diff --git a/.clusterfuzzlite/fuzz_querystring.py b/.clusterfuzzlite/fuzz_querystring.py index 8476e38..8dfd5b1 100644 --- a/.clusterfuzzlite/fuzz_querystring.py +++ b/.clusterfuzzlite/fuzz_querystring.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + from __future__ import annotations import sys diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f731145..5efd466 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,15 +18,15 @@ permissions: contents: read concurrency: - group: ci-${{ github.workflow }}-${{ github.ref }} + group: ci-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true jobs: lint: - timeout-minutes: 10 - name: lint + timeout-minutes: 15 + name: Lint & Licensing runs-on: ubuntu-24.04 - if: (github.event_name == 'push' || github.event.pull_request.head.repo.fork) && (github.event_name != 'push' || github.event.head_commit.message != 'codegen metadata') + if: github.event_name == 'pull_request' || github.event.head_commit.message != 'codegen metadata' steps: - name: Check out repository uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 @@ -45,10 +45,13 @@ jobs: - name: Run lints run: ./scripts/lint + - name: Check licensing + uses: fsfe/reuse-action@676e2d560c9a403aa252096d99fcab3e1132b0f5 # v6.0.0 + build: - if: (github.event_name == 'push' || github.event.pull_request.head.repo.fork) && (github.event_name != 'push' || github.event.head_commit.message != 'codegen metadata') + if: github.event_name == 'pull_request' || github.event.head_commit.message != 'codegen metadata' timeout-minutes: 10 - name: build + name: Build & Reproducibility runs-on: ubuntu-24.04 steps: - name: Check out repository @@ -62,17 +65,19 @@ jobs: enable-cache: false version: "0.11.6" - - name: Install dependencies - run: uv sync --locked --all-extras + - name: Verify reproducible distributions + run: ./scripts/check-reproducible + + - name: Build distributions + run: SOURCE_DATE_EPOCH=946684800 uv build - - name: Run build - run: uv build + - name: Check package metadata + run: uvx --from twine==6.2.0 twine check dist/* test: - timeout-minutes: 10 - name: test + timeout-minutes: 20 + name: Tests & Coverage runs-on: ubuntu-24.04 - if: github.event_name == 'push' || github.event.pull_request.head.repo.fork steps: - name: Check out repository uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 @@ -90,3 +95,25 @@ jobs: - name: Run tests run: ./scripts/test + + - name: Enforce coverage + run: ./scripts/coverage + + security: + timeout-minutes: 15 + name: Dependency Security + runs-on: ubuntu-24.04 + steps: + - name: Check out repository + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + + - name: Install uv + uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2 + with: + enable-cache: false + version: "0.11.6" + + - name: Audit locked dependencies + run: ./scripts/audit diff --git a/.github/workflows/publish-pypi.yml b/.github/workflows/publish-pypi.yml index 5c63381..0c7efaf 100644 --- a/.github/workflows/publish-pypi.yml +++ b/.github/workflows/publish-pypi.yml @@ -23,6 +23,7 @@ jobs: - name: Check out repository uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: + fetch-depth: 0 persist-credentials: false - name: Install uv @@ -31,8 +32,18 @@ jobs: enable-cache: false version: "0.11.6" + - name: Verify reproducible distributions + run: ./scripts/check-reproducible + + - name: Verify release tag and ancestry + shell: bash + run: | + package_version="$(python3 -c 'import tomllib; print(tomllib.load(open("pyproject.toml", "rb"))["project"]["version"])')" + test "$GITHUB_REF_NAME" = "v$package_version" + git merge-base --is-ancestor "$GITHUB_SHA" refs/remotes/origin/main + - name: Build distributions - run: uv build + run: SOURCE_DATE_EPOCH=946684800 uv build - name: Check package metadata run: uvx --from twine==6.2.0 twine check dist/* diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6472f3f..8bd9116 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,115 +1,107 @@ -## Setting up the environment +# Contributing -### With `uv` +Thank you for improving the Xquik Python SDK. -We use [uv](https://docs.astral.sh/uv/) to manage dependencies because it will automatically provision a Python environment with the expected Python version. To set it up, run: +Read [GOVERNANCE.md](GOVERNANCE.md) before proposing major changes. -```sh -$ ./scripts/bootstrap -``` +Follow the shared [Xquik contribution policy][contribution-policy]. + +## Set Up -Or [install uv manually](https://docs.astral.sh/uv/getting-started/installation/) and run: +Install `uv`, then run: ```sh -$ uv sync --all-extras +./scripts/bootstrap ``` -You can then run scripts using `uv run python script.py` or by manually activating the virtual environment: +The bootstrap installs supported Python runtimes and locked dependencies. -```sh -# manually activate - https://docs.python.org/3/library/venv.html#how-venvs-work -$ source .venv/bin/activate +Without `uv`, install `requirements-dev.lock` inside an isolated environment. -# now you can omit the `uv run` prefix -$ python script.py -``` +Never commit credentials or runtime environment files. + +## Generated Code -### Without `uv` +Most SDK files come from the public OpenAPI contract. -Alternatively if you don't want to install `uv`, you can stick with the standard `pip` setup by ensuring you have the Python version specified in `.python-version`, create a virtual environment however you desire and then install dependencies using this command: +Preserve generated method names and response contracts. + +Avoid generated-file changes when a generator fix exists. + +Place stable examples outside generated directories. + +## Verify Changes + +Run focused tests while editing. + +Run every gate before requesting review. ```sh -$ pip install -r requirements-dev.lock +./scripts/lint +./scripts/test +./scripts/coverage +./scripts/audit +uvx --from reuse==6.2.0 reuse lint +./scripts/check-reproducible ``` -## Modifying/Adding code +Statement coverage must remain at least 90%. -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/x_twitter_scraper/lib/` and `examples/` directories. +Branch coverage must remain at least 80%. -## Adding and running examples +Add regression tests for every corrected defect. -All files in the `examples/` directory are not modified by the generator and can be freely edited or added to. +`TEST_API_BASE_URL` accepts literal loopback addresses only. -```py -# add an example to examples/.py +This guard prevents tests from mutating remote services. -#!/usr/bin/env -S uv run python -… -``` +## Build From Source + +Build both public distributions: ```sh -$ chmod +x examples/.py -# run the example against your api -$ ./examples/.py +uv build ``` -## Using the repository from source +Install the wheel inside a clean environment for integration testing. -If you’d like to use the repository from source, you can either install from git or link to a cloned repository: +## Submit Changes -To install via git: +Keep pull requests focused. -```sh -$ pip install git+ssh://git@github.com/Xquik-dev/x-twitter-scraper-python.git -``` +Explain user-visible behavior and public contract effects. -Alternatively, you can build from source and install the wheel file: +Link relevant issues and public API contracts. -Building this package will create two files in the `dist/` directory, a `.tar.gz` containing the source files and a `.whl` that can be used to install the package efficiently. +Use clear Conventional Commit subjects when practical. -To create a distributable version of the library, all you have to do is run this command: +Sign every commit with the Developer Certificate of Origin. ```sh -$ uv build -# or -$ python -m build +git commit --signoff ``` -Then to install: +Another human must review maintainer-authored, nontrivial changes. -```sh -$ pip install ./path-to-wheel-file.whl -``` +Reviewers follow the shared [review policy][review-policy]. -## Running tests +Address every review comment before merging. -```sh -$ ./scripts/test -``` +## Report Security Issues -## Linting and formatting +Never disclose suspected vulnerabilities in public issues. -This repository uses [ruff](https://github.com/astral-sh/ruff) and -[black](https://github.com/psf/black) to format the code in the repository. +Follow [SECURITY.md](SECURITY.md) for private reporting. -To lint: +## Releases -```sh -$ ./scripts/lint -``` +Publish an immutable `v*` release after its commit reaches `main`. -To format and fix all ruff issues automatically: +The protected `pypi` environment uses PyPI trusted publishing. -```sh -$ ./scripts/format -``` +Manual workflow runs must target a version tag. -## Publishing and releases +[contribution-policy]: https://github.com/Xquik-dev/.github/blob/main/CONTRIBUTING.md +[review-policy]: https://github.com/Xquik-dev/.github/blob/main/REVIEWING.md -Publish an immutable `v*` GitHub release after the release commit reaches `main`. -The [Publish PyPI workflow](https://github.com/Xquik-dev/x-twitter-scraper-python/actions/workflows/publish-pypi.yml) -builds the distributions separately, then publishes them through PyPI trusted -publishing from the protected `pypi` environment. Manual runs must target a -version tag. +Xquik is an independent third-party service. Not affiliated with X Corp. "Twitter" and "X" are trademarks of X Corp. diff --git a/GOVERNANCE.md b/GOVERNANCE.md new file mode 100644 index 0000000..2bbff0b --- /dev/null +++ b/GOVERNANCE.md @@ -0,0 +1,69 @@ +# Governance + +## Scope + +This repository publishes the Xquik Python SDK. + +The public OpenAPI specification defines its external contract. + +## Roles + +Contributors propose changes, tests, documentation, and reviews. + +Maintainers hold repository administration and release permissions. + +GitHub organization access remains the authority for maintainer permissions. + +## Decisions + +Use public issues for non-sensitive design discussions. + +Use pull requests for reviewed repository changes. + +Preserve generated API contracts unless the public specification changes. + +Prefer consensus for user-visible and governance decisions. + +Document unresolved tradeoffs in the pull request. + +## Reviews + +Every nontrivial change requires review before release. + +Maintainer-authored changes require another human reviewer. + +Security-sensitive changes require an explicit security review. + +Reviewers follow the shared [review policy][review-policy]. + +## Releases + +Release automation prepares version and changelog updates. + +Maintainers verify tests, security gates, and release metadata. + +Release tags must reference the reviewed default-branch commit. + +Python wheel and source archives must remain reproducible. + +## Maintainer Changes + +Sustained contributors may request maintainer consideration. + +Existing maintainers evaluate judgment, reliability, and security practices. + +Remove inactive access when continuity and security permit. + +Document material governance changes through reviewed pull requests. + +## Continuity + +At least 2 maintainers should hold required release access. + +Current public evidence does not yet prove that threshold. + +Track this limitation in [OPENSSF.md](OPENSSF.md). + +[review-policy]: https://github.com/Xquik-dev/.github/blob/main/REVIEWING.md + +Xquik is an independent third-party service. Not affiliated with X Corp. "Twitter" and "X" are trademarks of X Corp. diff --git a/LICENSES/Apache-2.0.txt b/LICENSES/Apache-2.0.txt new file mode 100644 index 0000000..b212097 --- /dev/null +++ b/LICENSES/Apache-2.0.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2026 X Twitter Scraper + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/OPENSSF.md b/OPENSSF.md new file mode 100644 index 0000000..b6f9cb3 --- /dev/null +++ b/OPENSSF.md @@ -0,0 +1,78 @@ +# OpenSSF Best Practices Evidence + +This register tracks the Gold assessment for this repository. + +The official entry is [bestpractices.dev project 13738][badge]. + +Assessment date: 2026-07-23. + +## Eligibility + +This public Python SDK is active and released. + +It is eligible for the OpenSSF Best Practices badge. + +No OpenSSF-defined ineligibility applies. + +## Verified Technical Controls + +| Area | Evidence | +| --- | --- | +| License | Apache-2.0 and REUSE 3.3 metadata | +| Contribution process | DCO sign-off and independent review rules | +| Governance | Public roles, decisions, releases, and continuity policy | +| Security reporting | Private reporting, response targets, boundaries, and threat model | +| Tests | Python 3.10 and 3.14 with Pydantic 1 and 2 | +| Statement coverage | `./scripts/coverage` enforces 90% | +| Branch coverage | `./scripts/coverage` enforces 80% | +| Static analysis | Ruff, Pyright, Mypy, and CodeQL security-extended queries | +| Dependency review | Dependabot and pinned `pip-audit` | +| Licensing gate | Pinned REUSE action checks every repository file | +| Reproducibility | 2 wheels and source archives must have identical bytes | +| CI | Pull requests and pushes run pinned, least-privilege workflows | +| Two-factor authentication | The Xquik-dev organization requires 2FA | + +The current matrix covers 10,305 of 10,941 statements, or 94.19%. + +It covers 1,139 of 1,408 branches, or 80.89%. + +The matrix runs 2,989 Pydantic 2 tests. + +It runs 2,976 Pydantic 1 tests. + +## Outstanding Gold Blockers + +Human and organizational evidence remains incomplete. + +Do not claim Gold while any mandatory criterion remains unmet. + +| Gold Requirement | Current Evidence | Required Action | +| --- | --- | --- | +| Access continuity | Public evidence does not prove 2 release-capable maintainers | Grant and verify another maintainer's access | +| Bus factor | Git history shows one significant contributor | Add another significant contributor | +| Unassociated contributors | Fewer than 2 qualifying contributors are independent | Accept qualifying external contributions | +| Independent review | History does not prove 50% qualifying review coverage | Require and record independent reviews | +| Human security review | No completed review exists within 5 years | Commission and publish a scoped review | + +This remediation pull request needs a different human reviewer. + +## Maintenance + +Run these evidence commands before releases: + +```sh +./scripts/lint +./scripts/test +./scripts/coverage +./scripts/audit +uvx --from reuse==6.2.0 reuse lint +./scripts/check-reproducible +``` + +Reassess the register before every major release. + +Update bestpractices.dev only with public evidence. + +[badge]: https://www.bestpractices.dev/projects/13738 + +Xquik is an independent third-party service. Not affiliated with X Corp. "Twitter" and "X" are trademarks of X Corp. diff --git a/README.md b/README.md index ca5818d..d54f1ce 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,12 @@ Use it to get tweets from profiles, search tweets by keyword or operator query, It is generated with [Stainless](https://www.stainless.com/). +## Choose the Python SDK + +Choose this client for scripts, notebooks, workers, and Python services. +Use synchronous or asynchronous clients through the same resource structure. +Use Pydantic response models for validation and serialization. + ## Common X Data Tasks Use the linked Python API map for typed method names. @@ -34,11 +40,14 @@ Use the linked Python API map for typed method names. ## Tweet Search, Profile Tweets & User Lookup -Build Python services that search tweets, get tweets from profiles, fetch user profiles, check follower relationships, export followers, download media, and inspect timeline data through one typed REST client. +Use `XTwitterScraper` in scripts, notebooks, and synchronous workers. +Use `AsyncXTwitterScraper` in concurrent services. +Both clients return typed Pydantic response models. ## Real-Time Monitoring & Webhooks -Create monitors for X accounts, receive HMAC-signed webhook events, and query event history from the same SDK surface. +Verify HMAC signatures before handling monitor events in Python. +Query event history with the same synchronous or asynchronous client. ## AI Agent Workflows With MCP @@ -57,7 +66,8 @@ ChatGPT custom apps require OAuth. ## Giveaway Draws & Extractions -Run giveaway draws, export winners, and launch extraction jobs for replies, reposts, quotes, followers, lists, communities, threads, articles, and tweet search. +Launch draws and extractions from Python data pipelines. +Export completed results for downstream analysis. ## Xquik SDK vs Building From Scratch @@ -74,6 +84,7 @@ Run giveaway draws, export winners, and launch extraction jobs for replies, repo - Source: [Xquik-dev/x-twitter-scraper-python](https://github.com/Xquik-dev/x-twitter-scraper-python) - License: Apache-2.0 - Citation metadata: [CITATION.cff](CITATION.cff) +- Security policy: [SECURITY.md](SECURITY.md) ## FAQ diff --git a/REUSE.toml b/REUSE.toml new file mode 100644 index 0000000..3cd8ce5 --- /dev/null +++ b/REUSE.toml @@ -0,0 +1,10 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# SPDX-License-Identifier: Apache-2.0 + +version = 1 + +[[annotations]] +path = ["**"] +precedence = "override" +SPDX-FileCopyrightText = "2026 Xquik contributors" +SPDX-License-Identifier = "Apache-2.0" diff --git a/SECURITY.md b/SECURITY.md index 294240f..f250fb9 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -4,18 +4,66 @@ Security fixes target the latest published release. -## Reporting A Vulnerability +Upgrade before reporting behavior from an older release. -Report vulnerabilities privately through -[support@xquik.com](mailto:support@xquik.com). +## Report A Vulnerability -Do not open public issues for secrets, credential handling defects, private -data exposure, or package supply-chain concerns. +Use [GitHub private vulnerability reporting][private-report]. -We aim to acknowledge reports within 3 business days. We will coordinate a -disclosure timeline after confirming the issue. +Email [support@xquik.com](mailto:support@xquik.com) when GitHub is unavailable. -## Scope +Do not open a public issue. -Security-sensitive areas include API key handling, request construction, -response parsing, dependencies, generated code, and release metadata. +Include affected versions, impact, reproduction steps, and suggested mitigations. + +Remove credentials, personal data, and private service details. + +We aim to acknowledge reports within 3 business days. + +We aim to provide a status update within 7 business days. + +We coordinate disclosure after confirming and fixing the issue. + +## Security Boundaries + +This SDK builds requests and parses documented API responses. + +Applications control credentials, base URLs, transports, retries, and middleware. + +Only send credentials to trusted HTTPS endpoints. + +Treat response data and webhook payloads as untrusted input. + +The hosted Xquik service has a separate operational boundary. + +This repository excludes private infrastructure and service implementation details. + +## Threat Model + +Relevant threats include: + +- Credential leakage through logs, URLs, middleware, or debug output. +- Request redirection through untrusted base URLs. +- Malformed responses causing unsafe parsing or resource exhaustion. +- Dependency, generator, workflow, and release supply-chain compromise. +- Unsafe asynchronous access or transport behavior. + +Security controls include redaction tests, CodeQL, and fuzzing. + +CI also verifies dependencies, licenses, coverage, and reproducible archives. + +## Response Process + +Maintainers triage reports privately. + +Confirmed fixes use private coordination when an embargo is needed. + +Maintainers add regression tests and run every required gate. + +Releases document user impact without exposing exploit details prematurely. + +Maintainers publish an advisory when coordinated disclosure permits. + +[private-report]: https://github.com/Xquik-dev/x-twitter-scraper-python/security/advisories/new + +Xquik is an independent third-party service. Not affiliated with X Corp. "Twitter" and "X" are trademarks of X Corp. diff --git a/pyproject.toml b/pyproject.toml index fe8d77c..05b4b20 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -59,12 +59,13 @@ conflicts = [ [dependency-groups] # version pins are in uv.lock dev = [ + "coverage==7.15.2", "pyright==1.1.411", "mypy==2.3.0", "respx", "pytest", "pytest-asyncio", - "ruff", + "ruff==0.15.22", "time-machine", "dirty-equals>=0.6.0", "importlib-metadata>=6.7.0", diff --git a/requirements-dev.lock b/requirements-dev.lock index 9ccbcb9..1a87765 100644 --- a/requirements-dev.lock +++ b/requirements-dev.lock @@ -17,6 +17,7 @@ certifi==2026.6.17 # httpx colorama==0.4.6 ; sys_platform == 'win32' # via pytest +coverage==7.15.2 dirty-equals==0.11 distro==1.9.0 # via x-twitter-scraper diff --git a/scripts/audit b/scripts/audit new file mode 100755 index 0000000..a8c57ad --- /dev/null +++ b/scripts/audit @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + +set -euo pipefail + +cd "$(dirname "$0")/.." + +echo "==> Synchronizing the locked audit environment" +uv sync --locked --all-extras --group pydantic-v2 + +site_packages="$(uv run python -c 'import site; print(site.getsitepackages()[0])')" + +echo "==> Auditing installed locked dependencies" +uvx --from pip-audit==2.10.1 pip-audit --strict --path "$site_packages" diff --git a/scripts/bootstrap b/scripts/bootstrap index 5a23841..3f5de42 100755 --- a/scripts/bootstrap +++ b/scripts/bootstrap @@ -1,5 +1,9 @@ #!/usr/bin/env bash +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + set -e cd "$(dirname "$0")/.." @@ -23,8 +27,8 @@ echo "==> Installing Python…" uv python install echo "==> Installing Python dependencies…" -uv sync --all-extras +uv sync --locked --all-extras echo "==> Exporting Python dependencies…" # note: `--no-hashes` is required because of https://github.com/pypa/pip/issues/4995 -uv export -o requirements-dev.lock --no-hashes +uv export --frozen --no-hashes -o requirements-dev.lock diff --git a/scripts/check-reproducible b/scripts/check-reproducible new file mode 100755 index 0000000..dec801b --- /dev/null +++ b/scripts/check-reproducible @@ -0,0 +1,52 @@ +#!/usr/bin/env bash + +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + +set -euo pipefail + +cd "$(dirname "$0")/.." + +reproducibility_workspace="$(mktemp -d "${TMPDIR:-/tmp}/xquik-python-reproducibility.XXXXXX")" +trap 'rm -rf -- "$reproducibility_workspace"' EXIT + +mkdir "$reproducibility_workspace/first" "$reproducibility_workspace/second" + +echo "==> Building distributions twice" +SOURCE_DATE_EPOCH=946684800 uv build --out-dir "$reproducibility_workspace/first" +SOURCE_DATE_EPOCH=946684800 uv build --out-dir "$reproducibility_workspace/second" + +first_archives=("$reproducibility_workspace"/first/*) +if [[ "${#first_archives[@]}" -ne 2 ]]; then + echo "Expected one wheel and one source archive." >&2 + exit 1 +fi + +for first_archive in "${first_archives[@]}"; do + archive_name="${first_archive##*/}" + second_archive="$reproducibility_workspace/second/$archive_name" + if [[ ! -f "$second_archive" ]]; then + echo "Second build omitted $archive_name." >&2 + exit 1 + fi + cmp "$first_archive" "$second_archive" + + if [[ "$archive_name" == *.whl ]]; then + archive_listing="$(unzip -Z1 "$first_archive")" + expected_license="/licenses/LICENSE" + elif [[ "$archive_name" == *.tar.gz ]]; then + archive_listing="$(tar -tzf "$first_archive")" + expected_license="/LICENSE" + else + echo "Unexpected distribution type: $archive_name." >&2 + exit 1 + fi + + if [[ "$archive_listing" != *"$expected_license"* ]]; then + echo "$archive_name omits its Apache-2.0 license." >&2 + exit 1 + fi +done + +echo "Python wheel and source archives are reproducible." diff --git a/scripts/coverage b/scripts/coverage new file mode 100755 index 0000000..8eff5a1 --- /dev/null +++ b/scripts/coverage @@ -0,0 +1,49 @@ +#!/usr/bin/env bash + +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + +set -euo pipefail + +cd "$(dirname "$0")/.." + +coverage_workspace="$(mktemp -d "${TMPDIR:-/tmp}/xquik-python-coverage.XXXXXX")" +trap 'rm -rf -- "$coverage_workspace"' EXIT + +python_min=">=3.10.0" +python_max=">=3.14.0" + +run_coverage() { + local python_spec="$1" + local pydantic_group="$2" + local run_name="$3" + local run_log="$coverage_workspace/$run_name.log" + + echo "==> Covering $run_name" + if COVERAGE_FILE="$coverage_workspace/.coverage" \ + UV_PYTHON="$python_spec" \ + uv run --isolated --all-extras --group="$pydantic_group" \ + coverage run \ + --parallel-mode \ + --branch \ + --source=src/x_twitter_scraper \ + -m pytest -n 0 -q >"$run_log" 2>&1; then + tail -2 "$run_log" + return + fi + + sed -n '1,$p' "$run_log" >&2 + return 1 +} + +run_coverage "$python_min" pydantic-v2 python-min-pydantic-v2 +run_coverage "$python_min" pydantic-v1 python-min-pydantic-v1 +run_coverage "$python_max" pydantic-v2 python-max-pydantic-v2 + +export COVERAGE_FILE="$coverage_workspace/.coverage" +export UV_PYTHON="$python_max" + +uv run --isolated --all-extras coverage combine "$coverage_workspace" +uv run --isolated --all-extras coverage json -o "$coverage_workspace/report.json" +uv run --isolated --all-extras python scripts/verify_coverage.py "$coverage_workspace/report.json" diff --git a/scripts/format b/scripts/format index c8e1f69..12bb738 100755 --- a/scripts/format +++ b/scripts/format @@ -1,5 +1,9 @@ #!/usr/bin/env bash +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + set -e cd "$(dirname "$0")/.." @@ -11,4 +15,8 @@ uv run ruff check --fix . uv run ruff format echo "==> Formatting docs" -uv run python scripts/utils/ruffen-docs.py README.md $(find . -type f -name api.md) +api_docs=() +while IFS= read -r -d '' api_doc; do + api_docs+=("$api_doc") +done < <(find . -type f -name api.md -print0) +uv run python scripts/utils/ruffen-docs.py README.md "${api_docs[@]}" diff --git a/scripts/lint b/scripts/lint index d250cb1..a7cfcdf 100755 --- a/scripts/lint +++ b/scripts/lint @@ -1,5 +1,9 @@ #!/usr/bin/env bash +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + set -e cd "$(dirname "$0")/.." diff --git a/scripts/test b/scripts/test index 52af293..afc872d 100755 --- a/scripts/test +++ b/scripts/test @@ -1,5 +1,9 @@ #!/usr/bin/env bash +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + set -e cd "$(dirname "$0")/.." diff --git a/scripts/utils/ruffen-docs.py b/scripts/utils/ruffen-docs.py index 0cf2bd2..df34755 100644 --- a/scripts/utils/ruffen-docs.py +++ b/scripts/utils/ruffen-docs.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # fork of https://github.com/asottile/blacken-docs adapted for ruff from __future__ import annotations diff --git a/scripts/utils/upload-artifact.sh b/scripts/utils/upload-artifact.sh index ec8eb0e..8e02c2d 100755 --- a/scripts/utils/upload-artifact.sh +++ b/scripts/utils/upload-artifact.sh @@ -1,4 +1,9 @@ #!/usr/bin/env bash + +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + set -exuo pipefail FILENAME=$(basename dist/*.whl) diff --git a/scripts/verify_coverage.py b/scripts/verify_coverage.py new file mode 100755 index 0000000..94635e7 --- /dev/null +++ b/scripts/verify_coverage.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python3 + +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + +from __future__ import annotations + +import sys +import json +from typing import cast +from pathlib import Path +from collections.abc import Mapping, Sequence + +STATEMENT_MINIMUM = 90 +BRANCH_MINIMUM = 80 + + +def _integer(mapping: Mapping[str, object], key: str) -> int: + value = mapping.get(key) + if isinstance(value, bool) or not isinstance(value, int): + raise ValueError(f"Coverage report field {key!r} must be an integer") + return value + + +def coverage_percent(covered: int, total: int) -> float: + if total <= 0: + raise ValueError("Coverage report must contain measurable items") + return covered * 100 / total + + +def coverage_passes(covered: int, total: int, minimum: int) -> bool: + return covered * 100 >= total * minimum + + +def verify_coverage(report_path: Path) -> bool: + payload = cast(object, json.loads(report_path.read_text(encoding="utf-8"))) + if not isinstance(payload, dict): + raise ValueError("Coverage report root must be an object") + report = cast(dict[str, object], payload) + totals_value = report.get("totals") + if not isinstance(totals_value, dict): + raise ValueError("Coverage report must contain totals") + totals = cast(dict[str, object], totals_value) + + metrics = ( + ( + "Statement", + _integer(totals, "covered_lines"), + _integer(totals, "num_statements"), + STATEMENT_MINIMUM, + ), + ( + "Branch", + _integer(totals, "covered_branches"), + _integer(totals, "num_branches"), + BRANCH_MINIMUM, + ), + ) + + passed = True + for label, covered, total, minimum in metrics: + percent = coverage_percent(covered, total) + print(f"{label} coverage: {covered}/{total} ({percent:.2f}%); minimum {minimum:.2f}%") + passed = coverage_passes(covered, total, minimum) and passed + return passed + + +def main(argv: Sequence[str]) -> int: + if len(argv) != 2: + print("usage: verify_coverage.py COVERAGE_JSON", file=sys.stderr) + return 2 + return 0 if verify_coverage(Path(argv[1])) else 1 + + +if __name__ == "__main__": + raise SystemExit(main(sys.argv)) diff --git a/src/x_twitter_scraper/__init__.py b/src/x_twitter_scraper/__init__.py index 38669fd..2a02b44 100644 --- a/src/x_twitter_scraper/__init__.py +++ b/src/x_twitter_scraper/__init__.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import typing as _t diff --git a/src/x_twitter_scraper/_base_client.py b/src/x_twitter_scraper/_base_client.py index 7f49ab9..4f24442 100644 --- a/src/x_twitter_scraper/_base_client.py +++ b/src/x_twitter_scraper/_base_client.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + from __future__ import annotations import sys diff --git a/src/x_twitter_scraper/_client.py b/src/x_twitter_scraper/_client.py index 5da1c2e..f5ef0b6 100644 --- a/src/x_twitter_scraper/_client.py +++ b/src/x_twitter_scraper/_client.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/_compat.py b/src/x_twitter_scraper/_compat.py index e6690a4..4491094 100644 --- a/src/x_twitter_scraper/_compat.py +++ b/src/x_twitter_scraper/_compat.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + from __future__ import annotations from typing import TYPE_CHECKING, Any, Union, Generic, TypeVar, Callable, cast, overload diff --git a/src/x_twitter_scraper/_constants.py b/src/x_twitter_scraper/_constants.py index 6ddf2c7..b080472 100644 --- a/src/x_twitter_scraper/_constants.py +++ b/src/x_twitter_scraper/_constants.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import httpx diff --git a/src/x_twitter_scraper/_exceptions.py b/src/x_twitter_scraper/_exceptions.py index 17cb560..36fa256 100644 --- a/src/x_twitter_scraper/_exceptions.py +++ b/src/x_twitter_scraper/_exceptions.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/_files.py b/src/x_twitter_scraper/_files.py index 76da9e0..0a13b28 100644 --- a/src/x_twitter_scraper/_files.py +++ b/src/x_twitter_scraper/_files.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + from __future__ import annotations import io @@ -54,7 +58,7 @@ def to_httpx_files(files: RequestFiles | None) -> HttpxRequestFiles | None: if is_mapping_t(files): files = {key: _transform_file(file) for key, file in files.items()} - elif is_sequence_t(files): + elif is_sequence_t(files) and not isinstance(files, (str, bytes, bytearray)): files = [(key, _transform_file(file)) for key, file in files] else: raise TypeError(f"Unexpected file type input {type(files)}, expected mapping or sequence") @@ -63,6 +67,9 @@ def to_httpx_files(files: RequestFiles | None) -> HttpxRequestFiles | None: def _transform_file(file: FileTypes) -> HttpxFileTypes: + if is_tuple_t(file): + return (file[0], read_file_content(file[1]), *file[2:]) + if is_file_content(file): if isinstance(file, os.PathLike): path = pathlib.Path(file) @@ -70,9 +77,6 @@ def _transform_file(file: FileTypes) -> HttpxFileTypes: return file - if is_tuple_t(file): - return (file[0], read_file_content(file[1]), *file[2:]) - raise TypeError(f"Expected file types input to be a FileContent type or to be a tuple") @@ -96,7 +100,7 @@ async def async_to_httpx_files(files: RequestFiles | None) -> HttpxRequestFiles if is_mapping_t(files): files = {key: await _async_transform_file(file) for key, file in files.items()} - elif is_sequence_t(files): + elif is_sequence_t(files) and not isinstance(files, (str, bytes, bytearray)): files = [(key, await _async_transform_file(file)) for key, file in files] else: raise TypeError(f"Unexpected file type input {type(files)}, expected mapping or sequence") @@ -105,6 +109,9 @@ async def async_to_httpx_files(files: RequestFiles | None) -> HttpxRequestFiles async def _async_transform_file(file: FileTypes) -> HttpxFileTypes: + if is_tuple_t(file): + return (file[0], await async_read_file_content(file[1]), *file[2:]) + if is_file_content(file): if isinstance(file, os.PathLike): path = anyio.Path(file) @@ -112,9 +119,6 @@ async def _async_transform_file(file: FileTypes) -> HttpxFileTypes: return file - if is_tuple_t(file): - return (file[0], await async_read_file_content(file[1]), *file[2:]) - raise TypeError(f"Expected file types input to be a FileContent type or to be a tuple") diff --git a/src/x_twitter_scraper/_models.py b/src/x_twitter_scraper/_models.py index a7032f2..dda5216 100644 --- a/src/x_twitter_scraper/_models.py +++ b/src/x_twitter_scraper/_models.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + from __future__ import annotations import os diff --git a/src/x_twitter_scraper/_qs.py b/src/x_twitter_scraper/_qs.py index 4127c19..e5fb699 100644 --- a/src/x_twitter_scraper/_qs.py +++ b/src/x_twitter_scraper/_qs.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + from __future__ import annotations from typing import Any, List, Tuple, Union, Mapping, TypeVar diff --git a/src/x_twitter_scraper/_resource.py b/src/x_twitter_scraper/_resource.py index b8d9968..65e39d7 100644 --- a/src/x_twitter_scraper/_resource.py +++ b/src/x_twitter_scraper/_resource.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/_response.py b/src/x_twitter_scraper/_response.py index b71890e..3f10af1 100644 --- a/src/x_twitter_scraper/_response.py +++ b/src/x_twitter_scraper/_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + from __future__ import annotations import os diff --git a/src/x_twitter_scraper/_streaming.py b/src/x_twitter_scraper/_streaming.py index cc87608..b02612d 100644 --- a/src/x_twitter_scraper/_streaming.py +++ b/src/x_twitter_scraper/_streaming.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # Note: initially copied from https://github.com/florimondmanca/httpx-sse/blob/master/src/httpx_sse/_decoders.py from __future__ import annotations diff --git a/src/x_twitter_scraper/_types.py b/src/x_twitter_scraper/_types.py index 5f43cee..b1342b9 100644 --- a/src/x_twitter_scraper/_types.py +++ b/src/x_twitter_scraper/_types.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + from __future__ import annotations from os import PathLike diff --git a/src/x_twitter_scraper/_utils/__init__.py b/src/x_twitter_scraper/_utils/__init__.py index 1c090e5..c4828e7 100644 --- a/src/x_twitter_scraper/_utils/__init__.py +++ b/src/x_twitter_scraper/_utils/__init__.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + from ._path import path_template as path_template from ._sync import asyncify as asyncify from ._proxy import LazyProxy as LazyProxy diff --git a/src/x_twitter_scraper/_utils/_compat.py b/src/x_twitter_scraper/_utils/_compat.py index bcaeacf..11e2da9 100644 --- a/src/x_twitter_scraper/_utils/_compat.py +++ b/src/x_twitter_scraper/_utils/_compat.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + from __future__ import annotations import sys diff --git a/src/x_twitter_scraper/_utils/_datetime_parse.py b/src/x_twitter_scraper/_utils/_datetime_parse.py index 7cb9d9e..7bc7d69 100644 --- a/src/x_twitter_scraper/_utils/_datetime_parse.py +++ b/src/x_twitter_scraper/_utils/_datetime_parse.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + """ This file contains code from https://github.com/pydantic/pydantic/blob/main/pydantic/v1/datetime_parse.py without the Pydantic v1 specific errors. diff --git a/src/x_twitter_scraper/_utils/_json.py b/src/x_twitter_scraper/_utils/_json.py index 6058421..971e0eb 100644 --- a/src/x_twitter_scraper/_utils/_json.py +++ b/src/x_twitter_scraper/_utils/_json.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + import json from typing import Any from datetime import datetime diff --git a/src/x_twitter_scraper/_utils/_logs.py b/src/x_twitter_scraper/_utils/_logs.py index abef7c8..6af313c 100644 --- a/src/x_twitter_scraper/_utils/_logs.py +++ b/src/x_twitter_scraper/_utils/_logs.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + import os import logging diff --git a/src/x_twitter_scraper/_utils/_path.py b/src/x_twitter_scraper/_utils/_path.py index 4d6e1e4..63c5c5c 100644 --- a/src/x_twitter_scraper/_utils/_path.py +++ b/src/x_twitter_scraper/_utils/_path.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + from __future__ import annotations import re diff --git a/src/x_twitter_scraper/_utils/_proxy.py b/src/x_twitter_scraper/_utils/_proxy.py index 0f239a3..83977f0 100644 --- a/src/x_twitter_scraper/_utils/_proxy.py +++ b/src/x_twitter_scraper/_utils/_proxy.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + from __future__ import annotations from abc import ABC, abstractmethod diff --git a/src/x_twitter_scraper/_utils/_reflection.py b/src/x_twitter_scraper/_utils/_reflection.py index 89aa712..a883678 100644 --- a/src/x_twitter_scraper/_utils/_reflection.py +++ b/src/x_twitter_scraper/_utils/_reflection.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + from __future__ import annotations import inspect diff --git a/src/x_twitter_scraper/_utils/_resources_proxy.py b/src/x_twitter_scraper/_utils/_resources_proxy.py index 99d3dcf..3b60440 100644 --- a/src/x_twitter_scraper/_utils/_resources_proxy.py +++ b/src/x_twitter_scraper/_utils/_resources_proxy.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + from __future__ import annotations from typing import Any diff --git a/src/x_twitter_scraper/_utils/_streams.py b/src/x_twitter_scraper/_utils/_streams.py index f4a0208..bc245e5 100644 --- a/src/x_twitter_scraper/_utils/_streams.py +++ b/src/x_twitter_scraper/_utils/_streams.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + from typing import Any from typing_extensions import Iterator, AsyncIterator diff --git a/src/x_twitter_scraper/_utils/_sync.py b/src/x_twitter_scraper/_utils/_sync.py index f6027c1..f442b8b 100644 --- a/src/x_twitter_scraper/_utils/_sync.py +++ b/src/x_twitter_scraper/_utils/_sync.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + from __future__ import annotations import asyncio diff --git a/src/x_twitter_scraper/_utils/_transform.py b/src/x_twitter_scraper/_utils/_transform.py index 5207549..bf63ab3 100644 --- a/src/x_twitter_scraper/_utils/_transform.py +++ b/src/x_twitter_scraper/_utils/_transform.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + from __future__ import annotations import io diff --git a/src/x_twitter_scraper/_utils/_typing.py b/src/x_twitter_scraper/_utils/_typing.py index 193109f..8d7d4a3 100644 --- a/src/x_twitter_scraper/_utils/_typing.py +++ b/src/x_twitter_scraper/_utils/_typing.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + from __future__ import annotations import sys @@ -125,9 +129,9 @@ class MyResponse(Foo[_T]): # because it is intended to be for internal use only, however there does # not seem to be a way to resolve generic TypeVars for inherited subclasses # without using it. - if isinstance(cls, InheritsGeneric): + if hasattr(cls, "__orig_bases__"): target_base_class: Any | None = None - for base in cls.__orig_bases__: + for base in cast(InheritsGeneric, cls).__orig_bases__: if base.__origin__ in generic_bases: target_base_class = base break diff --git a/src/x_twitter_scraper/_utils/_utils.py b/src/x_twitter_scraper/_utils/_utils.py index 199cd23..92e5f49 100644 --- a/src/x_twitter_scraper/_utils/_utils.py +++ b/src/x_twitter_scraper/_utils/_utils.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + from __future__ import annotations import os diff --git a/src/x_twitter_scraper/_version.py b/src/x_twitter_scraper/_version.py index 907c962..738b89f 100644 --- a/src/x_twitter_scraper/_version.py +++ b/src/x_twitter_scraper/_version.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "x_twitter_scraper" diff --git a/src/x_twitter_scraper/resources/__init__.py b/src/x_twitter_scraper/resources/__init__.py index 2402b02..44e9519 100644 --- a/src/x_twitter_scraper/resources/__init__.py +++ b/src/x_twitter_scraper/resources/__init__.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from .x import ( diff --git a/src/x_twitter_scraper/resources/account.py b/src/x_twitter_scraper/resources/account.py index 0739c88..d848029 100644 --- a/src/x_twitter_scraper/resources/account.py +++ b/src/x_twitter_scraper/resources/account.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/compose.py b/src/x_twitter_scraper/resources/compose.py index d488562..cf5ddd8 100644 --- a/src/x_twitter_scraper/resources/compose.py +++ b/src/x_twitter_scraper/resources/compose.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/credits.py b/src/x_twitter_scraper/resources/credits.py index c66060c..4d37210 100644 --- a/src/x_twitter_scraper/resources/credits.py +++ b/src/x_twitter_scraper/resources/credits.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations @@ -74,7 +78,7 @@ def redirect_topup_checkout( timeout: Override the client-level default timeout for this request, in seconds """ - extra_headers = {"Accept": "*/*", **(extra_headers or {})} + extra_headers = {"Accept": "*/*", "x-api-key": omit, **(extra_headers or {})} return self._get( "/credits/topup/redirect", options=make_request_options( @@ -241,7 +245,7 @@ async def redirect_topup_checkout( timeout: Override the client-level default timeout for this request, in seconds """ - extra_headers = {"Accept": "*/*", **(extra_headers or {})} + extra_headers = {"Accept": "*/*", "x-api-key": omit, **(extra_headers or {})} return await self._get( "/credits/topup/redirect", options=make_request_options( diff --git a/src/x_twitter_scraper/resources/drafts.py b/src/x_twitter_scraper/resources/drafts.py index 51ef35b..2d7bc53 100644 --- a/src/x_twitter_scraper/resources/drafts.py +++ b/src/x_twitter_scraper/resources/drafts.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/draws.py b/src/x_twitter_scraper/resources/draws.py index 829d434..cad659f 100644 --- a/src/x_twitter_scraper/resources/draws.py +++ b/src/x_twitter_scraper/resources/draws.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/events.py b/src/x_twitter_scraper/resources/events.py index d67b829..3b1ff17 100644 --- a/src/x_twitter_scraper/resources/events.py +++ b/src/x_twitter_scraper/resources/events.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/extractions.py b/src/x_twitter_scraper/resources/extractions.py index 5b10f98..324bcf0 100644 --- a/src/x_twitter_scraper/resources/extractions.py +++ b/src/x_twitter_scraper/resources/extractions.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/guest_wallets.py b/src/x_twitter_scraper/resources/guest_wallets.py index d4eafe8..3ef91bc 100644 --- a/src/x_twitter_scraper/resources/guest_wallets.py +++ b/src/x_twitter_scraper/resources/guest_wallets.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations @@ -7,7 +11,7 @@ import httpx from ..types import guest_wallet_topup_params, guest_wallet_create_params -from .._types import Body, Query, Headers, NotGiven, not_given +from .._types import Body, Query, Headers, NotGiven, omit, not_given from .._utils import maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource @@ -78,7 +82,7 @@ def create( timeout: Override the client-level default timeout for this request, in seconds """ - extra_headers = {"Idempotency-Key": idempotency_key, **(extra_headers or {})} + extra_headers = {"x-api-key": omit, "Idempotency-Key": idempotency_key, **(extra_headers or {})} return self._post( "/guest-wallets", body=maybe_transform( @@ -231,7 +235,7 @@ async def create( timeout: Override the client-level default timeout for this request, in seconds """ - extra_headers = {"Idempotency-Key": idempotency_key, **(extra_headers or {})} + extra_headers = {"x-api-key": omit, "Idempotency-Key": idempotency_key, **(extra_headers or {})} return await self._post( "/guest-wallets", body=await async_maybe_transform( diff --git a/src/x_twitter_scraper/resources/monitors/__init__.py b/src/x_twitter_scraper/resources/monitors/__init__.py index 1447be9..38ceaaf 100644 --- a/src/x_twitter_scraper/resources/monitors/__init__.py +++ b/src/x_twitter_scraper/resources/monitors/__init__.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from .keywords import ( diff --git a/src/x_twitter_scraper/resources/monitors/keywords.py b/src/x_twitter_scraper/resources/monitors/keywords.py index 7821b5f..efc5654 100644 --- a/src/x_twitter_scraper/resources/monitors/keywords.py +++ b/src/x_twitter_scraper/resources/monitors/keywords.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/monitors/monitors.py b/src/x_twitter_scraper/resources/monitors/monitors.py index 55f6498..7bde945 100644 --- a/src/x_twitter_scraper/resources/monitors/monitors.py +++ b/src/x_twitter_scraper/resources/monitors/monitors.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/radar.py b/src/x_twitter_scraper/resources/radar.py index 30aefec..633377e 100644 --- a/src/x_twitter_scraper/resources/radar.py +++ b/src/x_twitter_scraper/resources/radar.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/styles.py b/src/x_twitter_scraper/resources/styles.py index ebee277..03e154f 100644 --- a/src/x_twitter_scraper/resources/styles.py +++ b/src/x_twitter_scraper/resources/styles.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/subscribe.py b/src/x_twitter_scraper/resources/subscribe.py index 645c3e6..6c594dd 100644 --- a/src/x_twitter_scraper/resources/subscribe.py +++ b/src/x_twitter_scraper/resources/subscribe.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/support/__init__.py b/src/x_twitter_scraper/resources/support/__init__.py index 8bc3cf4..9846ab2 100644 --- a/src/x_twitter_scraper/resources/support/__init__.py +++ b/src/x_twitter_scraper/resources/support/__init__.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from .support import ( diff --git a/src/x_twitter_scraper/resources/support/support.py b/src/x_twitter_scraper/resources/support/support.py index 8afab8d..c5a3feb 100644 --- a/src/x_twitter_scraper/resources/support/support.py +++ b/src/x_twitter_scraper/resources/support/support.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/support/tickets.py b/src/x_twitter_scraper/resources/support/tickets.py index 55af129..5d85ad7 100644 --- a/src/x_twitter_scraper/resources/support/tickets.py +++ b/src/x_twitter_scraper/resources/support/tickets.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/trends.py b/src/x_twitter_scraper/resources/trends.py index 521ea19..d37ebae 100644 --- a/src/x_twitter_scraper/resources/trends.py +++ b/src/x_twitter_scraper/resources/trends.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/webhooks.py b/src/x_twitter_scraper/resources/webhooks.py index 2277220..f54bcfa 100644 --- a/src/x_twitter_scraper/resources/webhooks.py +++ b/src/x_twitter_scraper/resources/webhooks.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/x/__init__.py b/src/x_twitter_scraper/resources/x/__init__.py index 86918f6..e40b088 100644 --- a/src/x_twitter_scraper/resources/x/__init__.py +++ b/src/x_twitter_scraper/resources/x/__init__.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from .x import ( diff --git a/src/x_twitter_scraper/resources/x/account_connection_challenges.py b/src/x_twitter_scraper/resources/x/account_connection_challenges.py index e16c723..09bcba5 100644 --- a/src/x_twitter_scraper/resources/x/account_connection_challenges.py +++ b/src/x_twitter_scraper/resources/x/account_connection_challenges.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/x/accounts.py b/src/x_twitter_scraper/resources/x/accounts.py index 38d9295..8efaf97 100644 --- a/src/x_twitter_scraper/resources/x/accounts.py +++ b/src/x_twitter_scraper/resources/x/accounts.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/x/bookmarks.py b/src/x_twitter_scraper/resources/x/bookmarks.py index 5dd4c23..7017b79 100644 --- a/src/x_twitter_scraper/resources/x/bookmarks.py +++ b/src/x_twitter_scraper/resources/x/bookmarks.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/x/communities/__init__.py b/src/x_twitter_scraper/resources/x/communities/__init__.py index 6f230f7..9b91e2a 100644 --- a/src/x_twitter_scraper/resources/x/communities/__init__.py +++ b/src/x_twitter_scraper/resources/x/communities/__init__.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from .join import ( diff --git a/src/x_twitter_scraper/resources/x/communities/communities.py b/src/x_twitter_scraper/resources/x/communities/communities.py index a9ad5b7..390741c 100644 --- a/src/x_twitter_scraper/resources/x/communities/communities.py +++ b/src/x_twitter_scraper/resources/x/communities/communities.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/x/communities/join.py b/src/x_twitter_scraper/resources/x/communities/join.py index 9a51a0a..5b7f97b 100644 --- a/src/x_twitter_scraper/resources/x/communities/join.py +++ b/src/x_twitter_scraper/resources/x/communities/join.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/x/communities/tweets.py b/src/x_twitter_scraper/resources/x/communities/tweets.py index bf90f1c..751b6e9 100644 --- a/src/x_twitter_scraper/resources/x/communities/tweets.py +++ b/src/x_twitter_scraper/resources/x/communities/tweets.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/x/dm.py b/src/x_twitter_scraper/resources/x/dm.py index d3846d4..f181739 100644 --- a/src/x_twitter_scraper/resources/x/dm.py +++ b/src/x_twitter_scraper/resources/x/dm.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/x/followers.py b/src/x_twitter_scraper/resources/x/followers.py index 48d7fdb..e8c719b 100644 --- a/src/x_twitter_scraper/resources/x/followers.py +++ b/src/x_twitter_scraper/resources/x/followers.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/x/lists.py b/src/x_twitter_scraper/resources/x/lists.py index e7b517d..f1b7eaf 100644 --- a/src/x_twitter_scraper/resources/x/lists.py +++ b/src/x_twitter_scraper/resources/x/lists.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/x/media.py b/src/x_twitter_scraper/resources/x/media.py index 08df67c..6b90532 100644 --- a/src/x_twitter_scraper/resources/x/media.py +++ b/src/x_twitter_scraper/resources/x/media.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/x/profile.py b/src/x_twitter_scraper/resources/x/profile.py index d68bfbf..a75c487 100644 --- a/src/x_twitter_scraper/resources/x/profile.py +++ b/src/x_twitter_scraper/resources/x/profile.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/x/tweets/__init__.py b/src/x_twitter_scraper/resources/x/tweets/__init__.py index e4e246b..f979d09 100644 --- a/src/x_twitter_scraper/resources/x/tweets/__init__.py +++ b/src/x_twitter_scraper/resources/x/tweets/__init__.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from .like import ( diff --git a/src/x_twitter_scraper/resources/x/tweets/like.py b/src/x_twitter_scraper/resources/x/tweets/like.py index cf7b142..cc6ac73 100644 --- a/src/x_twitter_scraper/resources/x/tweets/like.py +++ b/src/x_twitter_scraper/resources/x/tweets/like.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/x/tweets/retweet.py b/src/x_twitter_scraper/resources/x/tweets/retweet.py index a23f837..d35e7d5 100644 --- a/src/x_twitter_scraper/resources/x/tweets/retweet.py +++ b/src/x_twitter_scraper/resources/x/tweets/retweet.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/x/tweets/tweets.py b/src/x_twitter_scraper/resources/x/tweets/tweets.py index 419c56c..3037620 100644 --- a/src/x_twitter_scraper/resources/x/tweets/tweets.py +++ b/src/x_twitter_scraper/resources/x/tweets/tweets.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/x/users/__init__.py b/src/x_twitter_scraper/resources/x/users/__init__.py index 83b7c84..3fad4d2 100644 --- a/src/x_twitter_scraper/resources/x/users/__init__.py +++ b/src/x_twitter_scraper/resources/x/users/__init__.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from .users import ( diff --git a/src/x_twitter_scraper/resources/x/users/follow.py b/src/x_twitter_scraper/resources/x/users/follow.py index 2f650a9..fadc394 100644 --- a/src/x_twitter_scraper/resources/x/users/follow.py +++ b/src/x_twitter_scraper/resources/x/users/follow.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/x/users/users.py b/src/x_twitter_scraper/resources/x/users/users.py index 80a4bab..b235156 100644 --- a/src/x_twitter_scraper/resources/x/users/users.py +++ b/src/x_twitter_scraper/resources/x/users/users.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/x/write_actions.py b/src/x_twitter_scraper/resources/x/write_actions.py index f769ae7..8c238fc 100644 --- a/src/x_twitter_scraper/resources/x/write_actions.py +++ b/src/x_twitter_scraper/resources/x/write_actions.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/resources/x/x.py b/src/x_twitter_scraper/resources/x/x.py index 94a48db..8171ec7 100644 --- a/src/x_twitter_scraper/resources/x/x.py +++ b/src/x_twitter_scraper/resources/x/x.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/__init__.py b/src/x_twitter_scraper/types/__init__.py index 3952303..a9d5574 100644 --- a/src/x_twitter_scraper/types/__init__.py +++ b/src/x_twitter_scraper/types/__init__.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/account_retrieve_response.py b/src/x_twitter_scraper/types/account_retrieve_response.py index 635650f..4a2f2cd 100644 --- a/src/x_twitter_scraper/types/account_retrieve_response.py +++ b/src/x_twitter_scraper/types/account_retrieve_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import Optional diff --git a/src/x_twitter_scraper/types/account_set_x_username_params.py b/src/x_twitter_scraper/types/account_set_x_username_params.py index 48e8ce3..77519db 100644 --- a/src/x_twitter_scraper/types/account_set_x_username_params.py +++ b/src/x_twitter_scraper/types/account_set_x_username_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/account_set_x_username_response.py b/src/x_twitter_scraper/types/account_set_x_username_response.py index 7a789cb..ec25646 100644 --- a/src/x_twitter_scraper/types/account_set_x_username_response.py +++ b/src/x_twitter_scraper/types/account_set_x_username_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing_extensions import Literal diff --git a/src/x_twitter_scraper/types/account_update_locale_params.py b/src/x_twitter_scraper/types/account_update_locale_params.py index 3262758..3f2e055 100644 --- a/src/x_twitter_scraper/types/account_update_locale_params.py +++ b/src/x_twitter_scraper/types/account_update_locale_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/account_update_locale_response.py b/src/x_twitter_scraper/types/account_update_locale_response.py index a3fd699..127a56e 100644 --- a/src/x_twitter_scraper/types/account_update_locale_response.py +++ b/src/x_twitter_scraper/types/account_update_locale_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing_extensions import Literal diff --git a/src/x_twitter_scraper/types/compose_create_params.py b/src/x_twitter_scraper/types/compose_create_params.py index 6852968..80faa14 100644 --- a/src/x_twitter_scraper/types/compose_create_params.py +++ b/src/x_twitter_scraper/types/compose_create_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/compose_create_response.py b/src/x_twitter_scraper/types/compose_create_response.py index 76ca0c2..e0c8162 100644 --- a/src/x_twitter_scraper/types/compose_create_response.py +++ b/src/x_twitter_scraper/types/compose_create_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List, Union, Optional diff --git a/src/x_twitter_scraper/types/credit_redirect_topup_checkout_params.py b/src/x_twitter_scraper/types/credit_redirect_topup_checkout_params.py index ed3c419..22739c7 100644 --- a/src/x_twitter_scraper/types/credit_redirect_topup_checkout_params.py +++ b/src/x_twitter_scraper/types/credit_redirect_topup_checkout_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/credit_retrieve_balance_response.py b/src/x_twitter_scraper/types/credit_retrieve_balance_response.py index 1cc1a5f..a49d870 100644 --- a/src/x_twitter_scraper/types/credit_retrieve_balance_response.py +++ b/src/x_twitter_scraper/types/credit_retrieve_balance_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from .._models import BaseModel diff --git a/src/x_twitter_scraper/types/credit_retrieve_topup_status_params.py b/src/x_twitter_scraper/types/credit_retrieve_topup_status_params.py index 5e34efc..f70ff86 100644 --- a/src/x_twitter_scraper/types/credit_retrieve_topup_status_params.py +++ b/src/x_twitter_scraper/types/credit_retrieve_topup_status_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/credit_retrieve_topup_status_response.py b/src/x_twitter_scraper/types/credit_retrieve_topup_status_response.py index 249f224..47541d7 100644 --- a/src/x_twitter_scraper/types/credit_retrieve_topup_status_response.py +++ b/src/x_twitter_scraper/types/credit_retrieve_topup_status_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import Optional diff --git a/src/x_twitter_scraper/types/credit_topup_balance_params.py b/src/x_twitter_scraper/types/credit_topup_balance_params.py index 0abe164..03b12b9 100644 --- a/src/x_twitter_scraper/types/credit_topup_balance_params.py +++ b/src/x_twitter_scraper/types/credit_topup_balance_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/credit_topup_balance_response.py b/src/x_twitter_scraper/types/credit_topup_balance_response.py index dee6c75..2f16ea3 100644 --- a/src/x_twitter_scraper/types/credit_topup_balance_response.py +++ b/src/x_twitter_scraper/types/credit_topup_balance_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from .._models import BaseModel diff --git a/src/x_twitter_scraper/types/delivery.py b/src/x_twitter_scraper/types/delivery.py index 5086116..1bdb806 100644 --- a/src/x_twitter_scraper/types/delivery.py +++ b/src/x_twitter_scraper/types/delivery.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import Optional diff --git a/src/x_twitter_scraper/types/draft.py b/src/x_twitter_scraper/types/draft.py index 805b4d9..daf4f40 100644 --- a/src/x_twitter_scraper/types/draft.py +++ b/src/x_twitter_scraper/types/draft.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import Optional diff --git a/src/x_twitter_scraper/types/draft_create_params.py b/src/x_twitter_scraper/types/draft_create_params.py index 7ce5b3c..117ad60 100644 --- a/src/x_twitter_scraper/types/draft_create_params.py +++ b/src/x_twitter_scraper/types/draft_create_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/draft_detail.py b/src/x_twitter_scraper/types/draft_detail.py index e4844df..e91e713 100644 --- a/src/x_twitter_scraper/types/draft_detail.py +++ b/src/x_twitter_scraper/types/draft_detail.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import Optional diff --git a/src/x_twitter_scraper/types/draft_list_params.py b/src/x_twitter_scraper/types/draft_list_params.py index dcb5933..b33b8a8 100644 --- a/src/x_twitter_scraper/types/draft_list_params.py +++ b/src/x_twitter_scraper/types/draft_list_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/draft_list_response.py b/src/x_twitter_scraper/types/draft_list_response.py index 61dc9a0..8a0034d 100644 --- a/src/x_twitter_scraper/types/draft_list_response.py +++ b/src/x_twitter_scraper/types/draft_list_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List, Optional diff --git a/src/x_twitter_scraper/types/draw_detail.py b/src/x_twitter_scraper/types/draw_detail.py index a9a6ec3..e82b8c2 100644 --- a/src/x_twitter_scraper/types/draw_detail.py +++ b/src/x_twitter_scraper/types/draw_detail.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import Optional diff --git a/src/x_twitter_scraper/types/draw_export_params.py b/src/x_twitter_scraper/types/draw_export_params.py index b9c083a..558c04f 100644 --- a/src/x_twitter_scraper/types/draw_export_params.py +++ b/src/x_twitter_scraper/types/draw_export_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/draw_list_item.py b/src/x_twitter_scraper/types/draw_list_item.py index 628ca55..2efbbee 100644 --- a/src/x_twitter_scraper/types/draw_list_item.py +++ b/src/x_twitter_scraper/types/draw_list_item.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import Optional diff --git a/src/x_twitter_scraper/types/draw_list_params.py b/src/x_twitter_scraper/types/draw_list_params.py index edf9c67..bec6d02 100644 --- a/src/x_twitter_scraper/types/draw_list_params.py +++ b/src/x_twitter_scraper/types/draw_list_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/draw_list_response.py b/src/x_twitter_scraper/types/draw_list_response.py index 6bf59c9..fb2405a 100644 --- a/src/x_twitter_scraper/types/draw_list_response.py +++ b/src/x_twitter_scraper/types/draw_list_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List, Optional diff --git a/src/x_twitter_scraper/types/draw_retrieve_response.py b/src/x_twitter_scraper/types/draw_retrieve_response.py index 72c543c..710971b 100644 --- a/src/x_twitter_scraper/types/draw_retrieve_response.py +++ b/src/x_twitter_scraper/types/draw_retrieve_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List diff --git a/src/x_twitter_scraper/types/draw_run_params.py b/src/x_twitter_scraper/types/draw_run_params.py index c7efb46..881ebc8 100644 --- a/src/x_twitter_scraper/types/draw_run_params.py +++ b/src/x_twitter_scraper/types/draw_run_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/draw_run_response.py b/src/x_twitter_scraper/types/draw_run_response.py index 7bd9f42..b0ea356 100644 --- a/src/x_twitter_scraper/types/draw_run_response.py +++ b/src/x_twitter_scraper/types/draw_run_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List diff --git a/src/x_twitter_scraper/types/event.py b/src/x_twitter_scraper/types/event.py index 8f288d5..b4afed8 100644 --- a/src/x_twitter_scraper/types/event.py +++ b/src/x_twitter_scraper/types/event.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import Dict, Optional diff --git a/src/x_twitter_scraper/types/event_detail.py b/src/x_twitter_scraper/types/event_detail.py index 9c8a1f5..6383e0b 100644 --- a/src/x_twitter_scraper/types/event_detail.py +++ b/src/x_twitter_scraper/types/event_detail.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import Dict, Optional diff --git a/src/x_twitter_scraper/types/event_list_params.py b/src/x_twitter_scraper/types/event_list_params.py index 18e0671..a7b5dc4 100644 --- a/src/x_twitter_scraper/types/event_list_params.py +++ b/src/x_twitter_scraper/types/event_list_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/event_list_response.py b/src/x_twitter_scraper/types/event_list_response.py index 6558dd7..d578dc5 100644 --- a/src/x_twitter_scraper/types/event_list_response.py +++ b/src/x_twitter_scraper/types/event_list_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List, Optional diff --git a/src/x_twitter_scraper/types/extraction_estimate_cost_params.py b/src/x_twitter_scraper/types/extraction_estimate_cost_params.py index 193aef5..f4b2873 100644 --- a/src/x_twitter_scraper/types/extraction_estimate_cost_params.py +++ b/src/x_twitter_scraper/types/extraction_estimate_cost_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/extraction_estimate_cost_response.py b/src/x_twitter_scraper/types/extraction_estimate_cost_response.py index 3a8d869..3dd72af 100644 --- a/src/x_twitter_scraper/types/extraction_estimate_cost_response.py +++ b/src/x_twitter_scraper/types/extraction_estimate_cost_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import Optional diff --git a/src/x_twitter_scraper/types/extraction_export_results_params.py b/src/x_twitter_scraper/types/extraction_export_results_params.py index ef440f6..6c1bd7b 100644 --- a/src/x_twitter_scraper/types/extraction_export_results_params.py +++ b/src/x_twitter_scraper/types/extraction_export_results_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/extraction_job.py b/src/x_twitter_scraper/types/extraction_job.py index d45fe2e..8d9e63a 100644 --- a/src/x_twitter_scraper/types/extraction_job.py +++ b/src/x_twitter_scraper/types/extraction_job.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import Optional diff --git a/src/x_twitter_scraper/types/extraction_list_params.py b/src/x_twitter_scraper/types/extraction_list_params.py index e01c26a..30325af 100644 --- a/src/x_twitter_scraper/types/extraction_list_params.py +++ b/src/x_twitter_scraper/types/extraction_list_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/extraction_list_response.py b/src/x_twitter_scraper/types/extraction_list_response.py index b48e34f..2ea4c46 100644 --- a/src/x_twitter_scraper/types/extraction_list_response.py +++ b/src/x_twitter_scraper/types/extraction_list_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List, Optional diff --git a/src/x_twitter_scraper/types/extraction_retrieve_params.py b/src/x_twitter_scraper/types/extraction_retrieve_params.py index 9b992a4..acda1bd 100644 --- a/src/x_twitter_scraper/types/extraction_retrieve_params.py +++ b/src/x_twitter_scraper/types/extraction_retrieve_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/extraction_retrieve_response.py b/src/x_twitter_scraper/types/extraction_retrieve_response.py index e993266..3e9a755 100644 --- a/src/x_twitter_scraper/types/extraction_retrieve_response.py +++ b/src/x_twitter_scraper/types/extraction_retrieve_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import Dict, List, Optional diff --git a/src/x_twitter_scraper/types/extraction_run_params.py b/src/x_twitter_scraper/types/extraction_run_params.py index b8e1f25..bf4b15a 100644 --- a/src/x_twitter_scraper/types/extraction_run_params.py +++ b/src/x_twitter_scraper/types/extraction_run_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/extraction_run_response.py b/src/x_twitter_scraper/types/extraction_run_response.py index 367b1c8..d05ff94 100644 --- a/src/x_twitter_scraper/types/extraction_run_response.py +++ b/src/x_twitter_scraper/types/extraction_run_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing_extensions import Literal diff --git a/src/x_twitter_scraper/types/guest_wallet_amount.py b/src/x_twitter_scraper/types/guest_wallet_amount.py index 55c66c1..ad981f3 100644 --- a/src/x_twitter_scraper/types/guest_wallet_amount.py +++ b/src/x_twitter_scraper/types/guest_wallet_amount.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing_extensions import Literal diff --git a/src/x_twitter_scraper/types/guest_wallet_create_params.py b/src/x_twitter_scraper/types/guest_wallet_create_params.py index 8fecba7..ae15499 100644 --- a/src/x_twitter_scraper/types/guest_wallet_create_params.py +++ b/src/x_twitter_scraper/types/guest_wallet_create_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/guest_wallet_create_response.py b/src/x_twitter_scraper/types/guest_wallet_create_response.py index 00f84e9..5812df8 100644 --- a/src/x_twitter_scraper/types/guest_wallet_create_response.py +++ b/src/x_twitter_scraper/types/guest_wallet_create_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from datetime import datetime diff --git a/src/x_twitter_scraper/types/guest_wallet_retrieve_status_response.py b/src/x_twitter_scraper/types/guest_wallet_retrieve_status_response.py index e03c5f2..0a75668 100644 --- a/src/x_twitter_scraper/types/guest_wallet_retrieve_status_response.py +++ b/src/x_twitter_scraper/types/guest_wallet_retrieve_status_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import Optional diff --git a/src/x_twitter_scraper/types/guest_wallet_topup_params.py b/src/x_twitter_scraper/types/guest_wallet_topup_params.py index ad05867..35de0a9 100644 --- a/src/x_twitter_scraper/types/guest_wallet_topup_params.py +++ b/src/x_twitter_scraper/types/guest_wallet_topup_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/guest_wallet_topup_response.py b/src/x_twitter_scraper/types/guest_wallet_topup_response.py index 94d46c7..fcbad9a 100644 --- a/src/x_twitter_scraper/types/guest_wallet_topup_response.py +++ b/src/x_twitter_scraper/types/guest_wallet_topup_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import Optional diff --git a/src/x_twitter_scraper/types/monitor.py b/src/x_twitter_scraper/types/monitor.py index 1d6de76..c820e7e 100644 --- a/src/x_twitter_scraper/types/monitor.py +++ b/src/x_twitter_scraper/types/monitor.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List diff --git a/src/x_twitter_scraper/types/monitor_create_params.py b/src/x_twitter_scraper/types/monitor_create_params.py index adf8fdd..e0c1257 100644 --- a/src/x_twitter_scraper/types/monitor_create_params.py +++ b/src/x_twitter_scraper/types/monitor_create_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/monitor_create_response.py b/src/x_twitter_scraper/types/monitor_create_response.py index 86782a3..912f550 100644 --- a/src/x_twitter_scraper/types/monitor_create_response.py +++ b/src/x_twitter_scraper/types/monitor_create_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List diff --git a/src/x_twitter_scraper/types/monitor_deactivate_response.py b/src/x_twitter_scraper/types/monitor_deactivate_response.py index 212323a..945619e 100644 --- a/src/x_twitter_scraper/types/monitor_deactivate_response.py +++ b/src/x_twitter_scraper/types/monitor_deactivate_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing_extensions import Literal diff --git a/src/x_twitter_scraper/types/monitor_list_response.py b/src/x_twitter_scraper/types/monitor_list_response.py index 8300e1d..9754422 100644 --- a/src/x_twitter_scraper/types/monitor_list_response.py +++ b/src/x_twitter_scraper/types/monitor_list_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List diff --git a/src/x_twitter_scraper/types/monitor_update_params.py b/src/x_twitter_scraper/types/monitor_update_params.py index 032432c..92ba16c 100644 --- a/src/x_twitter_scraper/types/monitor_update_params.py +++ b/src/x_twitter_scraper/types/monitor_update_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/monitors/__init__.py b/src/x_twitter_scraper/types/monitors/__init__.py index 803fb89..f1b31bf 100644 --- a/src/x_twitter_scraper/types/monitors/__init__.py +++ b/src/x_twitter_scraper/types/monitors/__init__.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/monitors/keyword_create_params.py b/src/x_twitter_scraper/types/monitors/keyword_create_params.py index 2f5b8c6..c6ef94f 100644 --- a/src/x_twitter_scraper/types/monitors/keyword_create_params.py +++ b/src/x_twitter_scraper/types/monitors/keyword_create_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/monitors/keyword_create_response.py b/src/x_twitter_scraper/types/monitors/keyword_create_response.py index 855c2fb..9828c85 100644 --- a/src/x_twitter_scraper/types/monitors/keyword_create_response.py +++ b/src/x_twitter_scraper/types/monitors/keyword_create_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List diff --git a/src/x_twitter_scraper/types/monitors/keyword_deactivate_response.py b/src/x_twitter_scraper/types/monitors/keyword_deactivate_response.py index 0e17ff7..41f13d0 100644 --- a/src/x_twitter_scraper/types/monitors/keyword_deactivate_response.py +++ b/src/x_twitter_scraper/types/monitors/keyword_deactivate_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing_extensions import Literal diff --git a/src/x_twitter_scraper/types/monitors/keyword_list_response.py b/src/x_twitter_scraper/types/monitors/keyword_list_response.py index ae54777..d222144 100644 --- a/src/x_twitter_scraper/types/monitors/keyword_list_response.py +++ b/src/x_twitter_scraper/types/monitors/keyword_list_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List diff --git a/src/x_twitter_scraper/types/monitors/keyword_retrieve_response.py b/src/x_twitter_scraper/types/monitors/keyword_retrieve_response.py index 7839a15..8f989d5 100644 --- a/src/x_twitter_scraper/types/monitors/keyword_retrieve_response.py +++ b/src/x_twitter_scraper/types/monitors/keyword_retrieve_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List diff --git a/src/x_twitter_scraper/types/monitors/keyword_update_params.py b/src/x_twitter_scraper/types/monitors/keyword_update_params.py index fa7bc03..6cf12b6 100644 --- a/src/x_twitter_scraper/types/monitors/keyword_update_params.py +++ b/src/x_twitter_scraper/types/monitors/keyword_update_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/monitors/keyword_update_response.py b/src/x_twitter_scraper/types/monitors/keyword_update_response.py index 409ed2d..0a9f357 100644 --- a/src/x_twitter_scraper/types/monitors/keyword_update_response.py +++ b/src/x_twitter_scraper/types/monitors/keyword_update_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List diff --git a/src/x_twitter_scraper/types/radar_item.py b/src/x_twitter_scraper/types/radar_item.py index 9e8cad7..99f43e1 100644 --- a/src/x_twitter_scraper/types/radar_item.py +++ b/src/x_twitter_scraper/types/radar_item.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import Dict, Optional diff --git a/src/x_twitter_scraper/types/radar_retrieve_trending_topics_params.py b/src/x_twitter_scraper/types/radar_retrieve_trending_topics_params.py index a9cd1ba..2104bbb 100644 --- a/src/x_twitter_scraper/types/radar_retrieve_trending_topics_params.py +++ b/src/x_twitter_scraper/types/radar_retrieve_trending_topics_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/radar_retrieve_trending_topics_response.py b/src/x_twitter_scraper/types/radar_retrieve_trending_topics_response.py index 4c94a3b..1cece5a 100644 --- a/src/x_twitter_scraper/types/radar_retrieve_trending_topics_response.py +++ b/src/x_twitter_scraper/types/radar_retrieve_trending_topics_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List, Optional diff --git a/src/x_twitter_scraper/types/shared/__init__.py b/src/x_twitter_scraper/types/shared/__init__.py index 60c554f..77172f0 100644 --- a/src/x_twitter_scraper/types/shared/__init__.py +++ b/src/x_twitter_scraper/types/shared/__init__.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from .error import Error as Error diff --git a/src/x_twitter_scraper/types/shared/content_disclosure.py b/src/x_twitter_scraper/types/shared/content_disclosure.py index 2799f0c..0010340 100644 --- a/src/x_twitter_scraper/types/shared/content_disclosure.py +++ b/src/x_twitter_scraper/types/shared/content_disclosure.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import Optional diff --git a/src/x_twitter_scraper/types/shared/embedded_tweet.py b/src/x_twitter_scraper/types/shared/embedded_tweet.py index b52d41e..3a00162 100644 --- a/src/x_twitter_scraper/types/shared/embedded_tweet.py +++ b/src/x_twitter_scraper/types/shared/embedded_tweet.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import Dict, List, Optional diff --git a/src/x_twitter_scraper/types/shared/error.py b/src/x_twitter_scraper/types/shared/error.py index 0c9f873..892cb9a 100644 --- a/src/x_twitter_scraper/types/shared/error.py +++ b/src/x_twitter_scraper/types/shared/error.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import Union, Optional diff --git a/src/x_twitter_scraper/types/shared/event_type.py b/src/x_twitter_scraper/types/shared/event_type.py index 23eefc9..498f534 100644 --- a/src/x_twitter_scraper/types/shared/event_type.py +++ b/src/x_twitter_scraper/types/shared/event_type.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing_extensions import Literal, TypeAlias diff --git a/src/x_twitter_scraper/types/shared/paginated_tweets.py b/src/x_twitter_scraper/types/shared/paginated_tweets.py index c3854fe..b94f94d 100644 --- a/src/x_twitter_scraper/types/shared/paginated_tweets.py +++ b/src/x_twitter_scraper/types/shared/paginated_tweets.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List diff --git a/src/x_twitter_scraper/types/shared/paginated_users.py b/src/x_twitter_scraper/types/shared/paginated_users.py index cd9fac2..11580a9 100644 --- a/src/x_twitter_scraper/types/shared/paginated_users.py +++ b/src/x_twitter_scraper/types/shared/paginated_users.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List diff --git a/src/x_twitter_scraper/types/shared/search_tweet.py b/src/x_twitter_scraper/types/shared/search_tweet.py index 33de5e7..91dfdd6 100644 --- a/src/x_twitter_scraper/types/shared/search_tweet.py +++ b/src/x_twitter_scraper/types/shared/search_tweet.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import Dict, List, Optional diff --git a/src/x_twitter_scraper/types/shared/tweet_media.py b/src/x_twitter_scraper/types/shared/tweet_media.py index f7a45d2..2b35fdf 100644 --- a/src/x_twitter_scraper/types/shared/tweet_media.py +++ b/src/x_twitter_scraper/types/shared/tweet_media.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List, Optional diff --git a/src/x_twitter_scraper/types/shared/user_profile.py b/src/x_twitter_scraper/types/shared/user_profile.py index 4b3aebc..d863bcc 100644 --- a/src/x_twitter_scraper/types/shared/user_profile.py +++ b/src/x_twitter_scraper/types/shared/user_profile.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import Dict, List, Optional diff --git a/src/x_twitter_scraper/types/shared_params/__init__.py b/src/x_twitter_scraper/types/shared_params/__init__.py index 2fb8a63..8810582 100644 --- a/src/x_twitter_scraper/types/shared_params/__init__.py +++ b/src/x_twitter_scraper/types/shared_params/__init__.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from .event_type import EventType as EventType diff --git a/src/x_twitter_scraper/types/shared_params/event_type.py b/src/x_twitter_scraper/types/shared_params/event_type.py index 7a03a99..3a40bbc 100644 --- a/src/x_twitter_scraper/types/shared_params/event_type.py +++ b/src/x_twitter_scraper/types/shared_params/event_type.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/style_analyze_params.py b/src/x_twitter_scraper/types/style_analyze_params.py index 2f6bf17..e3a98f9 100644 --- a/src/x_twitter_scraper/types/style_analyze_params.py +++ b/src/x_twitter_scraper/types/style_analyze_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/style_compare_params.py b/src/x_twitter_scraper/types/style_compare_params.py index a3b508c..17c2b43 100644 --- a/src/x_twitter_scraper/types/style_compare_params.py +++ b/src/x_twitter_scraper/types/style_compare_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/style_compare_response.py b/src/x_twitter_scraper/types/style_compare_response.py index 68dcf17..e3a0c24 100644 --- a/src/x_twitter_scraper/types/style_compare_response.py +++ b/src/x_twitter_scraper/types/style_compare_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from .._models import BaseModel diff --git a/src/x_twitter_scraper/types/style_get_performance_response.py b/src/x_twitter_scraper/types/style_get_performance_response.py index 8b5f413..ea7e326 100644 --- a/src/x_twitter_scraper/types/style_get_performance_response.py +++ b/src/x_twitter_scraper/types/style_get_performance_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List, Optional diff --git a/src/x_twitter_scraper/types/style_list_response.py b/src/x_twitter_scraper/types/style_list_response.py index 798e5d5..88b5ff4 100644 --- a/src/x_twitter_scraper/types/style_list_response.py +++ b/src/x_twitter_scraper/types/style_list_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List diff --git a/src/x_twitter_scraper/types/style_profile.py b/src/x_twitter_scraper/types/style_profile.py index 22ad2e9..89ae9b5 100644 --- a/src/x_twitter_scraper/types/style_profile.py +++ b/src/x_twitter_scraper/types/style_profile.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List, Optional diff --git a/src/x_twitter_scraper/types/style_profile_summary.py b/src/x_twitter_scraper/types/style_profile_summary.py index 4796099..a3d6e47 100644 --- a/src/x_twitter_scraper/types/style_profile_summary.py +++ b/src/x_twitter_scraper/types/style_profile_summary.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from datetime import datetime diff --git a/src/x_twitter_scraper/types/style_update_params.py b/src/x_twitter_scraper/types/style_update_params.py index d16a1f0..963e86b 100644 --- a/src/x_twitter_scraper/types/style_update_params.py +++ b/src/x_twitter_scraper/types/style_update_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/subscribe_create_params.py b/src/x_twitter_scraper/types/subscribe_create_params.py index ff5115c..6b3f65f 100644 --- a/src/x_twitter_scraper/types/subscribe_create_params.py +++ b/src/x_twitter_scraper/types/subscribe_create_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/subscribe_create_response.py b/src/x_twitter_scraper/types/subscribe_create_response.py index 493be59..7ac2221 100644 --- a/src/x_twitter_scraper/types/subscribe_create_response.py +++ b/src/x_twitter_scraper/types/subscribe_create_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing_extensions import Literal diff --git a/src/x_twitter_scraper/types/support/__init__.py b/src/x_twitter_scraper/types/support/__init__.py index eb0443e..74a0d81 100644 --- a/src/x_twitter_scraper/types/support/__init__.py +++ b/src/x_twitter_scraper/types/support/__init__.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/support/ticket_create_params.py b/src/x_twitter_scraper/types/support/ticket_create_params.py index 134a53f..a0ce2ce 100644 --- a/src/x_twitter_scraper/types/support/ticket_create_params.py +++ b/src/x_twitter_scraper/types/support/ticket_create_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/support/ticket_create_response.py b/src/x_twitter_scraper/types/support/ticket_create_response.py index 646f6c4..544e8c2 100644 --- a/src/x_twitter_scraper/types/support/ticket_create_response.py +++ b/src/x_twitter_scraper/types/support/ticket_create_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List diff --git a/src/x_twitter_scraper/types/support/ticket_list_response.py b/src/x_twitter_scraper/types/support/ticket_list_response.py index c8a1feb..44c4b55 100644 --- a/src/x_twitter_scraper/types/support/ticket_list_response.py +++ b/src/x_twitter_scraper/types/support/ticket_list_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List, Optional diff --git a/src/x_twitter_scraper/types/support/ticket_reply_params.py b/src/x_twitter_scraper/types/support/ticket_reply_params.py index de5890a..c5ab4aa 100644 --- a/src/x_twitter_scraper/types/support/ticket_reply_params.py +++ b/src/x_twitter_scraper/types/support/ticket_reply_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/support/ticket_reply_response.py b/src/x_twitter_scraper/types/support/ticket_reply_response.py index 5f1675c..74c6d0f 100644 --- a/src/x_twitter_scraper/types/support/ticket_reply_response.py +++ b/src/x_twitter_scraper/types/support/ticket_reply_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List diff --git a/src/x_twitter_scraper/types/support/ticket_retrieve_response.py b/src/x_twitter_scraper/types/support/ticket_retrieve_response.py index 391ba2f..eaff19b 100644 --- a/src/x_twitter_scraper/types/support/ticket_retrieve_response.py +++ b/src/x_twitter_scraper/types/support/ticket_retrieve_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List, Optional diff --git a/src/x_twitter_scraper/types/support/ticket_update_params.py b/src/x_twitter_scraper/types/support/ticket_update_params.py index 97d3abf..9edde5a 100644 --- a/src/x_twitter_scraper/types/support/ticket_update_params.py +++ b/src/x_twitter_scraper/types/support/ticket_update_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/support/ticket_update_response.py b/src/x_twitter_scraper/types/support/ticket_update_response.py index 499c656..59d6a5a 100644 --- a/src/x_twitter_scraper/types/support/ticket_update_response.py +++ b/src/x_twitter_scraper/types/support/ticket_update_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import Optional diff --git a/src/x_twitter_scraper/types/trend_list_params.py b/src/x_twitter_scraper/types/trend_list_params.py index eaae5b3..3906d32 100644 --- a/src/x_twitter_scraper/types/trend_list_params.py +++ b/src/x_twitter_scraper/types/trend_list_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/trend_list_response.py b/src/x_twitter_scraper/types/trend_list_response.py index 398041a..f5b4e6f 100644 --- a/src/x_twitter_scraper/types/trend_list_response.py +++ b/src/x_twitter_scraper/types/trend_list_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List, Optional diff --git a/src/x_twitter_scraper/types/webhook.py b/src/x_twitter_scraper/types/webhook.py index a4387bf..28669af 100644 --- a/src/x_twitter_scraper/types/webhook.py +++ b/src/x_twitter_scraper/types/webhook.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List diff --git a/src/x_twitter_scraper/types/webhook_create_params.py b/src/x_twitter_scraper/types/webhook_create_params.py index ee2b3b6..4b16bfe 100644 --- a/src/x_twitter_scraper/types/webhook_create_params.py +++ b/src/x_twitter_scraper/types/webhook_create_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/webhook_create_response.py b/src/x_twitter_scraper/types/webhook_create_response.py index 7f6283e..3ff7f1b 100644 --- a/src/x_twitter_scraper/types/webhook_create_response.py +++ b/src/x_twitter_scraper/types/webhook_create_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List diff --git a/src/x_twitter_scraper/types/webhook_deactivate_response.py b/src/x_twitter_scraper/types/webhook_deactivate_response.py index 2deb5b8..25c8926 100644 --- a/src/x_twitter_scraper/types/webhook_deactivate_response.py +++ b/src/x_twitter_scraper/types/webhook_deactivate_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing_extensions import Literal diff --git a/src/x_twitter_scraper/types/webhook_list_deliveries_response.py b/src/x_twitter_scraper/types/webhook_list_deliveries_response.py index 9b13c4c..e3211f7 100644 --- a/src/x_twitter_scraper/types/webhook_list_deliveries_response.py +++ b/src/x_twitter_scraper/types/webhook_list_deliveries_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List diff --git a/src/x_twitter_scraper/types/webhook_list_response.py b/src/x_twitter_scraper/types/webhook_list_response.py index c2502dc..dfca956 100644 --- a/src/x_twitter_scraper/types/webhook_list_response.py +++ b/src/x_twitter_scraper/types/webhook_list_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List diff --git a/src/x_twitter_scraper/types/webhook_resume_response.py b/src/x_twitter_scraper/types/webhook_resume_response.py index 61cfba2..8cd7cd4 100644 --- a/src/x_twitter_scraper/types/webhook_resume_response.py +++ b/src/x_twitter_scraper/types/webhook_resume_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from pydantic import Field as FieldInfo diff --git a/src/x_twitter_scraper/types/webhook_test_response.py b/src/x_twitter_scraper/types/webhook_test_response.py index c9694f4..3de2c38 100644 --- a/src/x_twitter_scraper/types/webhook_test_response.py +++ b/src/x_twitter_scraper/types/webhook_test_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import Optional diff --git a/src/x_twitter_scraper/types/webhook_update_params.py b/src/x_twitter_scraper/types/webhook_update_params.py index 37ae64f..fe3dbfa 100644 --- a/src/x_twitter_scraper/types/webhook_update_params.py +++ b/src/x_twitter_scraper/types/webhook_update_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/winner.py b/src/x_twitter_scraper/types/winner.py index 0e56c1d..3673237 100644 --- a/src/x_twitter_scraper/types/winner.py +++ b/src/x_twitter_scraper/types/winner.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from pydantic import Field as FieldInfo diff --git a/src/x_twitter_scraper/types/x/__init__.py b/src/x_twitter_scraper/types/x/__init__.py index e41802f..d96125f 100644 --- a/src/x_twitter_scraper/types/x/__init__.py +++ b/src/x_twitter_scraper/types/x/__init__.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/account_bulk_retry_response.py b/src/x_twitter_scraper/types/x/account_bulk_retry_response.py index f9cefb3..234f45d 100644 --- a/src/x_twitter_scraper/types/x/account_bulk_retry_response.py +++ b/src/x_twitter_scraper/types/x/account_bulk_retry_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from ..._models import BaseModel diff --git a/src/x_twitter_scraper/types/x/account_connection_challenge_submit_params.py b/src/x_twitter_scraper/types/x/account_connection_challenge_submit_params.py index 1dd1f89..b4d103c 100644 --- a/src/x_twitter_scraper/types/x/account_connection_challenge_submit_params.py +++ b/src/x_twitter_scraper/types/x/account_connection_challenge_submit_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/account_connection_challenge_submit_response.py b/src/x_twitter_scraper/types/x/account_connection_challenge_submit_response.py index 5e3d540..d131559 100644 --- a/src/x_twitter_scraper/types/x/account_connection_challenge_submit_response.py +++ b/src/x_twitter_scraper/types/x/account_connection_challenge_submit_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from datetime import datetime diff --git a/src/x_twitter_scraper/types/x/account_create_params.py b/src/x_twitter_scraper/types/x/account_create_params.py index bd30f97..885e079 100644 --- a/src/x_twitter_scraper/types/x/account_create_params.py +++ b/src/x_twitter_scraper/types/x/account_create_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/account_create_response.py b/src/x_twitter_scraper/types/x/account_create_response.py index 721aa2b..26efad3 100644 --- a/src/x_twitter_scraper/types/x/account_create_response.py +++ b/src/x_twitter_scraper/types/x/account_create_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from datetime import datetime diff --git a/src/x_twitter_scraper/types/x/account_delete_response.py b/src/x_twitter_scraper/types/x/account_delete_response.py index d18a2df..281b6d1 100644 --- a/src/x_twitter_scraper/types/x/account_delete_response.py +++ b/src/x_twitter_scraper/types/x/account_delete_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing_extensions import Literal diff --git a/src/x_twitter_scraper/types/x/account_list_response.py b/src/x_twitter_scraper/types/x/account_list_response.py index f70c0aa..1ae47e4 100644 --- a/src/x_twitter_scraper/types/x/account_list_response.py +++ b/src/x_twitter_scraper/types/x/account_list_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List diff --git a/src/x_twitter_scraper/types/x/account_reauth_params.py b/src/x_twitter_scraper/types/x/account_reauth_params.py index 50ace00..5cb6225 100644 --- a/src/x_twitter_scraper/types/x/account_reauth_params.py +++ b/src/x_twitter_scraper/types/x/account_reauth_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/account_reauth_response.py b/src/x_twitter_scraper/types/x/account_reauth_response.py index 1271d63..9e1d481 100644 --- a/src/x_twitter_scraper/types/x/account_reauth_response.py +++ b/src/x_twitter_scraper/types/x/account_reauth_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from datetime import datetime diff --git a/src/x_twitter_scraper/types/x/bookmark_list_params.py b/src/x_twitter_scraper/types/x/bookmark_list_params.py index 9f87a62..78367d6 100644 --- a/src/x_twitter_scraper/types/x/bookmark_list_params.py +++ b/src/x_twitter_scraper/types/x/bookmark_list_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/bookmark_retrieve_folders_response.py b/src/x_twitter_scraper/types/x/bookmark_retrieve_folders_response.py index be52ab8..d707b56 100644 --- a/src/x_twitter_scraper/types/x/bookmark_retrieve_folders_response.py +++ b/src/x_twitter_scraper/types/x/bookmark_retrieve_folders_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List diff --git a/src/x_twitter_scraper/types/x/communities/__init__.py b/src/x_twitter_scraper/types/x/communities/__init__.py index a0a9823..a2bdad9 100644 --- a/src/x_twitter_scraper/types/x/communities/__init__.py +++ b/src/x_twitter_scraper/types/x/communities/__init__.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/communities/join_create_params.py b/src/x_twitter_scraper/types/x/communities/join_create_params.py index 4cedfa2..dea086f 100644 --- a/src/x_twitter_scraper/types/x/communities/join_create_params.py +++ b/src/x_twitter_scraper/types/x/communities/join_create_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/communities/join_create_response.py b/src/x_twitter_scraper/types/x/communities/join_create_response.py index bac9c24..b8b9aeb 100644 --- a/src/x_twitter_scraper/types/x/communities/join_create_response.py +++ b/src/x_twitter_scraper/types/x/communities/join_create_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import builtins diff --git a/src/x_twitter_scraper/types/x/communities/join_delete_all_params.py b/src/x_twitter_scraper/types/x/communities/join_delete_all_params.py index 3b71f96..66ee35b 100644 --- a/src/x_twitter_scraper/types/x/communities/join_delete_all_params.py +++ b/src/x_twitter_scraper/types/x/communities/join_delete_all_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/communities/join_delete_all_response.py b/src/x_twitter_scraper/types/x/communities/join_delete_all_response.py index 6ca6455..fea7942 100644 --- a/src/x_twitter_scraper/types/x/communities/join_delete_all_response.py +++ b/src/x_twitter_scraper/types/x/communities/join_delete_all_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import builtins diff --git a/src/x_twitter_scraper/types/x/communities/tweet_list_by_community_params.py b/src/x_twitter_scraper/types/x/communities/tweet_list_by_community_params.py index d1983a6..a5b683d 100644 --- a/src/x_twitter_scraper/types/x/communities/tweet_list_by_community_params.py +++ b/src/x_twitter_scraper/types/x/communities/tweet_list_by_community_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/communities/tweet_list_params.py b/src/x_twitter_scraper/types/x/communities/tweet_list_params.py index 300b8f9..8ea8138 100644 --- a/src/x_twitter_scraper/types/x/communities/tweet_list_params.py +++ b/src/x_twitter_scraper/types/x/communities/tweet_list_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/community_create_params.py b/src/x_twitter_scraper/types/x/community_create_params.py index 6508836..dee8e4e 100644 --- a/src/x_twitter_scraper/types/x/community_create_params.py +++ b/src/x_twitter_scraper/types/x/community_create_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/community_create_response.py b/src/x_twitter_scraper/types/x/community_create_response.py index e5b1e93..d0c6992 100644 --- a/src/x_twitter_scraper/types/x/community_create_response.py +++ b/src/x_twitter_scraper/types/x/community_create_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import builtins diff --git a/src/x_twitter_scraper/types/x/community_delete_params.py b/src/x_twitter_scraper/types/x/community_delete_params.py index 9b8b5b9..ffbb05b 100644 --- a/src/x_twitter_scraper/types/x/community_delete_params.py +++ b/src/x_twitter_scraper/types/x/community_delete_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/community_delete_response.py b/src/x_twitter_scraper/types/x/community_delete_response.py index 863960b..0cab9a0 100644 --- a/src/x_twitter_scraper/types/x/community_delete_response.py +++ b/src/x_twitter_scraper/types/x/community_delete_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import builtins diff --git a/src/x_twitter_scraper/types/x/community_retrieve_info_response.py b/src/x_twitter_scraper/types/x/community_retrieve_info_response.py index 1251d25..e77004a 100644 --- a/src/x_twitter_scraper/types/x/community_retrieve_info_response.py +++ b/src/x_twitter_scraper/types/x/community_retrieve_info_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List, Optional diff --git a/src/x_twitter_scraper/types/x/community_retrieve_members_params.py b/src/x_twitter_scraper/types/x/community_retrieve_members_params.py index d756bc3..463385a 100644 --- a/src/x_twitter_scraper/types/x/community_retrieve_members_params.py +++ b/src/x_twitter_scraper/types/x/community_retrieve_members_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/community_retrieve_moderators_params.py b/src/x_twitter_scraper/types/x/community_retrieve_moderators_params.py index 52f77ac..a5f9031 100644 --- a/src/x_twitter_scraper/types/x/community_retrieve_moderators_params.py +++ b/src/x_twitter_scraper/types/x/community_retrieve_moderators_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/community_retrieve_search_params.py b/src/x_twitter_scraper/types/x/community_retrieve_search_params.py index fee68b7..bccf151 100644 --- a/src/x_twitter_scraper/types/x/community_retrieve_search_params.py +++ b/src/x_twitter_scraper/types/x/community_retrieve_search_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/dm_retrieve_history_params.py b/src/x_twitter_scraper/types/x/dm_retrieve_history_params.py index effa948..9c5d725 100644 --- a/src/x_twitter_scraper/types/x/dm_retrieve_history_params.py +++ b/src/x_twitter_scraper/types/x/dm_retrieve_history_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/dm_retrieve_history_response.py b/src/x_twitter_scraper/types/x/dm_retrieve_history_response.py index 8c4a26d..dbbeed1 100644 --- a/src/x_twitter_scraper/types/x/dm_retrieve_history_response.py +++ b/src/x_twitter_scraper/types/x/dm_retrieve_history_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List, Optional diff --git a/src/x_twitter_scraper/types/x/dm_send_params.py b/src/x_twitter_scraper/types/x/dm_send_params.py index 2b42a21..b9a86eb 100644 --- a/src/x_twitter_scraper/types/x/dm_send_params.py +++ b/src/x_twitter_scraper/types/x/dm_send_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/dm_send_response.py b/src/x_twitter_scraper/types/x/dm_send_response.py index 732ff54..faaadfc 100644 --- a/src/x_twitter_scraper/types/x/dm_send_response.py +++ b/src/x_twitter_scraper/types/x/dm_send_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import builtins diff --git a/src/x_twitter_scraper/types/x/follower_check_params.py b/src/x_twitter_scraper/types/x/follower_check_params.py index 6a25b13..fc2dd52 100644 --- a/src/x_twitter_scraper/types/x/follower_check_params.py +++ b/src/x_twitter_scraper/types/x/follower_check_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/follower_check_response.py b/src/x_twitter_scraper/types/x/follower_check_response.py index 0badb03..560b3d9 100644 --- a/src/x_twitter_scraper/types/x/follower_check_response.py +++ b/src/x_twitter_scraper/types/x/follower_check_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from pydantic import Field as FieldInfo diff --git a/src/x_twitter_scraper/types/x/list_retrieve_followers_params.py b/src/x_twitter_scraper/types/x/list_retrieve_followers_params.py index 3999f1b..1a0c1f3 100644 --- a/src/x_twitter_scraper/types/x/list_retrieve_followers_params.py +++ b/src/x_twitter_scraper/types/x/list_retrieve_followers_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/list_retrieve_members_params.py b/src/x_twitter_scraper/types/x/list_retrieve_members_params.py index 425b582..6460986 100644 --- a/src/x_twitter_scraper/types/x/list_retrieve_members_params.py +++ b/src/x_twitter_scraper/types/x/list_retrieve_members_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/list_retrieve_tweets_params.py b/src/x_twitter_scraper/types/x/list_retrieve_tweets_params.py index 7940ce5..b53749c 100644 --- a/src/x_twitter_scraper/types/x/list_retrieve_tweets_params.py +++ b/src/x_twitter_scraper/types/x/list_retrieve_tweets_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/media_download_params.py b/src/x_twitter_scraper/types/x/media_download_params.py index 9c0e117..8f70f86 100644 --- a/src/x_twitter_scraper/types/x/media_download_params.py +++ b/src/x_twitter_scraper/types/x/media_download_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/media_download_response.py b/src/x_twitter_scraper/types/x/media_download_response.py index 2527614..fcb1caf 100644 --- a/src/x_twitter_scraper/types/x/media_download_response.py +++ b/src/x_twitter_scraper/types/x/media_download_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import Optional diff --git a/src/x_twitter_scraper/types/x/media_upload_params.py b/src/x_twitter_scraper/types/x/media_upload_params.py index 8cd2c09..539a0bb 100644 --- a/src/x_twitter_scraper/types/x/media_upload_params.py +++ b/src/x_twitter_scraper/types/x/media_upload_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/media_upload_response.py b/src/x_twitter_scraper/types/x/media_upload_response.py index f384c09..f287b94 100644 --- a/src/x_twitter_scraper/types/x/media_upload_response.py +++ b/src/x_twitter_scraper/types/x/media_upload_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import builtins diff --git a/src/x_twitter_scraper/types/x/profile_update_avatar_params.py b/src/x_twitter_scraper/types/x/profile_update_avatar_params.py index cfbef77..a061306 100644 --- a/src/x_twitter_scraper/types/x/profile_update_avatar_params.py +++ b/src/x_twitter_scraper/types/x/profile_update_avatar_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/profile_update_avatar_response.py b/src/x_twitter_scraper/types/x/profile_update_avatar_response.py index 907e0d2..64ebbf4 100644 --- a/src/x_twitter_scraper/types/x/profile_update_avatar_response.py +++ b/src/x_twitter_scraper/types/x/profile_update_avatar_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import builtins diff --git a/src/x_twitter_scraper/types/x/profile_update_banner_params.py b/src/x_twitter_scraper/types/x/profile_update_banner_params.py index d018836..12e8ac8 100644 --- a/src/x_twitter_scraper/types/x/profile_update_banner_params.py +++ b/src/x_twitter_scraper/types/x/profile_update_banner_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/profile_update_banner_response.py b/src/x_twitter_scraper/types/x/profile_update_banner_response.py index 3bfd88c..e20c858 100644 --- a/src/x_twitter_scraper/types/x/profile_update_banner_response.py +++ b/src/x_twitter_scraper/types/x/profile_update_banner_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import builtins diff --git a/src/x_twitter_scraper/types/x/profile_update_params.py b/src/x_twitter_scraper/types/x/profile_update_params.py index 3a4882b..05ef7f0 100644 --- a/src/x_twitter_scraper/types/x/profile_update_params.py +++ b/src/x_twitter_scraper/types/x/profile_update_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/profile_update_response.py b/src/x_twitter_scraper/types/x/profile_update_response.py index 1383a38..1a6117b 100644 --- a/src/x_twitter_scraper/types/x/profile_update_response.py +++ b/src/x_twitter_scraper/types/x/profile_update_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import builtins diff --git a/src/x_twitter_scraper/types/x/tweet_author.py b/src/x_twitter_scraper/types/x/tweet_author.py index 9565f85..7785a1f 100644 --- a/src/x_twitter_scraper/types/x/tweet_author.py +++ b/src/x_twitter_scraper/types/x/tweet_author.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from ..shared.user_profile import UserProfile diff --git a/src/x_twitter_scraper/types/x/tweet_create_params.py b/src/x_twitter_scraper/types/x/tweet_create_params.py index a9a20dc..5b312d8 100644 --- a/src/x_twitter_scraper/types/x/tweet_create_params.py +++ b/src/x_twitter_scraper/types/x/tweet_create_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/tweet_create_response.py b/src/x_twitter_scraper/types/x/tweet_create_response.py index 75ec4dc..5dfb1a7 100644 --- a/src/x_twitter_scraper/types/x/tweet_create_response.py +++ b/src/x_twitter_scraper/types/x/tweet_create_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import builtins diff --git a/src/x_twitter_scraper/types/x/tweet_delete_params.py b/src/x_twitter_scraper/types/x/tweet_delete_params.py index 5b02a93..d6e0e21 100644 --- a/src/x_twitter_scraper/types/x/tweet_delete_params.py +++ b/src/x_twitter_scraper/types/x/tweet_delete_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/tweet_delete_response.py b/src/x_twitter_scraper/types/x/tweet_delete_response.py index a6397d0..99239e2 100644 --- a/src/x_twitter_scraper/types/x/tweet_delete_response.py +++ b/src/x_twitter_scraper/types/x/tweet_delete_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import builtins diff --git a/src/x_twitter_scraper/types/x/tweet_detail.py b/src/x_twitter_scraper/types/x/tweet_detail.py index 533efb8..1dd674b 100644 --- a/src/x_twitter_scraper/types/x/tweet_detail.py +++ b/src/x_twitter_scraper/types/x/tweet_detail.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import Dict, List, Optional diff --git a/src/x_twitter_scraper/types/x/tweet_get_favoriters_params.py b/src/x_twitter_scraper/types/x/tweet_get_favoriters_params.py index 8a2fd66..dcd4fb9 100644 --- a/src/x_twitter_scraper/types/x/tweet_get_favoriters_params.py +++ b/src/x_twitter_scraper/types/x/tweet_get_favoriters_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/tweet_get_quotes_params.py b/src/x_twitter_scraper/types/x/tweet_get_quotes_params.py index 808d697..d18489f 100644 --- a/src/x_twitter_scraper/types/x/tweet_get_quotes_params.py +++ b/src/x_twitter_scraper/types/x/tweet_get_quotes_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/tweet_get_replies_params.py b/src/x_twitter_scraper/types/x/tweet_get_replies_params.py index 158180e..881bf6f 100644 --- a/src/x_twitter_scraper/types/x/tweet_get_replies_params.py +++ b/src/x_twitter_scraper/types/x/tweet_get_replies_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/tweet_get_retweeters_params.py b/src/x_twitter_scraper/types/x/tweet_get_retweeters_params.py index b3ade67..744d5dc 100644 --- a/src/x_twitter_scraper/types/x/tweet_get_retweeters_params.py +++ b/src/x_twitter_scraper/types/x/tweet_get_retweeters_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/tweet_get_thread_params.py b/src/x_twitter_scraper/types/x/tweet_get_thread_params.py index 7202313..e31da7c 100644 --- a/src/x_twitter_scraper/types/x/tweet_get_thread_params.py +++ b/src/x_twitter_scraper/types/x/tweet_get_thread_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/tweet_list_params.py b/src/x_twitter_scraper/types/x/tweet_list_params.py index b5078c5..40641b4 100644 --- a/src/x_twitter_scraper/types/x/tweet_list_params.py +++ b/src/x_twitter_scraper/types/x/tweet_list_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/tweet_retrieve_response.py b/src/x_twitter_scraper/types/x/tweet_retrieve_response.py index e8865a9..253bc89 100644 --- a/src/x_twitter_scraper/types/x/tweet_retrieve_response.py +++ b/src/x_twitter_scraper/types/x/tweet_retrieve_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import Optional diff --git a/src/x_twitter_scraper/types/x/tweet_search_params.py b/src/x_twitter_scraper/types/x/tweet_search_params.py index bb23273..25e4991 100644 --- a/src/x_twitter_scraper/types/x/tweet_search_params.py +++ b/src/x_twitter_scraper/types/x/tweet_search_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/tweets/__init__.py b/src/x_twitter_scraper/types/x/tweets/__init__.py index 0f77d66..d55a981 100644 --- a/src/x_twitter_scraper/types/x/tweets/__init__.py +++ b/src/x_twitter_scraper/types/x/tweets/__init__.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/tweets/like_create_params.py b/src/x_twitter_scraper/types/x/tweets/like_create_params.py index e6045b8..3c5cd77 100644 --- a/src/x_twitter_scraper/types/x/tweets/like_create_params.py +++ b/src/x_twitter_scraper/types/x/tweets/like_create_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/tweets/like_create_response.py b/src/x_twitter_scraper/types/x/tweets/like_create_response.py index b5175af..5142318 100644 --- a/src/x_twitter_scraper/types/x/tweets/like_create_response.py +++ b/src/x_twitter_scraper/types/x/tweets/like_create_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import builtins diff --git a/src/x_twitter_scraper/types/x/tweets/like_delete_params.py b/src/x_twitter_scraper/types/x/tweets/like_delete_params.py index 8b5a676..d9c8f5e 100644 --- a/src/x_twitter_scraper/types/x/tweets/like_delete_params.py +++ b/src/x_twitter_scraper/types/x/tweets/like_delete_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/tweets/like_delete_response.py b/src/x_twitter_scraper/types/x/tweets/like_delete_response.py index 1025809..394787a 100644 --- a/src/x_twitter_scraper/types/x/tweets/like_delete_response.py +++ b/src/x_twitter_scraper/types/x/tweets/like_delete_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import builtins diff --git a/src/x_twitter_scraper/types/x/tweets/retweet_create_params.py b/src/x_twitter_scraper/types/x/tweets/retweet_create_params.py index 8998589..00894dc 100644 --- a/src/x_twitter_scraper/types/x/tweets/retweet_create_params.py +++ b/src/x_twitter_scraper/types/x/tweets/retweet_create_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/tweets/retweet_create_response.py b/src/x_twitter_scraper/types/x/tweets/retweet_create_response.py index 37a90f5..c1e0c82 100644 --- a/src/x_twitter_scraper/types/x/tweets/retweet_create_response.py +++ b/src/x_twitter_scraper/types/x/tweets/retweet_create_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import builtins diff --git a/src/x_twitter_scraper/types/x/tweets/retweet_delete_params.py b/src/x_twitter_scraper/types/x/tweets/retweet_delete_params.py index 768d105..69ab418 100644 --- a/src/x_twitter_scraper/types/x/tweets/retweet_delete_params.py +++ b/src/x_twitter_scraper/types/x/tweets/retweet_delete_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/tweets/retweet_delete_response.py b/src/x_twitter_scraper/types/x/tweets/retweet_delete_response.py index 037cf5f..9221c91 100644 --- a/src/x_twitter_scraper/types/x/tweets/retweet_delete_response.py +++ b/src/x_twitter_scraper/types/x/tweets/retweet_delete_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import builtins diff --git a/src/x_twitter_scraper/types/x/user_remove_follower_params.py b/src/x_twitter_scraper/types/x/user_remove_follower_params.py index b2c32cd..f35bca5 100644 --- a/src/x_twitter_scraper/types/x/user_remove_follower_params.py +++ b/src/x_twitter_scraper/types/x/user_remove_follower_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/user_remove_follower_response.py b/src/x_twitter_scraper/types/x/user_remove_follower_response.py index 20e6a9b..b108088 100644 --- a/src/x_twitter_scraper/types/x/user_remove_follower_response.py +++ b/src/x_twitter_scraper/types/x/user_remove_follower_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import builtins diff --git a/src/x_twitter_scraper/types/x/user_retrieve_batch_params.py b/src/x_twitter_scraper/types/x/user_retrieve_batch_params.py index c1fc1df..6825fe6 100644 --- a/src/x_twitter_scraper/types/x/user_retrieve_batch_params.py +++ b/src/x_twitter_scraper/types/x/user_retrieve_batch_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/user_retrieve_batch_response.py b/src/x_twitter_scraper/types/x/user_retrieve_batch_response.py index 8a9b43f..a7f3caa 100644 --- a/src/x_twitter_scraper/types/x/user_retrieve_batch_response.py +++ b/src/x_twitter_scraper/types/x/user_retrieve_batch_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List diff --git a/src/x_twitter_scraper/types/x/user_retrieve_followers_params.py b/src/x_twitter_scraper/types/x/user_retrieve_followers_params.py index fb49030..14ccbc1 100644 --- a/src/x_twitter_scraper/types/x/user_retrieve_followers_params.py +++ b/src/x_twitter_scraper/types/x/user_retrieve_followers_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/user_retrieve_followers_you_know_params.py b/src/x_twitter_scraper/types/x/user_retrieve_followers_you_know_params.py index 84c5d7f..d357835 100644 --- a/src/x_twitter_scraper/types/x/user_retrieve_followers_you_know_params.py +++ b/src/x_twitter_scraper/types/x/user_retrieve_followers_you_know_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/user_retrieve_following_params.py b/src/x_twitter_scraper/types/x/user_retrieve_following_params.py index 3f85347..3784f9c 100644 --- a/src/x_twitter_scraper/types/x/user_retrieve_following_params.py +++ b/src/x_twitter_scraper/types/x/user_retrieve_following_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/user_retrieve_likes_params.py b/src/x_twitter_scraper/types/x/user_retrieve_likes_params.py index 094548b..0a3f94c 100644 --- a/src/x_twitter_scraper/types/x/user_retrieve_likes_params.py +++ b/src/x_twitter_scraper/types/x/user_retrieve_likes_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/user_retrieve_media_params.py b/src/x_twitter_scraper/types/x/user_retrieve_media_params.py index a50fd8f..053cebe 100644 --- a/src/x_twitter_scraper/types/x/user_retrieve_media_params.py +++ b/src/x_twitter_scraper/types/x/user_retrieve_media_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/user_retrieve_mentions_params.py b/src/x_twitter_scraper/types/x/user_retrieve_mentions_params.py index 1216722..58b6e01 100644 --- a/src/x_twitter_scraper/types/x/user_retrieve_mentions_params.py +++ b/src/x_twitter_scraper/types/x/user_retrieve_mentions_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/user_retrieve_replies_params.py b/src/x_twitter_scraper/types/x/user_retrieve_replies_params.py index 6b22082..911a040 100644 --- a/src/x_twitter_scraper/types/x/user_retrieve_replies_params.py +++ b/src/x_twitter_scraper/types/x/user_retrieve_replies_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/user_retrieve_search_params.py b/src/x_twitter_scraper/types/x/user_retrieve_search_params.py index c4810a1..59be296 100644 --- a/src/x_twitter_scraper/types/x/user_retrieve_search_params.py +++ b/src/x_twitter_scraper/types/x/user_retrieve_search_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/user_retrieve_tweets_params.py b/src/x_twitter_scraper/types/x/user_retrieve_tweets_params.py index a2034a0..6f30e7b 100644 --- a/src/x_twitter_scraper/types/x/user_retrieve_tweets_params.py +++ b/src/x_twitter_scraper/types/x/user_retrieve_tweets_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/user_retrieve_verified_followers_params.py b/src/x_twitter_scraper/types/x/user_retrieve_verified_followers_params.py index e088aa3..7840646 100644 --- a/src/x_twitter_scraper/types/x/user_retrieve_verified_followers_params.py +++ b/src/x_twitter_scraper/types/x/user_retrieve_verified_followers_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/users/__init__.py b/src/x_twitter_scraper/types/x/users/__init__.py index 5b5b20e..a5400ff 100644 --- a/src/x_twitter_scraper/types/x/users/__init__.py +++ b/src/x_twitter_scraper/types/x/users/__init__.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/users/follow_create_params.py b/src/x_twitter_scraper/types/x/users/follow_create_params.py index bf51499..5341bcb 100644 --- a/src/x_twitter_scraper/types/x/users/follow_create_params.py +++ b/src/x_twitter_scraper/types/x/users/follow_create_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/users/follow_create_response.py b/src/x_twitter_scraper/types/x/users/follow_create_response.py index e9a8284..5327041 100644 --- a/src/x_twitter_scraper/types/x/users/follow_create_response.py +++ b/src/x_twitter_scraper/types/x/users/follow_create_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import builtins diff --git a/src/x_twitter_scraper/types/x/users/follow_delete_all_params.py b/src/x_twitter_scraper/types/x/users/follow_delete_all_params.py index 98e502d..da7752f 100644 --- a/src/x_twitter_scraper/types/x/users/follow_delete_all_params.py +++ b/src/x_twitter_scraper/types/x/users/follow_delete_all_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x/users/follow_delete_all_response.py b/src/x_twitter_scraper/types/x/users/follow_delete_all_response.py index 8dcf739..8cf3b96 100644 --- a/src/x_twitter_scraper/types/x/users/follow_delete_all_response.py +++ b/src/x_twitter_scraper/types/x/users/follow_delete_all_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import builtins diff --git a/src/x_twitter_scraper/types/x/write_action_retrieve_response.py b/src/x_twitter_scraper/types/x/write_action_retrieve_response.py index 6354b2d..90f8ba8 100644 --- a/src/x_twitter_scraper/types/x/write_action_retrieve_response.py +++ b/src/x_twitter_scraper/types/x/write_action_retrieve_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import builtins diff --git a/src/x_twitter_scraper/types/x/x_account.py b/src/x_twitter_scraper/types/x/x_account.py index fed8f05..43bcbed 100644 --- a/src/x_twitter_scraper/types/x/x_account.py +++ b/src/x_twitter_scraper/types/x/x_account.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import Optional diff --git a/src/x_twitter_scraper/types/x/x_account_detail.py b/src/x_twitter_scraper/types/x/x_account_detail.py index f8e1a0e..590f5b9 100644 --- a/src/x_twitter_scraper/types/x/x_account_detail.py +++ b/src/x_twitter_scraper/types/x/x_account_detail.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import Optional diff --git a/src/x_twitter_scraper/types/x_get_article_response.py b/src/x_twitter_scraper/types/x_get_article_response.py index 01c7b60..b80cc71 100644 --- a/src/x_twitter_scraper/types/x_get_article_response.py +++ b/src/x_twitter_scraper/types/x_get_article_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List, Optional diff --git a/src/x_twitter_scraper/types/x_get_home_timeline_params.py b/src/x_twitter_scraper/types/x_get_home_timeline_params.py index 051b6b5..d667307 100644 --- a/src/x_twitter_scraper/types/x_get_home_timeline_params.py +++ b/src/x_twitter_scraper/types/x_get_home_timeline_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x_get_notifications_params.py b/src/x_twitter_scraper/types/x_get_notifications_params.py index 3f5d3b2..f3447a8 100644 --- a/src/x_twitter_scraper/types/x_get_notifications_params.py +++ b/src/x_twitter_scraper/types/x_get_notifications_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x_get_notifications_response.py b/src/x_twitter_scraper/types/x_get_notifications_response.py index 109cb5b..1e0a1aa 100644 --- a/src/x_twitter_scraper/types/x_get_notifications_response.py +++ b/src/x_twitter_scraper/types/x_get_notifications_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List, Optional diff --git a/src/x_twitter_scraper/types/x_get_trends_params.py b/src/x_twitter_scraper/types/x_get_trends_params.py index 44cabeb..ecb6479 100644 --- a/src/x_twitter_scraper/types/x_get_trends_params.py +++ b/src/x_twitter_scraper/types/x_get_trends_params.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/src/x_twitter_scraper/types/x_get_trends_response.py b/src/x_twitter_scraper/types/x_get_trends_response.py index 5910b88..43aa53b 100644 --- a/src/x_twitter_scraper/types/x_get_trends_response.py +++ b/src/x_twitter_scraper/types/x_get_trends_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from typing import List, Optional diff --git a/tests/__init__.py b/tests/__init__.py index fd8019a..50634a4 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1 +1,5 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. diff --git a/tests/api_resources/__init__.py b/tests/api_resources/__init__.py index fd8019a..50634a4 100644 --- a/tests/api_resources/__init__.py +++ b/tests/api_resources/__init__.py @@ -1 +1,5 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. diff --git a/tests/api_resources/monitors/__init__.py b/tests/api_resources/monitors/__init__.py index fd8019a..50634a4 100644 --- a/tests/api_resources/monitors/__init__.py +++ b/tests/api_resources/monitors/__init__.py @@ -1 +1,5 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. diff --git a/tests/api_resources/monitors/test_keywords.py b/tests/api_resources/monitors/test_keywords.py index 9ca62a0..70d0cd5 100644 --- a/tests/api_resources/monitors/test_keywords.py +++ b/tests/api_resources/monitors/test_keywords.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/support/__init__.py b/tests/api_resources/support/__init__.py index fd8019a..50634a4 100644 --- a/tests/api_resources/support/__init__.py +++ b/tests/api_resources/support/__init__.py @@ -1 +1,5 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. diff --git a/tests/api_resources/support/test_tickets.py b/tests/api_resources/support/test_tickets.py index c893f2b..39006a1 100644 --- a/tests/api_resources/support/test_tickets.py +++ b/tests/api_resources/support/test_tickets.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/test_account.py b/tests/api_resources/test_account.py index ae9d3a3..bb282bd 100644 --- a/tests/api_resources/test_account.py +++ b/tests/api_resources/test_account.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/test_compose.py b/tests/api_resources/test_compose.py index b19eeb7..bbeab01 100644 --- a/tests/api_resources/test_compose.py +++ b/tests/api_resources/test_compose.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/test_credits.py b/tests/api_resources/test_credits.py index 566e087..1a2a885 100644 --- a/tests/api_resources/test_credits.py +++ b/tests/api_resources/test_credits.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/test_drafts.py b/tests/api_resources/test_drafts.py index 5560130..06092c9 100644 --- a/tests/api_resources/test_drafts.py +++ b/tests/api_resources/test_drafts.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/test_draws.py b/tests/api_resources/test_draws.py index 2a31626..687d5af 100644 --- a/tests/api_resources/test_draws.py +++ b/tests/api_resources/test_draws.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/test_events.py b/tests/api_resources/test_events.py index c5d2108..a857097 100644 --- a/tests/api_resources/test_events.py +++ b/tests/api_resources/test_events.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/test_extractions.py b/tests/api_resources/test_extractions.py index 0c7d621..7a0c0d5 100644 --- a/tests/api_resources/test_extractions.py +++ b/tests/api_resources/test_extractions.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/test_guest_wallets.py b/tests/api_resources/test_guest_wallets.py index f8ab505..35b4a2a 100644 --- a/tests/api_resources/test_guest_wallets.py +++ b/tests/api_resources/test_guest_wallets.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/test_monitors.py b/tests/api_resources/test_monitors.py index e705257..5e8a2cb 100644 --- a/tests/api_resources/test_monitors.py +++ b/tests/api_resources/test_monitors.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/test_radar.py b/tests/api_resources/test_radar.py index 979323c..56940c6 100644 --- a/tests/api_resources/test_radar.py +++ b/tests/api_resources/test_radar.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/test_styles.py b/tests/api_resources/test_styles.py index bdef154..e5de24e 100644 --- a/tests/api_resources/test_styles.py +++ b/tests/api_resources/test_styles.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/test_subscribe.py b/tests/api_resources/test_subscribe.py index 7a99f39..cf70241 100644 --- a/tests/api_resources/test_subscribe.py +++ b/tests/api_resources/test_subscribe.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/test_trends.py b/tests/api_resources/test_trends.py index b639921..dca33dc 100644 --- a/tests/api_resources/test_trends.py +++ b/tests/api_resources/test_trends.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/test_webhooks.py b/tests/api_resources/test_webhooks.py index 78592bf..a6b3cf7 100644 --- a/tests/api_resources/test_webhooks.py +++ b/tests/api_resources/test_webhooks.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/test_x.py b/tests/api_resources/test_x.py index 781cc84..7cc5df6 100644 --- a/tests/api_resources/test_x.py +++ b/tests/api_resources/test_x.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/x/__init__.py b/tests/api_resources/x/__init__.py index fd8019a..50634a4 100644 --- a/tests/api_resources/x/__init__.py +++ b/tests/api_resources/x/__init__.py @@ -1 +1,5 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. diff --git a/tests/api_resources/x/communities/__init__.py b/tests/api_resources/x/communities/__init__.py index fd8019a..50634a4 100644 --- a/tests/api_resources/x/communities/__init__.py +++ b/tests/api_resources/x/communities/__init__.py @@ -1 +1,5 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. diff --git a/tests/api_resources/x/communities/test_join.py b/tests/api_resources/x/communities/test_join.py index bc1e5fa..a6f6e70 100644 --- a/tests/api_resources/x/communities/test_join.py +++ b/tests/api_resources/x/communities/test_join.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/x/communities/test_tweets.py b/tests/api_resources/x/communities/test_tweets.py index e26f9f2..49f09d1 100644 --- a/tests/api_resources/x/communities/test_tweets.py +++ b/tests/api_resources/x/communities/test_tweets.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/x/test_account_connection_challenges.py b/tests/api_resources/x/test_account_connection_challenges.py index 038b4c2..8a3995d 100644 --- a/tests/api_resources/x/test_account_connection_challenges.py +++ b/tests/api_resources/x/test_account_connection_challenges.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/x/test_accounts.py b/tests/api_resources/x/test_accounts.py index 7377345..493525e 100644 --- a/tests/api_resources/x/test_accounts.py +++ b/tests/api_resources/x/test_accounts.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/x/test_bookmarks.py b/tests/api_resources/x/test_bookmarks.py index dee851e..f535178 100644 --- a/tests/api_resources/x/test_bookmarks.py +++ b/tests/api_resources/x/test_bookmarks.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/x/test_communities.py b/tests/api_resources/x/test_communities.py index 770f88a..28d92b3 100644 --- a/tests/api_resources/x/test_communities.py +++ b/tests/api_resources/x/test_communities.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/x/test_dm.py b/tests/api_resources/x/test_dm.py index 6026e30..c96b258 100644 --- a/tests/api_resources/x/test_dm.py +++ b/tests/api_resources/x/test_dm.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/x/test_followers.py b/tests/api_resources/x/test_followers.py index 555e736..e2092e6 100644 --- a/tests/api_resources/x/test_followers.py +++ b/tests/api_resources/x/test_followers.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/x/test_lists.py b/tests/api_resources/x/test_lists.py index 0548df2..b501e95 100644 --- a/tests/api_resources/x/test_lists.py +++ b/tests/api_resources/x/test_lists.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/x/test_media.py b/tests/api_resources/x/test_media.py index 757f1f3..56c5a3e 100644 --- a/tests/api_resources/x/test_media.py +++ b/tests/api_resources/x/test_media.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/x/test_profile.py b/tests/api_resources/x/test_profile.py index 66b7295..0aa0690 100644 --- a/tests/api_resources/x/test_profile.py +++ b/tests/api_resources/x/test_profile.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/x/test_tweets.py b/tests/api_resources/x/test_tweets.py index d9c47ed..3a3d213 100644 --- a/tests/api_resources/x/test_tweets.py +++ b/tests/api_resources/x/test_tweets.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/x/test_users.py b/tests/api_resources/x/test_users.py index 61ecaeb..69db1d2 100644 --- a/tests/api_resources/x/test_users.py +++ b/tests/api_resources/x/test_users.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/x/test_write_actions.py b/tests/api_resources/x/test_write_actions.py index 1bb6ea6..730443d 100644 --- a/tests/api_resources/x/test_write_actions.py +++ b/tests/api_resources/x/test_write_actions.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/x/tweets/__init__.py b/tests/api_resources/x/tweets/__init__.py index fd8019a..50634a4 100644 --- a/tests/api_resources/x/tweets/__init__.py +++ b/tests/api_resources/x/tweets/__init__.py @@ -1 +1,5 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. diff --git a/tests/api_resources/x/tweets/test_like.py b/tests/api_resources/x/tweets/test_like.py index 4bfa9d2..464b0cc 100644 --- a/tests/api_resources/x/tweets/test_like.py +++ b/tests/api_resources/x/tweets/test_like.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/x/tweets/test_retweet.py b/tests/api_resources/x/tweets/test_retweet.py index 4d3f08d..f6a1249 100644 --- a/tests/api_resources/x/tweets/test_retweet.py +++ b/tests/api_resources/x/tweets/test_retweet.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/api_resources/x/users/__init__.py b/tests/api_resources/x/users/__init__.py index fd8019a..50634a4 100644 --- a/tests/api_resources/x/users/__init__.py +++ b/tests/api_resources/x/users/__init__.py @@ -1 +1,5 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. diff --git a/tests/api_resources/x/users/test_follow.py b/tests/api_resources/x/users/test_follow.py index 0ca3b90..c468455 100644 --- a/tests/api_resources/x/users/test_follow.py +++ b/tests/api_resources/x/users/test_follow.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations diff --git a/tests/conftest.py b/tests/conftest.py index be384ff..942d4a6 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations @@ -5,12 +9,14 @@ import os import logging from typing import TYPE_CHECKING, Iterator, AsyncIterator +from urllib.parse import urlsplit import httpx import pytest from pytest_asyncio import is_async_test from x_twitter_scraper import XTwitterScraper, AsyncXTwitterScraper, DefaultAioHttpClient +from tests.mock_api_server import MockAPIServer from x_twitter_scraper._utils import is_dict if TYPE_CHECKING: @@ -20,6 +26,20 @@ logging.getLogger("x_twitter_scraper").setLevel(logging.DEBUG) +disabled_mock_reason = "Mock server tests are disabled" +mock_api_server: MockAPIServer | None = None + +configured_base_url = os.environ.get("TEST_API_BASE_URL") +if configured_base_url is None: + mock_api_server = MockAPIServer() + base_url = mock_api_server.base_url + os.environ["TEST_API_BASE_URL"] = base_url +else: + parsed_base_url = urlsplit(configured_base_url) + if parsed_base_url.scheme not in {"http", "https"} or parsed_base_url.hostname not in {"127.0.0.1", "::1"}: + raise RuntimeError("TEST_API_BASE_URL must use the 127.0.0.1 or ::1 loopback address") + base_url = configured_base_url + # automatically add `pytest.mark.asyncio()` to all of our async tests # so we don't have to add that boilerplate everywhere @@ -32,6 +52,12 @@ def pytest_collection_modifyitems(items: list[pytest.Function]) -> None: # We skip tests that use both the aiohttp client and respx_mock as respx_mock # doesn't support custom transports. for item in items: + item.own_markers[:] = [ + marker + for marker in item.own_markers + if marker.name != "skip" or marker.kwargs.get("reason") != disabled_mock_reason + ] + if "async_client" not in item.fixturenames or "respx_mock" not in item.fixturenames: continue @@ -43,7 +69,11 @@ def pytest_collection_modifyitems(items: list[pytest.Function]) -> None: item.add_marker(pytest.mark.skip(reason="aiohttp client is not compatible with respx_mock")) -base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") +def pytest_unconfigure(config: pytest.Config) -> None: + del config + if mock_api_server is not None: + mock_api_server.close() + api_key = "My API Key" bearer_token = "My Bearer Token" @@ -56,7 +86,10 @@ def client(request: FixtureRequest) -> Iterator[XTwitterScraper]: raise TypeError(f"Unexpected fixture parameter type {type(strict)}, expected {bool}") with XTwitterScraper( - base_url=base_url, api_key=api_key, bearer_token=bearer_token, _strict_response_validation=strict + base_url=base_url, + api_key=api_key, + bearer_token=bearer_token, + _strict_response_validation=strict, ) as client: yield client diff --git a/tests/mock_api_routes.py b/tests/mock_api_routes.py new file mode 100644 index 0000000..ebc5829 --- /dev/null +++ b/tests/mock_api_routes.py @@ -0,0 +1,128 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + +from __future__ import annotations + +import re +import ast +import importlib +from enum import Enum +from typing import get_args +from pathlib import Path +from dataclasses import dataclass + +from x_twitter_scraper import resources +from x_twitter_scraper._models import BaseModel + + +class ResponseKind(Enum): + EMPTY = "empty" + BINARY = "binary" + + +ResponseType = type[BaseModel] | ResponseKind + + +@dataclass(frozen=True) +class Route: + method: str + template: str + pattern: re.Pattern[str] + response_type: ResponseType + + +def _resource_root() -> Path: + return Path(resources.__file__).parent + + +def _cast_name(node: ast.expr) -> str: + if isinstance(node, ast.Call): + if not isinstance(node.func, ast.Name) or node.func.id != "cast": + raise ValueError(f"Unsupported cast expression: {ast.unparse(node)}") + if len(node.args) != 2: + raise ValueError(f"Unsupported cast argument count: {ast.unparse(node)}") + node = node.args[1] + if not isinstance(node, ast.Name): + raise ValueError(f"Unsupported response type: {ast.unparse(node)}") + return node.id + + +def _path_template(node: ast.expr) -> str: + if isinstance(node, ast.Constant) and isinstance(node.value, str): + return node.value + if ( + isinstance(node, ast.Call) + and isinstance(node.func, ast.Name) + and node.func.id == "path_template" + and node.args + and isinstance(node.args[0], ast.Constant) + and isinstance(node.args[0].value, str) + ): + return node.args[0].value + raise ValueError(f"Unsupported path expression: {ast.unparse(node)}") + + +def _route_pattern(template: str) -> re.Pattern[str]: + parts = re.split(r"(\{[^{}]+\})", template) + expression = "".join(r"[^/]+" if part.startswith("{") else re.escape(part) for part in parts) + return re.compile(f"^{expression}$") + + +def _response_type(module_name: str, name: str) -> ResponseType: + if name == "NoneType": + return ResponseKind.EMPTY + if name in {"BinaryAPIResponse", "AsyncBinaryAPIResponse"}: + return ResponseKind.BINARY + + module = importlib.import_module(module_name) + response_type = getattr(module, name, None) + if isinstance(response_type, type) and issubclass(response_type, BaseModel): + return response_type + for variant in get_args(response_type): + if isinstance(variant, type) and issubclass(variant, BaseModel): + return variant + raise TypeError(f"{module_name}.{name} is not a response model") + + +def _build_routes() -> tuple[Route, ...]: + route_types: dict[tuple[str, str], tuple[str, ResponseType]] = {} + root = _resource_root() + for source_path in sorted(root.rglob("*.py")): + relative = source_path.relative_to(root.parent) + module_name = ".".join(("x_twitter_scraper", *relative.with_suffix("").parts)) + syntax = ast.parse(source_path.read_text(encoding="utf-8"), filename=str(source_path)) + for node in ast.walk(syntax): + if not isinstance(node, ast.Call) or not isinstance(node.func, ast.Attribute): + continue + method = node.func.attr.removeprefix("_").upper() + if method not in {"GET", "POST", "PUT", "PATCH", "DELETE"}: + continue + cast_node = next((keyword.value for keyword in node.keywords if keyword.arg == "cast_to"), None) + if cast_node is None or not node.args: + continue + + template = _path_template(node.args[0]) + name = _cast_name(cast_node) + response_type = _response_type(module_name, name) + key = (method, template) + previous = route_types.get(key) + if previous is not None and previous[0] != name: + binary_names = {"BinaryAPIResponse", "AsyncBinaryAPIResponse"} + if {previous[0], name} != binary_names: + raise ValueError(f"Conflicting response types for {method} {template}: {previous[0]} and {name}") + continue + route_types[key] = (name, response_type) + + return tuple( + Route( + method=method, + template=template, + pattern=_route_pattern(template), + response_type=response_type, + ) + for (method, template), (_, response_type) in sorted(route_types.items()) + ) + + +ROUTES = _build_routes() diff --git a/tests/mock_api_schema.py b/tests/mock_api_schema.py new file mode 100644 index 0000000..52358a3 --- /dev/null +++ b/tests/mock_api_schema.py @@ -0,0 +1,155 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + +from __future__ import annotations + +import json +from typing import Mapping, cast + +from x_twitter_scraper._compat import PYDANTIC_V1 +from x_twitter_scraper._models import BaseModel + +JSONSchema = Mapping[str, object] + + +def _resolve_reference(reference: str, root: JSONSchema) -> JSONSchema: + if not reference.startswith("#/"): + raise ValueError(f"Unsupported schema reference: {reference}") + value: object = root + for token in reference[2:].split("/"): + token = token.replace("~1", "/").replace("~0", "~") + if not isinstance(value, Mapping): + raise ValueError(f"Invalid schema reference: {reference}") + value = cast(JSONSchema, value)[token] # pyright: ignore[reportUnnecessaryCast] + if not isinstance(value, Mapping): + raise ValueError(f"Schema reference is not an object: {reference}") + return cast(JSONSchema, value) + + +def _string_example(schema: JSONSchema) -> str: + schema_format = schema.get("format") + if schema_format == "date-time": + return "2026-01-01T00:00:00Z" + if schema_format == "date": + return "2026-01-01" + if schema_format in {"uri", "url"}: + return "https://example.com" + pattern = schema.get("pattern") + if isinstance(pattern, str) and ("\\d" in pattern or "[0-9]" in pattern): + return "1" + minimum_length = schema.get("minLength", 1) + if not isinstance(minimum_length, int): + minimum_length = 1 + return "x" * max(1, minimum_length) + + +def _number_example(schema: JSONSchema, *, integer: bool) -> int | float: + minimum = schema.get("minimum", 1) + if not isinstance(minimum, (int, float)): + minimum = 1 + exclusive = schema.get("exclusiveMinimum") + if isinstance(exclusive, (int, float)): + minimum = max(minimum, exclusive + 1) + return int(minimum) if integer else float(minimum) + + +def _example_from_schema( + schema: JSONSchema, + root: JSONSchema, + active_references: frozenset[str] = frozenset(), +) -> object: + reference = schema.get("$ref") + if isinstance(reference, str): + if reference in active_references: + return {} + return _example_from_schema( + _resolve_reference(reference, root), + root, + active_references | {reference}, + ) + + if "const" in schema: + return schema["const"] + enum = schema.get("enum") + if isinstance(enum, list) and enum: + return cast(list[object], enum)[0] + if "default" in schema: + return schema["default"] + + for union_key in ("anyOf", "oneOf"): + variants = schema.get(union_key) + if isinstance(variants, list): + candidates: list[JSONSchema] = [] + for variant in cast(list[object], variants): + if not isinstance(variant, Mapping): + continue + candidate = cast(JSONSchema, variant) + if candidate.get("type") != "null": + candidates.append(candidate) + if candidates: + return _example_from_schema(candidates[0], root, active_references) + return None + + combined = schema.get("allOf") + if isinstance(combined, list): + merged: dict[str, object] = {} + for part in cast(list[object], combined): + if not isinstance(part, Mapping): + continue + example = _example_from_schema(cast(JSONSchema, part), root, active_references) + if isinstance(example, Mapping): + merged.update(cast(Mapping[str, object], example)) + return merged + + schema_type = schema.get("type") + if isinstance(schema_type, list): + schema_type = next( + (value for value in cast(list[object], schema_type) if isinstance(value, str) and value != "null"), + "null", + ) + if schema_type == "null": + return None + if schema_type == "boolean": + return True + if schema_type == "integer": + return _number_example(schema, integer=True) + if schema_type == "number": + return _number_example(schema, integer=False) + if schema_type == "string": + return _string_example(schema) + if schema_type == "array": + item_schema = schema.get("items") + minimum_items = schema.get("minItems", 0) + if not isinstance(item_schema, Mapping) or not isinstance(minimum_items, int): + return [] + return [ + _example_from_schema(cast(JSONSchema, item_schema), root, active_references) for _ in range(minimum_items) + ] + if schema_type == "object" or "properties" in schema: + properties_value = schema.get("properties", {}) + required_value = schema.get("required", []) + if not isinstance(properties_value, Mapping) or not isinstance(required_value, list): + return {} + properties = cast(Mapping[str, object], properties_value) + required = cast(list[object], required_value) + return { + name: _example_from_schema(cast(JSONSchema, properties[name]), root, active_references) + for name in required + if isinstance(name, str) and isinstance(properties.get(name), Mapping) + } + return {} + + +def model_payload(model: type[BaseModel]) -> bytes: + if PYDANTIC_V1: + schema = cast(JSONSchema, model.schema(by_alias=True)) # pyright: ignore[reportDeprecated] + else: + schema = cast(JSONSchema, model.model_json_schema(by_alias=True)) + + value = _example_from_schema(schema, schema) + if PYDANTIC_V1: + model.parse_obj(value) # pyright: ignore[reportDeprecated] + else: + model.model_validate(value) + return json.dumps(value, separators=(",", ":")).encode() diff --git a/tests/mock_api_server.py b/tests/mock_api_server.py new file mode 100644 index 0000000..ade40af --- /dev/null +++ b/tests/mock_api_server.py @@ -0,0 +1,108 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + +from __future__ import annotations + +from http import HTTPStatus +from typing import Mapping, ClassVar, cast +from threading import Thread +from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler +from urllib.parse import urlsplit +from typing_extensions import override + +from tests.mock_api_routes import ROUTES, Route, ResponseKind +from tests.mock_api_schema import model_payload +from x_twitter_scraper._models import BaseModel + +MODEL_PAYLOADS = { + response_type: model_payload(response_type) + for response_type in {route.response_type for route in ROUTES} + if isinstance(response_type, type) +} + + +class MockAPIRequestHandler(BaseHTTPRequestHandler): + protocol_version = "HTTP/1.1" + routes: ClassVar[tuple[Route, ...]] = ROUTES + model_payloads: ClassVar[Mapping[type[BaseModel], bytes]] = MODEL_PAYLOADS + + def do_GET(self) -> None: + self._handle() + + def do_POST(self) -> None: + self._handle() + + def do_PUT(self) -> None: + self._handle() + + def do_PATCH(self) -> None: + self._handle() + + def do_DELETE(self) -> None: + self._handle() + + def _handle(self) -> None: + content_length = self.headers.get("Content-Length") + if content_length is not None: + self.rfile.read(int(content_length)) + + path = urlsplit(self.path).path + route = next( + ( + candidate + for candidate in self.routes + if candidate.method == self.command and candidate.pattern.fullmatch(path) + ), + None, + ) + if route is None: + self._write_response( + HTTPStatus.NOT_FOUND, + b'{"error":"unregistered mock route"}', + "application/json", + ) + return + if route.response_type is ResponseKind.EMPTY: + self._write_response(HTTPStatus.NO_CONTENT, b"", "application/json") + return + if route.response_type is ResponseKind.BINARY: + self._write_response(HTTPStatus.OK, b"fixture", "application/octet-stream") + return + self._write_response( + HTTPStatus.OK, + self.model_payloads[route.response_type], + "application/json", + ) + + def _write_response(self, status: HTTPStatus, body: bytes, content_type: str) -> None: + self.send_response(status) + self.send_header("Content-Type", content_type) + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + + @override + def log_message(self, format: str, *args: object) -> None: + del format, args + + +class MockAPIServer: + def __init__(self) -> None: + self._server = ThreadingHTTPServer(("127.0.0.1", 0), MockAPIRequestHandler) + self._server.daemon_threads = True + host, port = cast(tuple[str, int], self._server.server_address) + self.base_url = f"http://{host}:{port}" + self._thread = Thread(target=self._server.serve_forever, name="mock-api-server", daemon=True) + self._closed = False + self._thread.start() + + def close(self) -> None: + if self._closed: + return + self._closed = True + self._server.shutdown() + self._server.server_close() + self._thread.join(timeout=5) + if self._thread.is_alive(): + raise RuntimeError("Mock API server did not stop") diff --git a/tests/test_client.py b/tests/test_client.py index afb9273..ec1ee24 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations @@ -258,7 +262,10 @@ def test_copy_signature(self, client: XTwitterScraper) -> None: copy_param = copy_signature.parameters.get(name) assert copy_param is not None, f"copy() signature is missing the {name} param" - @pytest.mark.skipif(sys.version_info >= (3, 10), reason="fails because of a memory leak that started from 3.12") + @pytest.mark.skipif( + sys.version_info >= (3, 10), + reason="known tracer-sensitive allocation regression on supported CPython versions", + ) def test_copy_build_request(self, client: XTwitterScraper) -> None: options = FinalRequestOptions(method="get", url="/foo") @@ -1267,7 +1274,10 @@ def test_copy_signature(self, async_client: AsyncXTwitterScraper) -> None: copy_param = copy_signature.parameters.get(name) assert copy_param is not None, f"copy() signature is missing the {name} param" - @pytest.mark.skipif(sys.version_info >= (3, 10), reason="fails because of a memory leak that started from 3.12") + @pytest.mark.skipif( + sys.version_info >= (3, 10), + reason="known tracer-sensitive allocation regression on supported CPython versions", + ) def test_copy_build_request(self, async_client: AsyncXTwitterScraper) -> None: options = FinalRequestOptions(method="get", url="/foo") diff --git a/tests/test_coverage_verifier.py b/tests/test_coverage_verifier.py new file mode 100644 index 0000000..7428063 --- /dev/null +++ b/tests/test_coverage_verifier.py @@ -0,0 +1,54 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + +from __future__ import annotations + +import json +from pathlib import Path + +import pytest + +from scripts.verify_coverage import coverage_passes, verify_coverage, coverage_percent + + +def write_report(path: Path, *, lines: tuple[int, int], branches: tuple[int, int]) -> None: + path.write_text( + json.dumps( + { + "totals": { + "covered_lines": lines[0], + "num_statements": lines[1], + "covered_branches": branches[0], + "num_branches": branches[1], + } + } + ), + encoding="utf-8", + ) + + +def test_coverage_thresholds_are_inclusive() -> None: + assert coverage_percent(9, 10) == 90 + assert coverage_passes(9, 10, 90) + assert coverage_passes(8, 10, 80) + assert not coverage_passes(7, 10, 80) + + +def test_verify_coverage_accepts_gold_thresholds(tmp_path: Path) -> None: + report_path = tmp_path / "coverage.json" + write_report(report_path, lines=(90, 100), branches=(80, 100)) + assert verify_coverage(report_path) + + +def test_verify_coverage_rejects_low_branch_coverage(tmp_path: Path) -> None: + report_path = tmp_path / "coverage.json" + write_report(report_path, lines=(95, 100), branches=(79, 100)) + assert not verify_coverage(report_path) + + +def test_verify_coverage_rejects_invalid_reports(tmp_path: Path) -> None: + report_path = tmp_path / "coverage.json" + report_path.write_text('{"totals": {"covered_lines": true}}', encoding="utf-8") + with pytest.raises(ValueError, match="must be an integer"): + verify_coverage(report_path) diff --git a/tests/test_extract_files.py b/tests/test_extract_files.py index 86892d2..359cf37 100644 --- a/tests/test_extract_files.py +++ b/tests/test_extract_files.py @@ -1,10 +1,14 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + from __future__ import annotations -from typing import Sequence +from typing import Sequence, cast import pytest -from x_twitter_scraper._types import FileTypes, ArrayFormat +from x_twitter_scraper._types import FileTypes, ArrayFormat, not_given from x_twitter_scraper._utils import extract_files @@ -89,3 +93,23 @@ def test_array_format_controls_file_field_names( nested = {"items": [{"file": b"a"}, {"file": b"b"}]} assert extract_files(nested, paths=[["items", "", "file"]], array_format=array_format) == expected_nested + + +def test_extracts_file_list_without_array_marker() -> None: + query = {"files": [b"a", b"b"]} + assert extract_files(query, paths=[["files"]]) == [("files[]", b"a"), ("files[]", b"b")] + assert query == {} + + +def test_ignores_omitted_and_non_container_values() -> None: + omitted = {"file": not_given} + assert extract_files(omitted, paths=[["file"]]) == [] + + non_container = {"item": "value"} + assert extract_files(non_container, paths=[["item", "file"]]) == [] + + +def test_rejects_unknown_file_array_format() -> None: + query = {"files": [b"a"]} + with pytest.raises(NotImplementedError, match="Unknown array_format value"): + extract_files(query, paths=[["files"]], array_format=cast(ArrayFormat, "unknown")) diff --git a/tests/test_files.py b/tests/test_files.py index 59f9ca2..1e9ff7c 100644 --- a/tests/test_files.py +++ b/tests/test_files.py @@ -1,10 +1,23 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + +import io +from typing import Any, cast from pathlib import Path import anyio import pytest from dirty_equals import IsDict, IsList, IsBytes, IsTuple -from x_twitter_scraper._files import to_httpx_files, deepcopy_with_paths, async_to_httpx_files +from x_twitter_scraper._files import ( + to_httpx_files, + read_file_content, + deepcopy_with_paths, + async_to_httpx_files, + assert_is_file_content, + async_read_file_content, +) from x_twitter_scraper._utils import extract_files readme_path = Path(__file__).parent.parent.joinpath("README.md") @@ -52,6 +65,50 @@ def test_string_not_allowed() -> None: ) +def test_none_and_bytes_inputs() -> None: + assert to_httpx_files(None) is None + assert to_httpx_files({"file": b"contents"}) == {"file": b"contents"} + assert read_file_content(b"contents") == b"contents" + assert_is_file_content(io.BytesIO(b"contents")) + + +def test_tuple_content_and_direct_path_reads() -> None: + result = to_httpx_files({"file": ("custom.md", readme_path, "text/markdown")}) + assert result == IsDict({"file": IsTuple("custom.md", IsBytes(), "text/markdown")}) + assert read_file_content(readme_path) == readme_path.read_bytes() + + +def test_invalid_container_and_file_content() -> None: + with pytest.raises(TypeError, match="Unexpected file type input"): + to_httpx_files(cast(Any, "invalid")) + + with pytest.raises(RuntimeError, match="Expected file input"): + assert_is_file_content("invalid") + + with pytest.raises(RuntimeError, match="Expected entry at `upload`"): + assert_is_file_content("invalid", key="upload") + + +@pytest.mark.asyncio +async def test_async_none_bytes_and_direct_reads() -> None: + assert await async_to_httpx_files(None) is None + assert await async_to_httpx_files({"file": b"contents"}) == {"file": b"contents"} + assert await async_read_file_content(b"contents") == b"contents" + assert await async_read_file_content(readme_path) == readme_path.read_bytes() + + +@pytest.mark.asyncio +async def test_async_tuple_and_invalid_container() -> None: + result = await async_to_httpx_files({"file": ("custom.md", readme_path, "text/markdown")}) + assert result == IsDict({"file": IsTuple("custom.md", IsBytes(), "text/markdown")}) + + with pytest.raises(TypeError, match="Unexpected file type input"): + await async_to_httpx_files(cast(Any, "invalid")) + + with pytest.raises(TypeError, match="Expected file types input"): + await async_to_httpx_files({"file": cast(Any, "invalid")}) + + def assert_different_identities(obj1: object, obj2: object) -> None: assert obj1 == obj2 assert obj1 is not obj2 @@ -106,6 +163,25 @@ def test_multiple_paths(self) -> None: assert result["b"] is f2 assert result["c"] is original["c"] + def test_preserves_nested_containers_outside_paths(self) -> None: + nested = {"bar": 1} + original = {"foo": nested} + result = deepcopy_with_paths(original, [["foo"]]) + assert_different_identities(result, original) + assert result["foo"] is nested + + def test_preserves_lists_without_array_paths(self) -> None: + nested: list[dict[str, int]] = [{"bar": 1}] + original = {"foo": nested} + result = deepcopy_with_paths(original, [["foo", "bar"]]) + assert_different_identities(result, original) + assert result["foo"] is nested + + def test_ignores_missing_mapping_keys(self) -> None: + original = {"foo": "bar"} + result = deepcopy_with_paths(original, [["missing", "file"]]) + assert_different_identities(result, original) + def test_extract_files_does_not_mutate_original_top_level(self) -> None: file_bytes = b"contents" original = {"file": file_bytes, "other": "value"} diff --git a/tests/test_models.py b/tests/test_models.py index faf6967..401899a 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + import json from typing import TYPE_CHECKING, Any, Dict, List, Union, Iterable, Optional, cast from datetime import datetime, timezone diff --git a/tests/test_qs.py b/tests/test_qs.py index 754d4b2..5af6596 100644 --- a/tests/test_qs.py +++ b/tests/test_qs.py @@ -1,10 +1,14 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + from typing import Any, cast from functools import partial from urllib.parse import unquote import pytest -from x_twitter_scraper._qs import Querystring, stringify +from x_twitter_scraper._qs import Querystring, parse, stringify def test_empty() -> None: @@ -76,3 +80,11 @@ def test_array_brackets(method: str) -> None: def test_unknown_array_format() -> None: with pytest.raises(NotImplementedError, match="Unknown array_format value: foo, choose from comma, repeat"): stringify({"a": ["foo", "bar"]}, array_format=cast(Any, "foo")) + + +def test_array_indices() -> None: + assert unquote(stringify({"items": ["foo", "bar"]}, array_format="indices")) == "items[0]=foo&items[1]=bar" + + +def test_parse() -> None: + assert parse("item=foo&item=bar") == {"item": ["foo", "bar"]} diff --git a/tests/test_required_args.py b/tests/test_required_args.py index 34d2b9f..a9c4eae 100644 --- a/tests/test_required_args.py +++ b/tests/test_required_args.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + from __future__ import annotations import pytest diff --git a/tests/test_response.py b/tests/test_response.py index 30641e0..d42d1d3 100644 --- a/tests/test_response.py +++ b/tests/test_response.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + import json from typing import Any, List, Union, cast from typing_extensions import Annotated diff --git a/tests/test_streaming.py b/tests/test_streaming.py index 0719390..fd5ddb2 100644 --- a/tests/test_streaming.py +++ b/tests/test_streaming.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + from __future__ import annotations from typing import Iterator, AsyncIterator @@ -6,7 +10,7 @@ import pytest from x_twitter_scraper import XTwitterScraper, AsyncXTwitterScraper -from x_twitter_scraper._streaming import Stream, AsyncStream, ServerSentEvent +from x_twitter_scraper._streaming import Stream, SSEDecoder, AsyncStream, ServerSentEvent @pytest.mark.asyncio @@ -222,6 +226,28 @@ def body() -> Iterator[bytes]: assert sse.json() == {"content": "известни"} +def test_decoder_handles_comments_ids_retries_and_unknown_fields() -> None: + decoder = SSEDecoder() + assert decoder.decode(": keep-alive") is None + assert decoder.decode("id: event-id") is None + assert decoder.decode("id: ignored\0value") is None + assert decoder.decode("retry: 250") is None + assert decoder.decode("unknown: ignored") is None + assert decoder.decode("data: payload") is None + + event = decoder.decode("") + assert event is not None + assert event.id == "event-id" + assert event.retry == 250 + assert event.data == "payload" + + +def test_decoder_ignores_invalid_retry_and_empty_events() -> None: + decoder = SSEDecoder() + assert decoder.decode("retry: invalid") is None + assert decoder.decode("") is None + + async def to_aiter(iter: Iterator[bytes]) -> AsyncIterator[bytes]: for chunk in iter: yield chunk diff --git a/tests/test_transform.py b/tests/test_transform.py index f8bc14c..9607b8c 100644 --- a/tests/test_transform.py +++ b/tests/test_transform.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + from __future__ import annotations import io diff --git a/tests/test_utils/test_datetime_parse.py b/tests/test_utils/test_datetime_parse.py index 1228913..3b50b71 100644 --- a/tests/test_utils/test_datetime_parse.py +++ b/tests/test_utils/test_datetime_parse.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + """ Copied from https://github.com/pydantic/pydantic/blob/v1.10.22/tests/test_datetime_parse.py with modifications so it works without pydantic v1 imports. diff --git a/tests/test_utils/test_json.py b/tests/test_utils/test_json.py index 7068660..b733901 100644 --- a/tests/test_utils/test_json.py +++ b/tests/test_utils/test_json.py @@ -1,8 +1,13 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + from __future__ import annotations import datetime from typing import Union +import pytest import pydantic from x_twitter_scraper import _compat @@ -124,3 +129,7 @@ class User(pydantic.BaseModel): data = {"model": model_with_values} json_bytes = openapi_dumps(data) assert json_bytes == b'{"model":{"name":"Frank","email":"frank@example.com","phone":null}}' + + def test_rejects_unsupported_objects(self) -> None: + with pytest.raises(TypeError, match="is not JSON serializable"): + openapi_dumps(object()) diff --git a/tests/test_utils/test_logs.py b/tests/test_utils/test_logs.py new file mode 100644 index 0000000..6a29080 --- /dev/null +++ b/tests/test_utils/test_logs.py @@ -0,0 +1,35 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + +from __future__ import annotations + +import logging + +import pytest + +from x_twitter_scraper._utils import _logs + + +def test_setup_logging_supports_debug_and_info(monkeypatch: pytest.MonkeyPatch) -> None: + old_logger_level = _logs.logger.level + old_httpx_level = _logs.httpx_logger.level + + try: + monkeypatch.setenv("X_TWITTER_SCRAPER_LOG", "debug") + _logs.setup_logging() + assert _logs.logger.level == logging.DEBUG + assert _logs.httpx_logger.level == logging.DEBUG + + monkeypatch.setenv("X_TWITTER_SCRAPER_LOG", "info") + _logs.setup_logging() + assert _logs.logger.level == logging.INFO + assert _logs.httpx_logger.level == logging.INFO + + monkeypatch.setenv("X_TWITTER_SCRAPER_LOG", "disabled") + _logs.setup_logging() + assert _logs.logger.level == logging.INFO + assert _logs.httpx_logger.level == logging.INFO + finally: + _logs.logger.setLevel(old_logger_level) + _logs.httpx_logger.setLevel(old_httpx_level) diff --git a/tests/test_utils/test_path.py b/tests/test_utils/test_path.py index 79d5afa..1be69ca 100644 --- a/tests/test_utils/test_path.py +++ b/tests/test_utils/test_path.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + from __future__ import annotations from typing import Any diff --git a/tests/test_utils/test_proxy.py b/tests/test_utils/test_proxy.py index 564f205..44b5e10 100644 --- a/tests/test_utils/test_proxy.py +++ b/tests/test_utils/test_proxy.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + import operator from typing import Any from typing_extensions import override @@ -32,3 +36,19 @@ def __load__(self) -> Any: proxy = AlwaysErrorProxy() assert not isinstance(proxy, dict) assert isinstance(proxy, LazyProxy) + + +def test_proxy_forwards_to_loaded_object() -> None: + class DictProxy(LazyProxy[dict[str, int]]): + @override + def __load__(self) -> dict[str, int]: + return {"answer": 42} + + proxy = DictProxy() + assert callable(proxy.keys) + assert repr(proxy) == "{'answer': 42}" + assert str(proxy) == "{'answer': 42}" + assert "keys" in dir(proxy) + assert proxy.__class__ is dict + assert proxy.__get_proxied__() == {"answer": 42} + assert proxy.__as_proxied__() is proxy diff --git a/tests/test_utils/test_reflection.py b/tests/test_utils/test_reflection.py new file mode 100644 index 0000000..fa582e2 --- /dev/null +++ b/tests/test_utils/test_reflection.py @@ -0,0 +1,45 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + +from __future__ import annotations + +import pytest + +from x_twitter_scraper._utils import function_has_argument, assert_signatures_in_sync + + +def source_function(alpha: str, beta: int) -> None: + del alpha, beta + + +def matching_function(alpha: str, beta: int) -> None: + del alpha, beta + + +def missing_function(alpha: str) -> None: + del alpha + + +def mismatched_function(alpha: int, beta: int) -> None: + del alpha, beta + + +def test_function_has_argument() -> None: + assert function_has_argument(source_function, "alpha") + assert not function_has_argument(source_function, "gamma") + + +def test_assert_signatures_in_sync() -> None: + assert_signatures_in_sync(source_function, matching_function) + assert_signatures_in_sync(source_function, missing_function, exclude_params={"beta"}) + + +def test_assert_signatures_in_sync_reports_missing_parameters() -> None: + with pytest.raises(AssertionError, match=r"(?s)1 errors encountered.*`beta` param is missing"): + assert_signatures_in_sync(source_function, missing_function) + + +def test_assert_signatures_in_sync_reports_mismatched_types() -> None: + with pytest.raises(AssertionError, match=r"types for the `alpha` param are do not match"): + assert_signatures_in_sync(source_function, mismatched_function) diff --git a/tests/test_utils/test_typing.py b/tests/test_utils/test_typing.py index af14faa..a77f053 100644 --- a/tests/test_utils/test_typing.py +++ b/tests/test_utils/test_typing.py @@ -1,7 +1,13 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + from __future__ import annotations from typing import Generic, TypeVar, cast +import pytest + from x_twitter_scraper._utils import extract_type_var_from_base _T = TypeVar("_T") @@ -71,3 +77,22 @@ def test_extract_type_var_generic_subclass_different_ordering_multiple() -> None assert extract_type_var_from_base(typ, index=0, generic_bases=generic_bases) == int assert extract_type_var_from_base(typ, index=1, generic_bases=generic_bases) == str assert extract_type_var_from_base(typ, index=2, generic_bases=generic_bases) == type(None) + + +def test_extract_type_var_rejects_unrelated_generic_base() -> None: + with pytest.raises(RuntimeError, match="Could not find the generic base class"): + extract_type_var_from_base( + SubclassGeneric[int], + index=0, + generic_bases=cast("tuple[type, ...]", (BaseGenericMultipleTypeArgs,)), + ) + + +def test_extract_type_var_uses_custom_failure_message() -> None: + with pytest.raises(RuntimeError, match="custom failure"): + extract_type_var_from_base( + int, + index=0, + generic_bases=cast("tuple[type, ...]", (BaseGeneric,)), + failure_message="custom failure", + ) diff --git a/tests/test_utils/test_utils.py b/tests/test_utils/test_utils.py new file mode 100644 index 0000000..540f949 --- /dev/null +++ b/tests/test_utils/test_utils.py @@ -0,0 +1,102 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + +from __future__ import annotations + +from datetime import date, datetime, timezone + +import pytest + +from x_twitter_scraper._types import Omit +from x_twitter_scraper._utils import ( + json_safe, + coerce_float, + removeprefix, + removesuffix, + coerce_boolean, + coerce_integer, + maybe_coerce_float, + get_required_header, + maybe_coerce_boolean, + maybe_coerce_integer, +) +from x_twitter_scraper._utils._utils import human_join + + +class HeaderBag: + def __init__(self, values: dict[str, str]) -> None: + self.values = values + + def get(self, key: str) -> str | None: + return self.values.get(key) + + +def test_human_join() -> None: + assert human_join([]) == "" + assert human_join(["one"]) == "one" + assert human_join(["one", "two"]) == "one or two" + assert human_join(["one", "two", "three"], delim="; ", final="and") == "one; two and three" + + +def test_numeric_coercion() -> None: + assert coerce_integer("42") == 42 + assert coerce_float("4.2") == 4.2 + assert maybe_coerce_integer(None) is None + assert maybe_coerce_integer("42") == 42 + assert maybe_coerce_float(None) is None + assert maybe_coerce_float("4.2") == 4.2 + + +@pytest.mark.parametrize( + ("value", "expected"), + [ + ("true", True), + ("1", True), + ("on", True), + ("false", False), + ], +) +def test_boolean_coercion(value: str, expected: bool) -> None: + assert coerce_boolean(value) is expected + assert maybe_coerce_boolean(value) is expected + assert maybe_coerce_boolean(None) is None + + +def test_remove_prefix_and_suffix() -> None: + assert removeprefix("prefix-value", "prefix-") == "value" + assert removeprefix("value", "prefix-") == "value" + assert removesuffix("value-suffix", "-suffix") == "value" + assert removesuffix("value", "-suffix") == "value" + + +def test_get_required_header_from_mapping() -> None: + assert get_required_header({"X-Request-ID": "request-id"}, "x-request-id") == "request-id" + with pytest.raises(ValueError, match="Could not find x-request-id header"): + get_required_header({"X-Request-ID": Omit()}, "x-request-id") + + +def test_get_required_header_normalizes_protocol_keys() -> None: + assert get_required_header(HeaderBag({"X-TRACE-ID": "trace-id"}), "x-trace-id") == "trace-id" + assert get_required_header(HeaderBag({"Stainless-Event-Id": "event-id"}), "stainless-event-id") == "event-id" + + +def test_get_required_header_rejects_missing_header() -> None: + with pytest.raises(ValueError, match="Could not find x-trace-id header"): + get_required_header(HeaderBag({}), "x-trace-id") + + +def test_json_safe_recursively_serializes_values() -> None: + moment = datetime(2026, 7, 23, 12, 30, tzinfo=timezone.utc) + day = date(2026, 7, 23) + data = { + "moments": (moment, day), + "bytes": b"raw", + "plain": 42, + } + + assert json_safe(data) == { + "moments": [moment.isoformat(), day.isoformat()], + "bytes": b"raw", + "plain": 42, + } diff --git a/tests/utils.py b/tests/utils.py index 7d03d77..f754e55 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Xquik contributors +# +# SPDX-License-Identifier: Apache-2.0 + from __future__ import annotations import os diff --git a/uv.lock b/uv.lock index 375eae3..49ed08e 100644 --- a/uv.lock +++ b/uv.lock @@ -16,7 +16,7 @@ conflicts = [[ ]] [options] -exclude-newer = "2026-07-15T16:48:06.35421Z" +exclude-newer = "2026-07-16T22:50:17.386789Z" exclude-newer-span = "P7D" [[package]] @@ -287,6 +287,104 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] +[[package]] +name = "coverage" +version = "7.15.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/d0/55fe630f4cf94e3fcba868240fad8c8cdd1f764e2a932f8926347e6ec4cd/coverage-7.15.2.tar.gz", hash = "sha256:3df60dc267f0a2ca23cb7a9ab1109c62b9335ffbf519fcfe167157c28c09b81d", size = 927741, upload-time = "2026-07-15T18:56:19.558Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/03/060ce69008ac97bbc01b1411b3e55b61f6f015659400b46749b662107831/coverage-7.15.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9b5bd92ff1ec22e535eab0de75fa6db021992791f461a2aceb7822c625a1187d", size = 221284, upload-time = "2026-07-15T18:53:29.52Z" }, + { url = "https://files.pythonhosted.org/packages/fc/a3/d936e8b53edd9684100a6aefaf3fcabaa54728fe33324436c8d279c047aa/coverage-7.15.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:44826758cfe73fcd0e6af5deb4ba6d5417cc1d13df3acb35c93484a11160f846", size = 221799, upload-time = "2026-07-15T18:53:31.708Z" }, + { url = "https://files.pythonhosted.org/packages/ae/a3/ca234b06aec7ee28226f11d39a696b4481fe5eddfce8e03bf39979bb8ffb/coverage-7.15.2-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:09f5c6ec5901f667bd97dd140b5b9a2586b10efec66f46fb1e6d8135f8b95bdf", size = 248544, upload-time = "2026-07-15T18:53:33.212Z" }, + { url = "https://files.pythonhosted.org/packages/2b/89/dda79527bb7573ba91828b2fb91b3105d87378d6a2749ca0c0924ce0addd/coverage-7.15.2-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1d16e3a7104ea84f03e614611b3edbf6fb6892554b3ab0fe7fbb3f2b2ef04376", size = 250374, upload-time = "2026-07-15T18:53:34.683Z" }, + { url = "https://files.pythonhosted.org/packages/67/c6/c33755a34572f81f49a8c0cdf6b622f35ccb3238b136e1909daf0cdd4319/coverage-7.15.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d46e62cb35d91e6e2589fda6d28074426b0e276422b5d2ebef2c6b11dc60dbfd", size = 252239, upload-time = "2026-07-15T18:53:36.205Z" }, + { url = "https://files.pythonhosted.org/packages/b9/6f/dc341741b375be53a5baeee5b4bf0f0e525d38caed428f7932d23bb7bcb1/coverage-7.15.2-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dfd3db045e95960ae3683059571e597fda7cc610106a8916f77c5839048c1deb", size = 254150, upload-time = "2026-07-15T18:53:37.863Z" }, + { url = "https://files.pythonhosted.org/packages/e9/8d/966a18a5b195cb4e77b14c53f5f3dce22b5da05e6de7fafd1e08f2d2067a/coverage-7.15.2-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:affd532502d34c0472d0cdb181325c89f1d2c44992fef0c17e88e7b1576259a1", size = 249234, upload-time = "2026-07-15T18:53:39.394Z" }, + { url = "https://files.pythonhosted.org/packages/c5/8b/8b2e367496ab48484d48e79984fec76cdc1b7cb5d3a00ee799a5602e3ec9/coverage-7.15.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d17d7512151fedfcc64c1821a8977fc9be0dbf495754669afcab7b57abc98ae9", size = 250276, upload-time = "2026-07-15T18:53:41.027Z" }, + { url = "https://files.pythonhosted.org/packages/63/92/1199318a200eb6c8c6ce0192c892c8710ac791abbe0f35099294620bbfda/coverage-7.15.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e26ff680768b8095e8874aabe0e9d3a47a2a9f176a8340d05f8604c56457c23a", size = 248283, upload-time = "2026-07-15T18:53:42.557Z" }, + { url = "https://files.pythonhosted.org/packages/56/da/be284a55c5619bda891a89c27dfd59324a2c6a14d755cf6aac6960ceebeb/coverage-7.15.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:7e8f27131dc7cd53de2c137dd207b3720919320b3c20d499dc30aa9ee6173287", size = 252093, upload-time = "2026-07-15T18:53:44.271Z" }, + { url = "https://files.pythonhosted.org/packages/d4/53/ee112da833ddd77b73c6d781a98029b45b584b136615b4900ed0569f887e/coverage-7.15.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:728a33676d4c3f0db977990a4bd421dcaa3be3e53b5b6273036fff6666008e89", size = 248552, upload-time = "2026-07-15T18:53:45.7Z" }, + { url = "https://files.pythonhosted.org/packages/82/6a/802cfc802e9113494c80bf3f284cd4d72faeb1f24e244f61046af364f2ca/coverage-7.15.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:29c052f7c83ccfcc5c577eaae025d2e4a9bb80daf03c0ac31c996e83b000ce88", size = 249154, upload-time = "2026-07-15T18:53:47.256Z" }, + { url = "https://files.pythonhosted.org/packages/2c/65/529808e91d651147edae408fd9e894abc3b8cad7f3e594bbc36719a3e13a/coverage-7.15.2-cp310-cp310-win32.whl", hash = "sha256:1268ac8fb9ddcd783d3948dbabaf80a5d53bfdaa0575e873e2139a692f797443", size = 223334, upload-time = "2026-07-15T18:53:48.768Z" }, + { url = "https://files.pythonhosted.org/packages/68/0f/0e1829d7001130876dfbc0b4e1c737ea7c155b809e3e4a98a0aa268e2369/coverage-7.15.2-cp310-cp310-win_amd64.whl", hash = "sha256:9f4432898c4bf2fba0435bbe35dd4437d7264565e5a88a21f5b49d8662a6b629", size = 223959, upload-time = "2026-07-15T18:53:50.429Z" }, + { url = "https://files.pythonhosted.org/packages/7d/3a/54536704f507d4573bf9161c4d0dd3dd59b6d85e48c664e901b6844d8e33/coverage-7.15.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f1ec6f304b156669cfde653b4e9a953f5de87e247ea02ac599bce0ab2744036", size = 221414, upload-time = "2026-07-15T18:53:51.941Z" }, + { url = "https://files.pythonhosted.org/packages/b6/d9/8ba925d29743e3577b21e4d8c11a702b76bc93c41e7fdfd1177af63d4b8d/coverage-7.15.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4d3361879d736f469f45723c11ea1a5bbdaf1f6928f0e632c940378b5aa9b660", size = 221913, upload-time = "2026-07-15T18:53:53.682Z" }, + { url = "https://files.pythonhosted.org/packages/09/54/a855f3aa0187f2b431ade4e4791b77b56282cfb5d201c83ec26a31b5b36a/coverage-7.15.2-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c6a98d698f9e2c8008d0370ec7fc452ebfcc530002ae2d0061170d768b992589", size = 252332, upload-time = "2026-07-15T18:53:55.467Z" }, + { url = "https://files.pythonhosted.org/packages/8e/d3/13ac97b4370640ba3452fc8559b06cc2f479ce3ba4a0b632a73e44c38a7d/coverage-7.15.2-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d50dd325e18ec25bfcc10cd7f99b04df1ab9ec76b0918c260e60817ad0643dee", size = 254243, upload-time = "2026-07-15T18:53:57.055Z" }, + { url = "https://files.pythonhosted.org/packages/88/83/5eca144942d8d0659d3f55176517f4a59cdc65eefd17146a0770935a3ebd/coverage-7.15.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67d7602480a47bdf5b675635403625553ebaa70d5a62a657c035149fd401cea0", size = 256352, upload-time = "2026-07-15T18:53:58.83Z" }, + { url = "https://files.pythonhosted.org/packages/4e/ba/d3db2e01a50fc88cdb4c0f19542bcf6f61489e34dc9aa3538413e2459a38/coverage-7.15.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cee0f89f4767a6057c8fbf168f8135f18be651300496086bd873e3189fed0487", size = 258313, upload-time = "2026-07-15T18:54:00.497Z" }, + { url = "https://files.pythonhosted.org/packages/78/b3/aba83416e9177df28e5186d856c19158c59fc0e7e814aaa61a4a2354ad1b/coverage-7.15.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a29ec5305a7335aacee2d799e3422e91e1c8a12474986e2b3b07e315c91be82f", size = 252449, upload-time = "2026-07-15T18:54:02.456Z" }, + { url = "https://files.pythonhosted.org/packages/6a/a5/4b00ecac0194431ab451b0f6710f8e2517d04cef60f821b14dec4637d575/coverage-7.15.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:48ccc6395958eda89093ecdc35644c86f23a8b23a7f4d44958812b721aad67c1", size = 254043, upload-time = "2026-07-15T18:54:04.072Z" }, + { url = "https://files.pythonhosted.org/packages/75/b6/cfa209b4313ee7f1b34da47efcd789ea51c024ad35af390e00f5a3c10a2e/coverage-7.15.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:81f382c5a94b434ec1f6da607edb904c76d7212e618cd4d1bc9f97bed4120ef5", size = 252107, upload-time = "2026-07-15T18:54:06.745Z" }, + { url = "https://files.pythonhosted.org/packages/36/67/e8cac5a6954038c98d7fe7eb9802afe7ab3ecb637bb7cc00e69b4148b56d/coverage-7.15.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:bbc808daf4f5cd567af8075ecc72d21c6dfef9a254709a621a84c217c935ebc0", size = 255873, upload-time = "2026-07-15T18:54:08.48Z" }, + { url = "https://files.pythonhosted.org/packages/2c/92/395cca9f330a86c3fe3471d73e2c102116c4c58fdc619dbbc125c6e93a54/coverage-7.15.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:a4c46b247b5d4b78f613bd89fea926d32b25c6cc61a50bd1e99ba310348f3dad", size = 251826, upload-time = "2026-07-15T18:54:10.083Z" }, + { url = "https://files.pythonhosted.org/packages/51/60/3e91b20295439652424f426b7086ec5bf4fbe3f604c73eda22b986c4fd6b/coverage-7.15.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:094dd37f3ef7b2da8b068b583d1f4c40f91c65197e16c52a71962d5d537fc5db", size = 252735, upload-time = "2026-07-15T18:54:11.878Z" }, + { url = "https://files.pythonhosted.org/packages/a5/eb/8c07839005e5e3c6b3877d3a6e2a80ce766589f31dd2b6882b78d59a7b8c/coverage-7.15.2-cp311-cp311-win32.whl", hash = "sha256:a63b9e190711134d581c4d703df5df09851b1acf99792c7aacbbe9f41f0283c9", size = 223500, upload-time = "2026-07-15T18:54:13.525Z" }, + { url = "https://files.pythonhosted.org/packages/2e/98/59d83c257cd59f0fbaf9d9ddb26b744a576760dfd1ae16e516408894a02b/coverage-7.15.2-cp311-cp311-win_amd64.whl", hash = "sha256:8bb9f4b4279187560796a4cdaca3b0a93dd97e48ee667df005f4ed9a97403688", size = 223973, upload-time = "2026-07-15T18:54:15.163Z" }, + { url = "https://files.pythonhosted.org/packages/ea/09/2d285c8bef5c4f695d120c1c96dc11715638aa8e134069f210bb6a62a9fe/coverage-7.15.2-cp311-cp311-win_arm64.whl", hash = "sha256:8c726b232659cbd2ae57ade46509eb068c9bd7a06df9fcbff6fe484870006934", size = 223519, upload-time = "2026-07-15T18:54:16.803Z" }, + { url = "https://files.pythonhosted.org/packages/6a/50/eb5bf42e531611a9f8d272556b1ed4de503f84a91413584094487cf69f8f/coverage-7.15.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1adac78e5abc7c5438f7a209c9ca69d06542f0bf481d728b6989ea80b813fdf9", size = 221587, upload-time = "2026-07-15T18:54:18.439Z" }, + { url = "https://files.pythonhosted.org/packages/06/d1/da99af464c335d4e023a6efcd7ec30f63b88a43c93745154ab74ffb31cea/coverage-7.15.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b868acc62aa5de3be7a9d05c2333bf8359ca987e43f9cb30ff8fbda6a024ab73", size = 221943, upload-time = "2026-07-15T18:54:20.062Z" }, + { url = "https://files.pythonhosted.org/packages/5b/8a/13c42723d61ca447eafa18732e8141dd6a63f2732e1c7e1502c182dd88d7/coverage-7.15.2-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6f6966fc30e6f06ca8f98fb0ce51eda6b111b3ee8d066a8b1ec9e77fa06ab55d", size = 253450, upload-time = "2026-07-15T18:54:21.765Z" }, + { url = "https://files.pythonhosted.org/packages/d7/29/99021303f98fbdcb63504b4d07bea4cc025b9b2dd907c4f07c85d50a0dab/coverage-7.15.2-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:68af907f595ab01a78f794932ff3bdf929c316d3000810d38dbc247129e26f8b", size = 256187, upload-time = "2026-07-15T18:54:23.4Z" }, + { url = "https://files.pythonhosted.org/packages/f9/a8/fd503715ed6ca9c5d742923aa5209257340b367a867b2ced0c7d4ba8a0b9/coverage-7.15.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:afa29e2eff3d5729267e2cb2fd4ce9d61c952932fb2694e34ccb5d9540c6a296", size = 257301, upload-time = "2026-07-15T18:54:25.183Z" }, + { url = "https://files.pythonhosted.org/packages/da/40/3f4b8fb409810036ebc2857d36adc0498c6e957b5df0290c5036b2e143f1/coverage-7.15.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bbf44513ceb1589e31948e20eafbde9deaface90e1a1afa5f5f77b4423d17ce6", size = 259562, upload-time = "2026-07-15T18:54:27.204Z" }, + { url = "https://files.pythonhosted.org/packages/0b/8a/9bdffbef47db77cce3d6b02a28f7e919b19f0106c4b080c2c2246040f885/coverage-7.15.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9deddf09eecb717b7f980414b43d90a5b22ff3967d2949ab29cb0aa83d9e9098", size = 253841, upload-time = "2026-07-15T18:54:29.134Z" }, + { url = "https://files.pythonhosted.org/packages/1b/1e/9031efde019d31a06646261fce6dfc5c3c74e951e27a71e5c9a424563178/coverage-7.15.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ae901f7e55ba405c84ee1cab3d3e962e4e871e4a2bcb9c90911adbd69b42ac5a", size = 255221, upload-time = "2026-07-15T18:54:31.142Z" }, + { url = "https://files.pythonhosted.org/packages/56/db/787acde872389fc84a9ef9d8cd1ccc658e391ab4cb5b28092a714426a394/coverage-7.15.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a0f47002c6eeb7c280228467a4cb0cc15ca2103a8421b986b2d3ec04a0f9bd8b", size = 253366, upload-time = "2026-07-15T18:54:32.886Z" }, + { url = "https://files.pythonhosted.org/packages/2f/9b/6f57bc4b93c842eef1695f8cdaf2318e35e7ba54f5ba80d84be213ab7858/coverage-7.15.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1cd7a5beb7af3e864a13b1f0fb26efd3695da43ef0daf71e586adfffaf34d5b2", size = 257434, upload-time = "2026-07-15T18:54:34.7Z" }, + { url = "https://files.pythonhosted.org/packages/88/26/b3186a21b2acc83e451118978905c81c7072c3333707804db09a78c096a2/coverage-7.15.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:97a5c5457a9fb1d6c4e06cfb5dc835871fbfb6a6a51addc9e925bdeff5ef7440", size = 252935, upload-time = "2026-07-15T18:54:36.548Z" }, + { url = "https://files.pythonhosted.org/packages/20/c2/c9f3376b2e717ea69ed7a6e9a5fcab968fb0b290db6cf4bd9a1fc7541b75/coverage-7.15.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0901cfe6c13bcd2302da4f83e884555d2a22bda6e4c476f09ef204ba20ca536e", size = 254807, upload-time = "2026-07-15T18:54:38.296Z" }, + { url = "https://files.pythonhosted.org/packages/f0/e1/dfc15401f4a8aaeb486e1ba3e9e3c40522a6e38bd0ecf0b3f29cb8082957/coverage-7.15.2-cp312-cp312-win32.whl", hash = "sha256:b171bdd71cb7ff792bf32e376173b0ace7e7963e7e57c58dfc42063a6a7174cd", size = 223641, upload-time = "2026-07-15T18:54:40.103Z" }, + { url = "https://files.pythonhosted.org/packages/91/40/81b6d809d320cd366ec5bdf8176575e897dcb8efe7fb4b489ef9e93e4d13/coverage-7.15.2-cp312-cp312-win_amd64.whl", hash = "sha256:582edc45c2040543fef83341be23c43024a3ab3ae0c2d8bc498a06282905ad40", size = 224172, upload-time = "2026-07-15T18:54:41.882Z" }, + { url = "https://files.pythonhosted.org/packages/ef/28/9f14ec438149f7de557f45518f09b4a7917b795cc37083aa7db482693f8c/coverage-7.15.2-cp312-cp312-win_arm64.whl", hash = "sha256:a638db90c61cd219aeee65e83a24fdaa57269a741ae0cf773309208ac862cee3", size = 223556, upload-time = "2026-07-15T18:54:43.674Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d5/f8c838e6b7282976f7c918884b792df7a0c42c5bba5d99c60ad2d221d56d/coverage-7.15.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1121caa19159a38b5463eaae4b1e1fde81e525b15ecc5e000cd5b1a108f743a8", size = 221606, upload-time = "2026-07-15T18:54:45.448Z" }, + { url = "https://files.pythonhosted.org/packages/bf/37/97c926376364f66298cc44893b89cdf17b8bc406376497c4061ae4b8a8ff/coverage-7.15.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a300c6934e0989c327b9e8a1e110329da4641149f872bbe9f70168be66da76c1", size = 221982, upload-time = "2026-07-15T18:54:47.341Z" }, + { url = "https://files.pythonhosted.org/packages/b7/30/a36050a6e83c2135ee0776f452ca3948224befc6d7f26acecc082d0c106a/coverage-7.15.2-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2617f8799d268fabdeef42a7e89ac3a23e1deee9025427db2df970f99a89a578", size = 252972, upload-time = "2026-07-15T18:54:49.2Z" }, + { url = "https://files.pythonhosted.org/packages/31/d3/06b5f1daf95f0f15ab05bd75f26ba5f3c8b33d0bb72f3aaa3cf41d1bad3a/coverage-7.15.2-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7dc2950a2992cd676d35c20ae63522836deeb034f08874699d14068710af3dc1", size = 255569, upload-time = "2026-07-15T18:54:51.098Z" }, + { url = "https://files.pythonhosted.org/packages/81/1c/9afb3f8de2b8d36960391c48559a2e3ff96594b58099f115921549ea8d0d/coverage-7.15.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9e36686f7a442185db2400b3df171aac520869faf9deb59df687d28659eda2a6", size = 256806, upload-time = "2026-07-15T18:54:53.145Z" }, + { url = "https://files.pythonhosted.org/packages/64/d8/b989f96061a5e32d82fddd1b1b9ff48a7c8f8ae7606f0e80fd9de54b1e33/coverage-7.15.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7d29ca7bd67af6e12e74632d65f026eabc1364da5c254494cd914446a28a3ef7", size = 258936, upload-time = "2026-07-15T18:54:55.015Z" }, + { url = "https://files.pythonhosted.org/packages/b8/fa/f99771f5110457c7b511c1935ca49ddf288218eaa84322e028b9334146ae/coverage-7.15.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:db9c8438057e5b0f6a22a0af99c0c1d26b57fbbdbd1be5861ddb8f897fcc3a2d", size = 253178, upload-time = "2026-07-15T18:54:57.527Z" }, + { url = "https://files.pythonhosted.org/packages/f6/96/c098a6044d119c751ceede7be91035fa8310170ec24a6523aff72f0a5793/coverage-7.15.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:63022c4c8dec1d0342f05c3ede99842fe3d007689acc45e86f123a1746e4a026", size = 254934, upload-time = "2026-07-15T18:54:59.41Z" }, + { url = "https://files.pythonhosted.org/packages/b2/a2/1457b3a7a50c8d77500103b97a046db863e2f59a1cf6d2f814595f349885/coverage-7.15.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6c0be82b4d4aa5b2704e08518e2252f3e3d110164bcca826816801052e48a7aa", size = 252898, upload-time = "2026-07-15T18:55:01.338Z" }, + { url = "https://files.pythonhosted.org/packages/6c/0e/76958874c471ecfcdde0d2b2747bb2c61bdbf34a40636f4ce9db9923e643/coverage-7.15.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4510fb9cdf6bb02dfa6af0be4a534b8102d086e22e4a33f8836df663da3d660d", size = 257056, upload-time = "2026-07-15T18:55:03.243Z" }, + { url = "https://files.pythonhosted.org/packages/7c/7c/3d7c4e3bf58baa40327dc7edc2272b17cf02299366d52763db1b0ca1556a/coverage-7.15.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:42ec3d989421b174a2ab607c1539f24127ad362757b7f1c0c0d7a2993f7eb37b", size = 252718, upload-time = "2026-07-15T18:55:05.029Z" }, + { url = "https://files.pythonhosted.org/packages/c8/b8/1cecffed9ce14fb25be9ba42d37b6bb61485c9a3ddd43cd3dde36b6087d8/coverage-7.15.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e8f91bce78e32343af184c3b7fa28fcf5a9e2641f4b6623d392038f804939188", size = 254490, upload-time = "2026-07-15T18:55:06.889Z" }, + { url = "https://files.pythonhosted.org/packages/6c/2c/42984561bc7f4c045dca67516a0c50ee5ef8d84352dbeb5559dc86c4823e/coverage-7.15.2-cp313-cp313-win32.whl", hash = "sha256:434e68d531858205895eb0d74b73d20b84260de426387d53c422a5acda2cf050", size = 223647, upload-time = "2026-07-15T18:55:08.941Z" }, + { url = "https://files.pythonhosted.org/packages/41/9f/39c7c9245efc583beddf89a87683574e663ed93637f3afb6cd7b88405676/coverage-7.15.2-cp313-cp313-win_amd64.whl", hash = "sha256:26c3b04a6377fd7c09800921fa934e3a17c0020439cd59df73e73ae1d4b6a78c", size = 224190, upload-time = "2026-07-15T18:55:10.789Z" }, + { url = "https://files.pythonhosted.org/packages/c7/de/3a2883cf8a213659280ef4b403059e17a9acaeb7fc7fd4105e1226ff2e6d/coverage-7.15.2-cp313-cp313-win_arm64.whl", hash = "sha256:3ed010aa1b69cda8e827aabfca9866216c980e2dca82ab9a78c5f83689964c8b", size = 223583, upload-time = "2026-07-15T18:55:12.678Z" }, + { url = "https://files.pythonhosted.org/packages/81/5f/aed265fd7a3551a394f36dfe41868aee709b7f95db4052205b4ad1563ac3/coverage-7.15.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:40f633c5c5fc783732f6312280122e859538fa24461235597c13d803ea9a108a", size = 221650, upload-time = "2026-07-15T18:55:14.527Z" }, + { url = "https://files.pythonhosted.org/packages/6b/2c/222ba12a545189017120f8eddfc1a0bd4616b47d5d4a8d99421edb2fe4c6/coverage-7.15.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:075560438765b7a2ef43bf7aa7758661b53d889df47f062a31bda6c1ade553a2", size = 221988, upload-time = "2026-07-15T18:55:16.674Z" }, + { url = "https://files.pythonhosted.org/packages/aa/38/304b5877ab46e6c290b4292cfcf3fe28245f0e5597cad7f6acc91fc7e0a4/coverage-7.15.2-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:25fd15dd40a0a2c51a500d664ca29053c09c3259d998407bf982b6e114696138", size = 253029, upload-time = "2026-07-15T18:55:18.856Z" }, + { url = "https://files.pythonhosted.org/packages/6c/58/821b533b8db9e44cf1d8a97bd525149ced40dde1d0093da02cb78e715244/coverage-7.15.2-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b9a6367e4aff723e8ee8190836836124284e8fcd4265e307c844010cfa074f3f", size = 255536, upload-time = "2026-07-15T18:55:21.027Z" }, + { url = "https://files.pythonhosted.org/packages/f1/f2/7aa06604c389d32ea7f0a6a988359a7eafc3cd3f8e7bc2e88cd2fdf0b877/coverage-7.15.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9854ca62c152874b2060772503535be2e8f53f70b8aaa7686b094888d872f984", size = 256881, upload-time = "2026-07-15T18:55:23.125Z" }, + { url = "https://files.pythonhosted.org/packages/a2/4f/1ef342339c7916d0096bc5888cc0f653882cc7bc8f897d5cb89143287c9b/coverage-7.15.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:913b6c56e110da40e035bbd168353bf7aaa2544a5eaccea5d98a4629aac156c7", size = 259196, upload-time = "2026-07-15T18:55:25.099Z" }, + { url = "https://files.pythonhosted.org/packages/fe/f4/7ed055d7a9c5ec13b161773a115a5ccc6b0081d568c31fad830806306cc7/coverage-7.15.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:aaccad4129d735a8a4d526f26929894c9a4e8ef7034566f210b176749d6906e3", size = 253036, upload-time = "2026-07-15T18:55:27.018Z" }, + { url = "https://files.pythonhosted.org/packages/14/79/ea82cca18c242a3a38b6c017da39726aa62dcb64aa635abf79b92009975c/coverage-7.15.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a164b50081fc7357331c4024ef4d17b78ba325f8380d05f5a69599a7e05257ee", size = 254887, upload-time = "2026-07-15T18:55:29.084Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ba/a136db3c0d9562b00e10b72540dbf3a33cd3bc5b95060c9308e247494623/coverage-7.15.2-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:bfd341ccf78128e72c094bc70cc25b3ef309c33c7c2c66ba3ed4309549e02de1", size = 252852, upload-time = "2026-07-15T18:55:31.184Z" }, + { url = "https://files.pythonhosted.org/packages/17/17/ea334246b16b7d059953fad6fdefa11e33c68efbd3fe37b1098120a1fac2/coverage-7.15.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:1473b3ba8e7ee0f076117b1a72c23f579a2b9e2bb742f48a8d86ea27ca93f91a", size = 257128, upload-time = "2026-07-15T18:55:33.163Z" }, + { url = "https://files.pythonhosted.org/packages/ed/c3/074fb66d46d607855f710876b117cbda562c5ab08363528e78820449f937/coverage-7.15.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:17c432b5f73ad52ef46fb06019f6fa7c66ce381961cf0f7dfd1d3a4bd3a98145", size = 252668, upload-time = "2026-07-15T18:55:35.063Z" }, + { url = "https://files.pythonhosted.org/packages/e1/c1/f620850ada9b36435921c9a3a8057013422b1d964eb4bf37fe138724d192/coverage-7.15.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:77f0ef5011df53a4bd1b35211ab122287f8d9b8d7aa1c4553e5c2deb24b1d446", size = 254325, upload-time = "2026-07-15T18:55:37.125Z" }, + { url = "https://files.pythonhosted.org/packages/cc/31/a729ca3689404493af82ef8e6ff70bd88bdda8da89aeef6ca9b387aeb2b4/coverage-7.15.2-cp314-cp314-win32.whl", hash = "sha256:f653e5d7248c1191ec988a85c72edeab46c3ff44f90639a4ed4874ec0be90243", size = 223844, upload-time = "2026-07-15T18:55:39.078Z" }, + { url = "https://files.pythonhosted.org/packages/c6/83/5d809dc808fb1698c671f3e372259bb9158e64b7ea526fc6ab7de64de9fe/coverage-7.15.2-cp314-cp314-win_amd64.whl", hash = "sha256:9911f31aad8906abe337c271343485cf20df5e70df5d2f57f9f136e7b55f26bc", size = 224331, upload-time = "2026-07-15T18:55:41.346Z" }, + { url = "https://files.pythonhosted.org/packages/16/4e/35e488548e952795829e129995c4174df33bf432b591d1aa42c8d9e4e7ad/coverage-7.15.2-cp314-cp314-win_arm64.whl", hash = "sha256:e38def96ad59853824c97953fdcd2c320a84ba3ce99b417db78af8bb6c3db635", size = 223760, upload-time = "2026-07-15T18:55:43.518Z" }, + { url = "https://files.pythonhosted.org/packages/ed/49/dd2c86cd6374038f6e415fb5bfb86db5218553209c081384a020369dee79/coverage-7.15.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:835ec4e20b45f0a7f63ed78f94065aca00de033403df8377bfe8b9c6abc0a7be", size = 222384, upload-time = "2026-07-15T18:55:45.569Z" }, + { url = "https://files.pythonhosted.org/packages/d3/74/173ff17a1c0808e5a438f549f6f145d5ac7528f2791310b63523e3200ac7/coverage-7.15.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7466cc7ab6dc0db871d264bf99e8779f0917ee63d40730af0552f71535a6e072", size = 222647, upload-time = "2026-07-15T18:55:47.544Z" }, + { url = "https://files.pythonhosted.org/packages/84/f8/b8cba872162356fb44ac79c10309d987206a4461e32072fc29228dad7331/coverage-7.15.2-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e370c12133095ff18432de8c044962be85a5a96d90c6fcbce8e17e76236d2328", size = 264013, upload-time = "2026-07-15T18:55:49.768Z" }, + { url = "https://files.pythonhosted.org/packages/ee/67/a807a7586d0b8cae485308ddd55756f0806c92f8e0b411bacbf23c48edf3/coverage-7.15.2-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fe41909c9515c3bfdb5f02c4d1f857dba322d9a9a1178069b91eea77889df63a", size = 266135, upload-time = "2026-07-15T18:55:51.941Z" }, + { url = "https://files.pythonhosted.org/packages/ce/67/cd78771dc985f7e4ebdcc82b1a96d9a932af9e806f01f2f91a89f4c72e80/coverage-7.15.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6aa28cfb6488e5453b5b762d65f73aa586380f6693a04d58078ce228a29b06c0", size = 268555, upload-time = "2026-07-15T18:55:54.065Z" }, + { url = "https://files.pythonhosted.org/packages/18/3e/10134cf81275188c58568f324fc74aedff32c63ca4d5bbc513a91944a6f0/coverage-7.15.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bcc0aae933921d03096f53b0b03eeb702129fd406dee59f08d2efacc68681fa5", size = 269674, upload-time = "2026-07-15T18:55:56.066Z" }, + { url = "https://files.pythonhosted.org/packages/75/4a/771b77de446cba985dc414bbc5844bd21604da05dbc044286df8318a48a7/coverage-7.15.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7c63387e21ab21f512c69c9756a8c7dadd322c7275edb064064433c9a09c3743", size = 263101, upload-time = "2026-07-15T18:55:58.107Z" }, + { url = "https://files.pythonhosted.org/packages/5f/b5/70a7011da15f4071943361183aefa27847f3e3aec4fd335f1cb3d3a622b1/coverage-7.15.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0e55510bc98ae943cece9e667a6c0fe94c6a92913720dea34243657a17993d0c", size = 266007, upload-time = "2026-07-15T18:56:00.468Z" }, + { url = "https://files.pythonhosted.org/packages/b4/0d/f9547e804ce7ad49646ffeffac26699510efbe6c0f751b66fdc960c4e825/coverage-7.15.2-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:2ff08701be2d1556fc78b326c80a3e8042da09352ecb3819105f8e386c8a3071", size = 263611, upload-time = "2026-07-15T18:56:02.615Z" }, + { url = "https://files.pythonhosted.org/packages/ac/59/f576a396659c0efd351f5c1544f67c3560e89c7761cabf7f65e412beeda5/coverage-7.15.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:38c9518b7103826c403a461544e3c2e77151e8676d06eaed85911a97e962584a", size = 267344, upload-time = "2026-07-15T18:56:04.622Z" }, + { url = "https://files.pythonhosted.org/packages/7c/5d/c2e4fce3579c0cb635024293f1a32bbe26df101b3e3a69f22243d1352b6c/coverage-7.15.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:dee88b1ed88587abd8c0269a1fc1f4cc77f7750d1dfde2869e2a123af420e67d", size = 262456, upload-time = "2026-07-15T18:56:06.641Z" }, + { url = "https://files.pythonhosted.org/packages/bb/dd/956287d69436b66094bc4b57ac2da71e43bfd2a5524e958900b9f582fcf8/coverage-7.15.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:2fbeeeecea279727f8ac16c8e1133ddfeee793e985c86ae343d6a5ce744eef8c", size = 264771, upload-time = "2026-07-15T18:56:08.795Z" }, + { url = "https://files.pythonhosted.org/packages/2c/5a/6f979530c2734c575de77cf58f5f28d51f7123a94b5030fd9156fe5f363c/coverage-7.15.2-cp314-cp314t-win32.whl", hash = "sha256:cb0fddaa6884be6aae36ced9544b5e90f7d5f03845a2853bf47a14953a4e8688", size = 224151, upload-time = "2026-07-15T18:56:10.856Z" }, + { url = "https://files.pythonhosted.org/packages/54/7e/27f6b2a74d484742f4017553e710b01e396b23d809df3e95ca0bb9a2824b/coverage-7.15.2-cp314-cp314t-win_amd64.whl", hash = "sha256:77f091ea3a9cc611cd29f433565476bc1936c084ac8eee00ea0e7e70c27e4199", size = 224981, upload-time = "2026-07-15T18:56:12.928Z" }, + { url = "https://files.pythonhosted.org/packages/b1/48/284863423aa474240f6842bd00d680da22f4e6ea2e466618ef7c9c9e69a9/coverage-7.15.2-cp314-cp314t-win_arm64.whl", hash = "sha256:6fc448c377d6eeb00a47c673494bd9bae29280ca53987e1869e67ebedfe20658", size = 224294, upload-time = "2026-07-15T18:56:15.156Z" }, + { url = "https://files.pythonhosted.org/packages/ec/82/32e3bd191d498e64f6f911ad55d14006a0861e54869d2d32452326399e65/coverage-7.15.2-py3-none-any.whl", hash = "sha256:eb6bcae8d1a9d305351ecb108232441d11c5cfe9de840a04388ba5d2db8d735c", size = 213375, upload-time = "2026-07-15T18:56:17.305Z" }, +] + [[package]] name = "dirty-equals" version = "0.11" @@ -1279,27 +1377,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.21" +version = "0.15.22" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0f/36/6f65aa9989acdec45d417192d8f4e7921931d8a6cf87ac74bce3eed98a8e/ruff-0.15.21.tar.gz", hash = "sha256:d0cfc841c572283c36548f82664a54ce6565567f1b0d5b4cf2caac693d8b7500", size = 4769401, upload-time = "2026-07-09T20:01:34.005Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/06/ae069393fc66e8ff33036d4b368003833bf6e88ccf182e17e7a2f1c754fd/ruff-0.15.22.tar.gz", hash = "sha256:3f15175b1fb580126f58285a5dae6b2ea89000136d980c64499211f116b54809", size = 4785063, upload-time = "2026-07-16T15:14:13.244Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/c6/ede15cac6839f3dbce52565c8f5164a8210e669c7bc4decb03e5bdf47d0d/ruff-0.15.21-py3-none-linux_armv6l.whl", hash = "sha256:63ea0e965e5d73c90e95b2434beeafc70820536717f561b32ab6e777cb9bdf5d", size = 10854342, upload-time = "2026-07-09T20:00:53.998Z" }, - { url = "https://files.pythonhosted.org/packages/28/9d/d825b07ee7ea9e2d61df92a860033c94e06e7300d50a1c2653aac27d24fe/ruff-0.15.21-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0f212c5d7d54c01bbfe6dcab02b724a39300f3e34ed7acbe995ccb320a2c58bd", size = 11139539, upload-time = "2026-07-09T20:00:57.809Z" }, - { url = "https://files.pythonhosted.org/packages/f5/de/3b107712e642f063c7a9e0887c427b22cb44097de5aab36c05f2e280670c/ruff-0.15.21-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e6312e41bc96791299614995ea3a977c5857c3b5662b1ecef6755b02b87cb646", size = 10595437, upload-time = "2026-07-09T20:01:00.006Z" }, - { url = "https://files.pythonhosted.org/packages/9a/6f/b4523cc90ba239ede441447a19d0c968846a3012e5a0b0c5b62831a3d5e3/ruff-0.15.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d65b4831c6b2a4ba8ee6faa84049d44d982b7a706e622c4094c509e51673be", size = 10990053, upload-time = "2026-07-09T20:01:02.187Z" }, - { url = "https://files.pythonhosted.org/packages/92/cc/c6a9872a5375f0628875481cf2f66b13d7d865bf3ca2e57f91c7e762d976/ruff-0.15.21-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c5a913a589120ce67933d5d05fd6ddbcc2481c6a054980ee767f7414c72b4fd", size = 10666096, upload-time = "2026-07-09T20:01:04.299Z" }, - { url = "https://files.pythonhosted.org/packages/ab/97/c621f7a17e097f1790fa3af6374138823b330b2d03fc38337945daca212c/ruff-0.15.21-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef04b681d02ad4dc9620f00f83ac5c22f652d0e9a9cfe431d219b16ad5ccc41", size = 11537011, upload-time = "2026-07-09T20:01:06.771Z" }, - { url = "https://files.pythonhosted.org/packages/ea/51/d928727e476e25ccc57c6f449ffd80241a651a973ad949d39cfb2a771d28/ruff-0.15.21-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16d090c0740916594157e75b80d666eab8e78083b39b3b0e1d698f4670a17b86", size = 12347101, upload-time = "2026-07-09T20:01:08.859Z" }, - { url = "https://files.pythonhosted.org/packages/1e/88/8cd62026802b16018ad06931d87997cf795ba2a6239ab659606c87d96bf0/ruff-0.15.21-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a10e74757dd65004d779b73e2f3c5210156d9980b41224d50d2ebcf1db51e67", size = 11572001, upload-time = "2026-07-09T20:01:11.092Z" }, - { url = "https://files.pythonhosted.org/packages/b2/97/f63084cf55444fc110e8cb985ebfcc592af47f597d44453d778cb81bc156/ruff-0.15.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bab0905d2f29e0d9fbc3c373ed23db0095edaa3f71f1f4f519ec15134d9e85c8", size = 11549239, upload-time = "2026-07-09T20:01:13.27Z" }, - { url = "https://files.pythonhosted.org/packages/9d/77/f107da4a2874b7715914b03f09ba9c54424de3ff8a1cc5d015d3ee2ce0ac/ruff-0.15.21-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:00eca240af5789fec6fe7df74c088cc1f9644ed83027113468efba7c92b94075", size = 11535340, upload-time = "2026-07-09T20:01:15.206Z" }, - { url = "https://files.pythonhosted.org/packages/d5/e9/601deb322d3303a7bf212b0100ead6f2ee3f6a044d89c30f2f92bf83c731/ruff-0.15.21-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262ab31557a75141325e32d3357f3597645a7f084e732b6b054dde428ecd9341", size = 10964048, upload-time = "2026-07-09T20:01:17.723Z" }, - { url = "https://files.pythonhosted.org/packages/ea/2e/0f2176d1e99c15192caea19c8c3a0a955246b4cb4de795042eeb616345cd/ruff-0.15.21-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:659c4e7a4212f83306045ec7c5e5a356d16d9a6ef4ae0c7a4d872914fc655d9d", size = 10667055, upload-time = "2026-07-09T20:01:19.73Z" }, - { url = "https://files.pythonhosted.org/packages/48/60/abd74a02e0c4214f12a68becfd30af7165cfdcb0e661ecdc60bbb949c09a/ruff-0.15.21-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9e866eab611a5f959d36df2d10e446973a3610bc42b0c15b31dc27977d59c233", size = 11242043, upload-time = "2026-07-09T20:01:21.947Z" }, - { url = "https://files.pythonhosted.org/packages/b2/c6/583075d8ccabb4b229345edcaf1545eb3d8d6be90f686a479d7e94088bbf/ruff-0.15.21-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e89bc93c0d3803ba870b55c29671bad9dc6d94bb1eb181b056b52eb05b52854f", size = 11648064, upload-time = "2026-07-09T20:01:24.023Z" }, - { url = "https://files.pythonhosted.org/packages/3a/3c/37d0ecb729a7cc2d393ea7dce316fc585680f35d93b8d62139d7d0a3700c/ruff-0.15.21-py3-none-win32.whl", hash = "sha256:01f8d5be84823c172b389e123174f781f9daf86d6c58719d603f941932195cdd", size = 10896555, upload-time = "2026-07-09T20:01:26.941Z" }, - { url = "https://files.pythonhosted.org/packages/c0/b8/e43466b2a6067ce91e669068f6e28d6c719a920f014b070d5c8731725de3/ruff-0.15.21-py3-none-win_amd64.whl", hash = "sha256:d4b8d9a2f0f12b816b50447f6eccb9f4bb01a6b82c86b50fb3b5354b458dc6d3", size = 12038772, upload-time = "2026-07-09T20:01:29.497Z" }, - { url = "https://files.pythonhosted.org/packages/dd/75/e90ab9aeece218a9fc5a5bc3ec97d0ee6bb3c4ff95869463c1de58e29a1c/ruff-0.15.21-py3-none-win_arm64.whl", hash = "sha256:6e83115d4b9377c1cbc13abf0e051f069fab0ef815ea0504a8a008cee24dd0a8", size = 11375265, upload-time = "2026-07-09T20:01:31.772Z" }, + { url = "https://files.pythonhosted.org/packages/23/18/ee54b7ae1e121be7a28ea6da4b67564ebb0530e183a54415ab7e3bcd2c4e/ruff-0.15.22-py3-none-linux_armv6l.whl", hash = "sha256:44423e73493737f5e7c5b41d475483898ff37afcdae38bc3da5085e29af1c2d8", size = 10781258, upload-time = "2026-07-16T15:13:19.452Z" }, + { url = "https://files.pythonhosted.org/packages/2f/d2/2520cb14761ddbeaf57642a76942fc36adcbdbe53b4532241995f6fc485c/ruff-0.15.22-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b82c6482946e9eda7ff2e091d25b8bad3f718684e1916d41bd56873cee05b697", size = 10999477, upload-time = "2026-07-16T15:13:23.318Z" }, + { url = "https://files.pythonhosted.org/packages/c9/10/74e53572aa758dfaa678c2a2646b5c5515d884b7ca56be4d2ce03ca4b560/ruff-0.15.22-py3-none-macosx_11_0_arm64.whl", hash = "sha256:11c1c715af53a09f714e011106bffc419751ec8232fcb5da42173284ea3fec6f", size = 10466716, upload-time = "2026-07-16T15:13:26.162Z" }, + { url = "https://files.pythonhosted.org/packages/1e/cc/44eaaf0844e028182f2d0a8f2190d0f359159aed0a9e5ab861d892f1ae2a/ruff-0.15.22-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:742a29cf29bddb7c8327895d6a10e0e6c5b38a96dd407af9b5d0857f809c0576", size = 10892644, upload-time = "2026-07-16T15:13:29.229Z" }, + { url = "https://files.pythonhosted.org/packages/9f/21/8edf559014d2b0f82beea19cfb713993ad802ccda16868769979c6090a84/ruff-0.15.22-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72af58b951b0ae395935ae79763dc349bc0eb706319d28f7a33ad2cfb3cfc178", size = 10576719, upload-time = "2026-07-16T15:13:32.35Z" }, + { url = "https://files.pythonhosted.org/packages/bf/1e/3a13abd392a3b50b62e5938a831f9ab6e588358cacad5c18545b716d2182/ruff-0.15.22-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62d425005c1835eb24e2ee4161cb90e8db263415f4a71c8c72c33abaa6c0c224", size = 11376494, upload-time = "2026-07-16T15:13:35.958Z" }, + { url = "https://files.pythonhosted.org/packages/bf/3e/422d3d95bcf04dd78e1aeac22184d4f9a8fb2c01865d39d44618484a0317/ruff-0.15.22-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e8b9b3f8779a4f08c969defc3c8c35abffaa757e601ed5ae66d6d1db6519969a", size = 12208370, upload-time = "2026-07-16T15:13:39.185Z" }, + { url = "https://files.pythonhosted.org/packages/1e/91/5d065a0e0a02bf4813f5119ad278462eed081d2b832eb7c021ade0ec9e65/ruff-0.15.22-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e0dd1b2e4d3d585f897a0d137cbf4eaf6223bef4e8ce34d6bb12556c5f9249e", size = 11581098, upload-time = "2026-07-16T15:13:42.132Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f9/a0d4871d12fae702eb1f41b686caf05f1f8b124dc6db6f784f53d74918fa/ruff-0.15.22-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:365523eb91d9224e1bcb03b022fbf0facb8f9e23792a2c53d9d4b3924bdbdebb", size = 11399422, upload-time = "2026-07-16T15:13:45.2Z" }, + { url = "https://files.pythonhosted.org/packages/18/80/c843a5176cddbceb0b7e8dd41cf9993490796c1c469348d384f5a5c13c56/ruff-0.15.22-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:fabfd168afdf29fee5be98b831efa9683c94d7c5a3b58b9ce5a2e38444589a74", size = 11381683, upload-time = "2026-07-16T15:13:48.46Z" }, + { url = "https://files.pythonhosted.org/packages/d4/00/8485de0ae92239438a36cfc51350db9b9e85c9ebdfaea91b18e422706662/ruff-0.15.22-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:225dbf095a87f1d9f90f5fd7924d2613ee452a75a4308c63a8f50f761787aa7c", size = 10850295, upload-time = "2026-07-16T15:13:51.655Z" }, + { url = "https://files.pythonhosted.org/packages/fa/91/24977ec2ec72eaf15e4394ace2959fdff2dd1e14f03e005e838023407169/ruff-0.15.22-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1877d63b9d24ed278744f1523fd11b85540566d54641f97c566d7d9dc5ca5296", size = 10579640, upload-time = "2026-07-16T15:13:54.79Z" }, + { url = "https://files.pythonhosted.org/packages/9c/47/9b51216951974df1f263ac19da550d34252e0ed7218c25f10c5ef9ed7517/ruff-0.15.22-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a1606c510bd7215680d32efab38965f7cdec3ef69f5170a3f4791404ffdd5262", size = 11105077, upload-time = "2026-07-16T15:13:57.915Z" }, + { url = "https://files.pythonhosted.org/packages/c2/47/20e9d4a3b8016778acea5fc32bb50d35d207500a17ddb529ffa6996feef8/ruff-0.15.22-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:630479b18625f5ffc373f77603a22a9f8ac0acd7ff0501178b5db28ec71e9c64", size = 11490980, upload-time = "2026-07-16T15:14:01.032Z" }, + { url = "https://files.pythonhosted.org/packages/4d/76/3f72d8fc38c1cb77b38c56a70da9d0c17700cc1cc50f9649c9d3c8f5ba71/ruff-0.15.22-py3-none-win32.whl", hash = "sha256:e5ba0e4a13fd14abbed2a77b517a3911290c6c6c59ef67784328d1668fab76cf", size = 10789165, upload-time = "2026-07-16T15:14:04.16Z" }, + { url = "https://files.pythonhosted.org/packages/cb/46/4965251734c2b6fcdca1b1b187d20bcac3af0ee5b083b89c910bb961ce3a/ruff-0.15.22-py3-none-win_amd64.whl", hash = "sha256:9be63ba1eb936acd2d1342fb8337c356353706fce233b2a15a09a97037e6acde", size = 11938297, upload-time = "2026-07-16T15:14:07.316Z" }, + { url = "https://files.pythonhosted.org/packages/57/c9/e69b1ff4c8b69093ef08b8919ab767af0569666865b39c30a8795d88d3c6/ruff-0.15.22-py3-none-win_arm64.whl", hash = "sha256:e1168075b72158510839f250027659cdd78476f40507dd517892304c41318661", size = 11298172, upload-time = "2026-07-16T15:14:10.51Z" }, ] [[package]] @@ -1493,6 +1591,7 @@ aiohttp = [ [package.dev-dependencies] dev = [ + { name = "coverage" }, { name = "dirty-equals" }, { name = "importlib-metadata" }, { name = "mypy" }, @@ -1527,6 +1626,7 @@ provides-extras = ["aiohttp"] [package.metadata.requires-dev] dev = [ + { name = "coverage", specifier = "==7.15.2" }, { name = "dirty-equals", specifier = ">=0.6.0" }, { name = "importlib-metadata", specifier = ">=6.7.0" }, { name = "mypy", specifier = "==2.3.0" }, @@ -1536,7 +1636,7 @@ dev = [ { name = "pytest-xdist", specifier = ">=3.6.1" }, { name = "respx" }, { name = "rich", specifier = ">=13.7.1" }, - { name = "ruff" }, + { name = "ruff", specifier = "==0.15.22" }, { name = "time-machine" }, ] pydantic-v1 = [{ name = "pydantic", specifier = ">=1.9.0,<2" }]