diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 04b083c..c8b0724 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,18 +1,18 @@ name: CI on: push: - branches: - - main - pull_request: - branches: - - main - - next + branches-ignore: + - 'generated' + - 'codegen/**' + - 'integrated/**' + - 'stl-preview-head/**' + - 'stl-preview-base/**' jobs: lint: timeout-minutes: 10 name: lint - runs-on: ubuntu-latest + runs-on: ${{ github.repository == 'stainless-sdks/solver-api-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }} steps: - uses: actions/checkout@v4 @@ -33,7 +33,7 @@ jobs: test: timeout-minutes: 10 name: test - runs-on: ubuntu-latest + runs-on: ${{ github.repository == 'stainless-sdks/solver-api-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }} steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/publish-pypi.yml b/.github/workflows/publish-pypi.yml new file mode 100644 index 0000000..09b11b5 --- /dev/null +++ b/.github/workflows/publish-pypi.yml @@ -0,0 +1,31 @@ +# This workflow is triggered when a GitHub release is created. +# It can also be run manually to re-publish to PyPI in case it failed for some reason. +# You can run this workflow by navigating to https://www.github.com/Laredo-Labs/solverai-sdk-python/actions/workflows/publish-pypi.yml +name: Publish PyPI +on: + workflow_dispatch: + + release: + types: [published] + +jobs: + publish: + name: publish + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Install Rye + run: | + curl -sSf https://rye.astral.sh/get | bash + echo "$HOME/.rye/shims" >> $GITHUB_PATH + env: + RYE_VERSION: '0.44.0' + RYE_INSTALL_OPTION: '--yes' + + - name: Publish to PyPI + run: | + bash ./bin/publish-pypi + env: + PYPI_TOKEN: ${{ secrets.SOLVER_PYPI_TOKEN || secrets.PYPI_TOKEN }} diff --git a/.github/workflows/release-doctor.yml b/.github/workflows/release-doctor.yml new file mode 100644 index 0000000..de3fa13 --- /dev/null +++ b/.github/workflows/release-doctor.yml @@ -0,0 +1,21 @@ +name: Release Doctor +on: + pull_request: + branches: + - main + workflow_dispatch: + +jobs: + release_doctor: + name: release doctor + runs-on: ubuntu-latest + if: github.repository == 'Laredo-Labs/solverai-sdk-python' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || startsWith(github.head_ref, 'release-please') || github.head_ref == 'next') + + steps: + - uses: actions/checkout@v4 + + - name: Check release environment + run: | + bash ./bin/check-release-environment + env: + PYPI_TOKEN: ${{ secrets.SOLVER_PYPI_TOKEN || secrets.PYPI_TOKEN }} diff --git a/.release-please-manifest.json b/.release-please-manifest.json new file mode 100644 index 0000000..ba6c348 --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "0.1.0-alpha.1" +} \ No newline at end of file diff --git a/.stats.yml b/.stats.yml index 7a2b55e..43cb594 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 15 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/solver-ai%2Fsolver-api-30a94cd12d5edc9db3d0fb471d522d687c4949b4c9cc1bdf1b1f062d6a329969.yml -openapi_spec_hash: d884b89ee925c4112c75e88e65acc65a -config_hash: ee8abb60a6d388a2faf9850fe05e2c4b +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/solver-ai%2Fsolver-api-408c34dbecbdc0cedeeb15fe065582a1497991bc585000afe25bf2d62b8d663a.yml +openapi_spec_hash: f6806cce3b0e7dc1855a4ac92a71c2dd +config_hash: feaa57eb2464300a39a877a38ed85f68 diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..abc5bd2 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,31 @@ +# Changelog + +## 0.1.0-alpha.1 (2025-04-25) + +Full Changelog: [v0.0.1-alpha.0...v0.1.0-alpha.1](https://github.com/Laredo-Labs/solverai-sdk-python/compare/v0.0.1-alpha.0...v0.1.0-alpha.1) + +### Features + +* **api:** update via SDK Studio ([3581c64](https://github.com/Laredo-Labs/solverai-sdk-python/commit/3581c640b87cbe289efc4a7a08564a9ae411ca17)) +* **api:** update via SDK Studio ([306cbd8](https://github.com/Laredo-Labs/solverai-sdk-python/commit/306cbd83a940dfe4b7ea7b5409942a9dd5ba033f)) +* **api:** update via SDK Studio ([1e2eea0](https://github.com/Laredo-Labs/solverai-sdk-python/commit/1e2eea06cb5dc8c8064b4b270348f1314e8f888a)) +* **api:** update via SDK Studio ([c4f07d8](https://github.com/Laredo-Labs/solverai-sdk-python/commit/c4f07d87fe333341decfc944f40ae50079b9f101)) + + +### Bug Fixes + +* **pydantic v1:** more robust ModelField.annotation check ([fb446a4](https://github.com/Laredo-Labs/solverai-sdk-python/commit/fb446a49433f676c32ed09594f436321db9f4fa3)) + + +### Chores + +* broadly detect json family of content-type headers ([8c7adce](https://github.com/Laredo-Labs/solverai-sdk-python/commit/8c7adced1025f48a09cc60f2192a389ae3cc0b57)) +* **ci:** add timeout thresholds for CI jobs ([747d18f](https://github.com/Laredo-Labs/solverai-sdk-python/commit/747d18fec846fc3b1796be0cfb2a91a90683263b)) +* **ci:** only use depot for staging repos ([0e13fdf](https://github.com/Laredo-Labs/solverai-sdk-python/commit/0e13fdfa795b2ceef2e7e242aa2c0d26ab0756ea)) +* go live ([63ea47d](https://github.com/Laredo-Labs/solverai-sdk-python/commit/63ea47d9b6f641ff2779ea928839e7d2576f3a67)) +* go live ([269266e](https://github.com/Laredo-Labs/solverai-sdk-python/commit/269266e5853b734ce774bd8660151d61bcb5337a)) +* **internal:** codegen related update ([1f20bad](https://github.com/Laredo-Labs/solverai-sdk-python/commit/1f20badfb0ade74ed54828da3b702b369d4bcd71)) +* **internal:** fix list file params ([22afcc8](https://github.com/Laredo-Labs/solverai-sdk-python/commit/22afcc855f286278595458214ad8ceca0d52f0a7)) +* **internal:** import reformatting ([0e1374c](https://github.com/Laredo-Labs/solverai-sdk-python/commit/0e1374c790a7716b399cf597d826590aa18bf06e)) +* **internal:** refactor retries to not use recursion ([4020e02](https://github.com/Laredo-Labs/solverai-sdk-python/commit/4020e0289602a18e861fe800a72937b46236fdad)) +* update SDK settings ([99c7592](https://github.com/Laredo-Labs/solverai-sdk-python/commit/99c7592daee266b1807f019bd7d16d74e60d9379)) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e6dff96..bdae47f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -37,7 +37,7 @@ $ pip install -r requirements-dev.lock Most of the SDK is generated code. Modifications to code will be persisted between generations, but may result in merge conflicts between manual patches and changes from the generator. The generator will never -modify the contents of the `src/solver_api/lib/` and `examples/` directories. +modify the contents of the `src/solverai/lib/` and `examples/` directories. ## Adding and running examples @@ -63,7 +63,7 @@ If you’d like to use the repository from source, you can either install from g To install via git: ```sh -$ pip install git+ssh://git@github.com/stainless-sdks/solver-api-python.git +$ pip install git+ssh://git@github.com/Laredo-Labs/solverai-sdk-python.git ``` Alternatively, you can build from source and install the wheel file: @@ -121,7 +121,7 @@ the changes aren't made through the automated pipeline, you may want to make rel ### Publish with a GitHub workflow -You can release to package managers by using [the `Publish PyPI` GitHub action](https://www.github.com/stainless-sdks/solver-api-python/actions/workflows/publish-pypi.yml). This requires a setup organization or repository secret to be set up. +You can release to package managers by using [the `Publish PyPI` GitHub action](https://www.github.com/Laredo-Labs/solverai-sdk-python/actions/workflows/publish-pypi.yml). This requires a setup organization or repository secret to be set up. ### Publish manually diff --git a/README.md b/README.md index e9a44e5..f547841 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Solver Python API library -[![PyPI version](https://img.shields.io/pypi/v/solver_api.svg)](https://pypi.org/project/solver_api/) +[![PyPI version](https://img.shields.io/pypi/v/solverai.svg)](https://pypi.org/project/solverai/) The Solver Python library provides convenient access to the Solver REST API from any Python 3.8+ application. The library includes type definitions for all request params and response fields, @@ -15,28 +15,29 @@ The REST API documentation can be found on [solverai.com](https://solverai.com). ## Installation ```sh -# install from this staging repo -pip install git+ssh://git@github.com/stainless-sdks/solver-api-python.git +# install from PyPI +pip install --pre solverai ``` -> [!NOTE] -> Once this package is [published to PyPI](https://app.stainless.com/docs/guides/publish), this will become: `pip install --pre solver_api` - ## Usage The full API of this library can be found in [api.md](api.md). ```python import os -from solver_api import Solver +from solverai import Solver client = Solver( api_key=os.environ.get("SOLVER_API_KEY"), # This is the default and can be omitted ) -repos = client.repos.list( - "github", +session = client.repos.sessions.create( + repo="solverai-sdk-python", + provider="github", + org="Laredo-Labs", + user_branch_name="main", ) +print(session.id) ``` While you can provide an `api_key` keyword argument, @@ -51,7 +52,7 @@ Simply import `AsyncSolver` instead of `Solver` and use `await` with each API ca ```python import os import asyncio -from solver_api import AsyncSolver +from solverai import AsyncSolver client = AsyncSolver( api_key=os.environ.get("SOLVER_API_KEY"), # This is the default and can be omitted @@ -59,9 +60,13 @@ client = AsyncSolver( async def main() -> None: - repos = await client.repos.list( - "github", + session = await client.repos.sessions.create( + repo="solverai-sdk-python", + provider="github", + org="Laredo-Labs", + user_branch_name="main", ) + print(session.id) asyncio.run(main()) @@ -80,29 +85,32 @@ Typed requests and responses provide autocomplete and documentation within your ## Handling errors -When the library is unable to connect to the API (for example, due to network connection problems or a timeout), a subclass of `solver_api.APIConnectionError` is raised. +When the library is unable to connect to the API (for example, due to network connection problems or a timeout), a subclass of `solverai.APIConnectionError` is raised. When the API returns a non-success status code (that is, 4xx or 5xx -response), a subclass of `solver_api.APIStatusError` is raised, containing `status_code` and `response` properties. +response), a subclass of `solverai.APIStatusError` is raised, containing `status_code` and `response` properties. -All errors inherit from `solver_api.APIError`. +All errors inherit from `solverai.APIError`. ```python -import solver_api -from solver_api import Solver +import solverai +from solverai import Solver client = Solver() try: - client.repos.list( - "github", + client.repos.sessions.create( + repo="solverai-sdk-python", + provider="github", + org="Laredo-Labs", + user_branch_name="main", ) -except solver_api.APIConnectionError as e: +except solverai.APIConnectionError as e: print("The server could not be reached") print(e.__cause__) # an underlying Exception, likely raised within httpx. -except solver_api.RateLimitError as e: +except solverai.RateLimitError as e: print("A 429 status code was received; we should back off a bit.") -except solver_api.APIStatusError as e: +except solverai.APIStatusError as e: print("Another non-200-range status code was received") print(e.status_code) print(e.response) @@ -130,7 +138,7 @@ Connection errors (for example, due to a network connectivity problem), 408 Requ You can use the `max_retries` option to configure or disable retry settings: ```python -from solver_api import Solver +from solverai import Solver # Configure the default for all requests: client = Solver( @@ -139,8 +147,11 @@ client = Solver( ) # Or, configure per-request: -client.with_options(max_retries=5).repos.list( - "github", +client.with_options(max_retries=5).repos.sessions.create( + repo="solverai-sdk-python", + provider="github", + org="Laredo-Labs", + user_branch_name="main", ) ``` @@ -150,7 +161,7 @@ By default requests time out after 1 minute. You can configure this with a `time which accepts a float or an [`httpx.Timeout`](https://www.python-httpx.org/advanced/#fine-tuning-the-configuration) object: ```python -from solver_api import Solver +from solverai import Solver # Configure the default for all requests: client = Solver( @@ -164,8 +175,11 @@ client = Solver( ) # Override per-request: -client.with_options(timeout=5.0).repos.list( - "github", +client.with_options(timeout=5.0).repos.sessions.create( + repo="solverai-sdk-python", + provider="github", + org="Laredo-Labs", + user_branch_name="main", ) ``` @@ -204,21 +218,24 @@ if response.my_field is None: The "raw" Response object can be accessed by prefixing `.with_raw_response.` to any HTTP method call, e.g., ```py -from solver_api import Solver +from solverai import Solver client = Solver() -response = client.repos.with_raw_response.list( - "github", +response = client.repos.sessions.with_raw_response.create( + repo="solverai-sdk-python", + provider="github", + org="Laredo-Labs", + user_branch_name="main", ) print(response.headers.get('X-My-Header')) -repo = response.parse() # get the object that `repos.list()` would have returned -print(repo) +session = response.parse() # get the object that `repos.sessions.create()` would have returned +print(session.id) ``` -These methods return an [`APIResponse`](https://github.com/stainless-sdks/solver-api-python/tree/main/src/solver_api/_response.py) object. +These methods return an [`APIResponse`](https://github.com/Laredo-Labs/solverai-sdk-python/tree/main/src/solverai/_response.py) object. -The async client returns an [`AsyncAPIResponse`](https://github.com/stainless-sdks/solver-api-python/tree/main/src/solver_api/_response.py) with the same structure, the only difference being `await`able methods for reading the response content. +The async client returns an [`AsyncAPIResponse`](https://github.com/Laredo-Labs/solverai-sdk-python/tree/main/src/solverai/_response.py) with the same structure, the only difference being `await`able methods for reading the response content. #### `.with_streaming_response` @@ -227,8 +244,11 @@ The above interface eagerly reads the full response body when you make the reque To stream the response body, use `.with_streaming_response` instead, which requires a context manager and only reads the response body once you call `.read()`, `.text()`, `.json()`, `.iter_bytes()`, `.iter_text()`, `.iter_lines()` or `.parse()`. In the async client, these are async methods. ```python -with client.repos.with_streaming_response.list( - "github", +with client.repos.sessions.with_streaming_response.create( + repo="solverai-sdk-python", + provider="github", + org="Laredo-Labs", + user_branch_name="main", ) as response: print(response.headers.get("X-My-Header")) @@ -282,7 +302,7 @@ You can directly override the [httpx client](https://www.python-httpx.org/api/#c ```python import httpx -from solver_api import Solver, DefaultHttpxClient +from solverai import Solver, DefaultHttpxClient client = Solver( # Or use the `SOLVER_BASE_URL` env var @@ -305,7 +325,7 @@ client.with_options(http_client=DefaultHttpxClient(...)) By default the library closes underlying HTTP connections whenever the client is [garbage collected](https://docs.python.org/3/reference/datamodel.html#object.__del__). You can manually close the client using the `.close()` method if desired, or with a context manager that closes when exiting. ```py -from solver_api import Solver +from solverai import Solver with Solver() as client: # make requests here @@ -324,7 +344,7 @@ This package generally follows [SemVer](https://semver.org/spec/v2.0.0.html) con We take backwards-compatibility seriously and work hard to ensure you can rely on a smooth upgrade experience. -We are keen for your feedback; please open an [issue](https://www.github.com/stainless-sdks/solver-api-python/issues) with questions, bugs, or suggestions. +We are keen for your feedback; please open an [issue](https://www.github.com/Laredo-Labs/solverai-sdk-python/issues) with questions, bugs, or suggestions. ### Determining the installed version @@ -333,8 +353,8 @@ If you've upgraded to the latest version but aren't seeing any new features you You can determine the version that is being used at runtime with: ```py -import solver_api -print(solver_api.__version__) +import solverai +print(solverai.__version__) ``` ## Requirements diff --git a/api.md b/api.md index 7996194..d76b9e5 100644 --- a/api.md +++ b/api.md @@ -3,79 +3,79 @@ Types: ```python -from solver_api.types import VcsProvider, RepoListResponse +from solverai.types import VcsProvider, RepoListResponse ``` Methods: -- client.repos.list(provider) -> RepoListResponse +- client.repos.list(provider) -> RepoListResponse ## Sessions Types: ```python -from solver_api.types.repos import ( +from solverai.types.repos import ( Session, SessionStatus, SessionVisibility, Turn, SessionListResponse, - SessionPatchResponse, + SessionGetPatchResponse, ) ``` Methods: -- client.repos.sessions.create(repo, \*, provider, org, \*\*params) -> Session -- client.repos.sessions.list(repo, \*, provider, org, \*\*params) -> SessionListResponse -- client.repos.sessions.get(session_id, \*, provider, org, repo) -> Session -- client.repos.sessions.patch(session_id, \*, provider, org, repo, \*\*params) -> SessionPatchResponse -- client.repos.sessions.solve(session_id, \*, provider, org, repo, \*\*params) -> Turn +- client.repos.sessions.create(repo, \*, provider, org, \*\*params) -> Session +- client.repos.sessions.list(repo, \*, provider, org, \*\*params) -> SessionListResponse +- client.repos.sessions.get(session_id, \*, provider, org, repo) -> Session +- client.repos.sessions.get_patch(session_id, \*, provider, org, repo, \*\*params) -> SessionGetPatchResponse +- client.repos.sessions.solve(session_id, \*, provider, org, repo, \*\*params) -> Turn ### Status Types: ```python -from solver_api.types.repos.sessions import StatusStreamResponse +from solverai.types.repos.sessions import StatusStreamResponse ``` Methods: -- client.repos.sessions.status.stream(repo, \*, provider, org, \*\*params) -> StatusStreamResponse +- client.repos.sessions.status.stream(repo, \*, provider, org, \*\*params) -> StatusStreamResponse ### Turns Types: ```python -from solver_api.types.repos.sessions import TurnListResponse, TurnPatchResponse +from solverai.types.repos.sessions import TurnListResponse, TurnGetPatchResponse ``` Methods: -- client.repos.sessions.turns.list(session_id, \*, provider, org, repo) -> TurnListResponse -- client.repos.sessions.turns.cancel(turn_id, \*, provider, org, repo, session_id) -> Turn -- client.repos.sessions.turns.get(turn_id, \*, provider, org, repo, session_id) -> Turn -- client.repos.sessions.turns.patch(turn_id, \*, provider, org, repo, session_id) -> TurnPatchResponse +- client.repos.sessions.turns.list(session_id, \*, provider, org, repo) -> TurnListResponse +- client.repos.sessions.turns.cancel(turn_id, \*, provider, org, repo, session_id) -> Turn +- client.repos.sessions.turns.get(turn_id, \*, provider, org, repo, session_id) -> Turn +- client.repos.sessions.turns.get_patch(turn_id, \*, provider, org, repo, session_id) -> TurnGetPatchResponse #### Events Methods: -- client.repos.sessions.turns.events.stream(turn_id, \*, provider, org, repo, session_id) -> TraceEvent +- client.repos.sessions.turns.events.stream(turn_id, \*, provider, org, repo, session_id) -> TraceEvent ### Events Types: ```python -from solver_api.types.repos.sessions import TraceEvent, EventPatchResponse +from solverai.types.repos.sessions import TraceEvent, EventGetPatchResponse ``` Methods: -- client.repos.sessions.events.get(event_id, \*, provider, org, repo, session_id) -> TraceEvent -- client.repos.sessions.events.patch(event_id, \*, provider, org, repo, session_id, \*\*params) -> EventPatchResponse -- client.repos.sessions.events.stream(session_id, \*, provider, org, repo) -> TraceEvent +- client.repos.sessions.events.get(event_id, \*, provider, org, repo, session_id) -> TraceEvent +- client.repos.sessions.events.get_patch(event_id, \*, provider, org, repo, session_id, \*\*params) -> EventGetPatchResponse +- client.repos.sessions.events.stream(session_id, \*, provider, org, repo) -> TraceEvent diff --git a/bin/check-release-environment b/bin/check-release-environment new file mode 100644 index 0000000..fcc6e4b --- /dev/null +++ b/bin/check-release-environment @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +errors=() + +if [ -z "${PYPI_TOKEN}" ]; then + errors+=("The SOLVER_PYPI_TOKEN secret has not been set. Please set it in either this repository's secrets or your organization secrets.") +fi + +lenErrors=${#errors[@]} + +if [[ lenErrors -gt 0 ]]; then + echo -e "Found the following errors in the release environment:\n" + + for error in "${errors[@]}"; do + echo -e "- $error\n" + done + + exit 1 +fi + +echo "The environment is ready to push releases!" diff --git a/mypy.ini b/mypy.ini index a220603..9b613d5 100644 --- a/mypy.ini +++ b/mypy.ini @@ -8,7 +8,7 @@ show_error_codes = True # # We also exclude our `tests` as mypy doesn't always infer # types correctly and Pyright will still catch any type errors. -exclude = ^(src/solver_api/_files\.py|_dev/.*\.py|tests/.*)$ +exclude = ^(src/solverai/_files\.py|_dev/.*\.py|tests/.*)$ strict_equality = True implicit_reexport = True diff --git a/pyproject.toml b/pyproject.toml index e3beaf7..201032f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] -name = "solver_api" -version = "0.0.1-alpha.0" +name = "solverai" +version = "0.1.0-alpha.1" description = "The official Python library for the solver API" dynamic = ["readme"] license = "Apache-2.0" @@ -34,8 +34,8 @@ classifiers = [ ] [project.urls] -Homepage = "https://github.com/stainless-sdks/solver-api-python" -Repository = "https://github.com/stainless-sdks/solver-api-python" +Homepage = "https://github.com/Laredo-Labs/solverai-sdk-python" +Repository = "https://github.com/Laredo-Labs/solverai-sdk-python" [tool.rye] @@ -75,14 +75,14 @@ format = { chain = [ "check:ruff" = "ruff check ." "fix:ruff" = "ruff check --fix ." -"check:importable" = "python -c 'import solver_api'" +"check:importable" = "python -c 'import solverai'" typecheck = { chain = [ "typecheck:pyright", "typecheck:mypy" ]} "typecheck:pyright" = "pyright" -"typecheck:verify-types" = "pyright --verifytypes solver_api --ignoreexternal" +"typecheck:verify-types" = "pyright --verifytypes solverai --ignoreexternal" "typecheck:mypy" = "mypy ." [build-system] @@ -95,7 +95,7 @@ include = [ ] [tool.hatch.build.targets.wheel] -packages = ["src/solver_api"] +packages = ["src/solverai"] [tool.hatch.build.targets.sdist] # Basically everything except hidden files/directories (such as .github, .devcontainers, .python-version, etc) @@ -121,7 +121,7 @@ path = "README.md" [[tool.hatch.metadata.hooks.fancy-pypi-readme.substitutions]] # replace relative links with absolute links pattern = '\[(.+?)\]\(((?!https?://)\S+?)\)' -replacement = '[\1](https://github.com/stainless-sdks/solver-api-python/tree/main/\g<2>)' +replacement = '[\1](https://github.com/Laredo-Labs/solverai-sdk-python/tree/main/\g<2>)' [tool.pytest.ini_options] testpaths = ["tests"] @@ -198,7 +198,7 @@ length-sort = true length-sort-straight = true combine-as-imports = true extra-standard-library = ["typing_extensions"] -known-first-party = ["solver_api", "tests"] +known-first-party = ["solverai", "tests"] [tool.ruff.lint.per-file-ignores] "bin/**.py" = ["T201", "T203"] diff --git a/release-please-config.json b/release-please-config.json new file mode 100644 index 0000000..da0bd57 --- /dev/null +++ b/release-please-config.json @@ -0,0 +1,66 @@ +{ + "packages": { + ".": {} + }, + "$schema": "https://raw.githubusercontent.com/stainless-api/release-please/main/schemas/config.json", + "include-v-in-tag": true, + "include-component-in-tag": false, + "versioning": "prerelease", + "prerelease": true, + "bump-minor-pre-major": true, + "bump-patch-for-minor-pre-major": false, + "pull-request-header": "Automated Release PR", + "pull-request-title-pattern": "release: ${version}", + "changelog-sections": [ + { + "type": "feat", + "section": "Features" + }, + { + "type": "fix", + "section": "Bug Fixes" + }, + { + "type": "perf", + "section": "Performance Improvements" + }, + { + "type": "revert", + "section": "Reverts" + }, + { + "type": "chore", + "section": "Chores" + }, + { + "type": "docs", + "section": "Documentation" + }, + { + "type": "style", + "section": "Styles" + }, + { + "type": "refactor", + "section": "Refactors" + }, + { + "type": "test", + "section": "Tests", + "hidden": true + }, + { + "type": "build", + "section": "Build System" + }, + { + "type": "ci", + "section": "Continuous Integration", + "hidden": true + } + ], + "release-type": "python", + "extra-files": [ + "src/solverai/_version.py" + ] +} \ No newline at end of file diff --git a/requirements-dev.lock b/requirements-dev.lock index 7b02a9c..ec242be 100644 --- a/requirements-dev.lock +++ b/requirements-dev.lock @@ -14,7 +14,7 @@ annotated-types==0.6.0 # via pydantic anyio==4.4.0 # via httpx - # via solver-api + # via solverai argcomplete==3.1.2 # via nox certifi==2023.7.22 @@ -26,7 +26,7 @@ dirty-equals==0.6.0 distlib==0.3.7 # via virtualenv distro==1.8.0 - # via solver-api + # via solverai exceptiongroup==1.2.2 # via anyio # via pytest @@ -38,7 +38,7 @@ httpcore==1.0.2 # via httpx httpx==0.28.1 # via respx - # via solver-api + # via solverai idna==3.4 # via anyio # via httpx @@ -64,7 +64,7 @@ platformdirs==3.11.0 pluggy==1.5.0 # via pytest pydantic==2.10.3 - # via solver-api + # via solverai pydantic-core==2.27.1 # via pydantic pygments==2.18.0 @@ -86,7 +86,7 @@ six==1.16.0 # via python-dateutil sniffio==1.3.0 # via anyio - # via solver-api + # via solverai time-machine==2.9.0 tomli==2.0.2 # via mypy @@ -97,7 +97,7 @@ typing-extensions==4.12.2 # via pydantic # via pydantic-core # via pyright - # via solver-api + # via solverai virtualenv==20.24.5 # via nox zipp==3.17.0 diff --git a/requirements.lock b/requirements.lock index c5d0682..7f1992d 100644 --- a/requirements.lock +++ b/requirements.lock @@ -14,12 +14,12 @@ annotated-types==0.6.0 # via pydantic anyio==4.4.0 # via httpx - # via solver-api + # via solverai certifi==2023.7.22 # via httpcore # via httpx distro==1.8.0 - # via solver-api + # via solverai exceptiongroup==1.2.2 # via anyio h11==0.14.0 @@ -27,19 +27,19 @@ h11==0.14.0 httpcore==1.0.2 # via httpx httpx==0.28.1 - # via solver-api + # via solverai idna==3.4 # via anyio # via httpx pydantic==2.10.3 - # via solver-api + # via solverai pydantic-core==2.27.1 # via pydantic sniffio==1.3.0 # via anyio - # via solver-api + # via solverai typing-extensions==4.12.2 # via anyio # via pydantic # via pydantic-core - # via solver-api + # via solverai diff --git a/scripts/lint b/scripts/lint index 054b596..5840d96 100755 --- a/scripts/lint +++ b/scripts/lint @@ -8,4 +8,4 @@ echo "==> Running lints" rye run lint echo "==> Making sure it imports" -rye run python -c 'import solver_api' +rye run python -c 'import solverai' diff --git a/src/solver_api/__init__.py b/src/solverai/__init__.py similarity index 94% rename from src/solver_api/__init__.py rename to src/solverai/__init__.py index c53b9dd..55f1a93 100644 --- a/src/solver_api/__init__.py +++ b/src/solverai/__init__.py @@ -73,12 +73,12 @@ # Update the __module__ attribute for exported symbols so that # error messages point to this module instead of the module # it was originally defined in, e.g. -# solver_api._exceptions.NotFoundError -> solver_api.NotFoundError +# solverai._exceptions.NotFoundError -> solverai.NotFoundError __locals = locals() for __name in __all__: if not __name.startswith("__"): try: - __locals[__name].__module__ = "solver_api" + __locals[__name].__module__ = "solverai" except (TypeError, AttributeError): # Some of our exported symbols are builtins which we can't set attributes for. pass diff --git a/src/solver_api/_base_client.py b/src/solverai/_base_client.py similarity index 99% rename from src/solver_api/_base_client.py rename to src/solverai/_base_client.py index fc9e5e6..41f73c1 100644 --- a/src/solver_api/_base_client.py +++ b/src/solverai/_base_client.py @@ -389,7 +389,7 @@ def __init__( if max_retries is None: # pyright: ignore[reportUnnecessaryComparison] raise TypeError( - "max_retries cannot be None. If you want to disable retries, pass `0`; if you want unlimited retries, pass `math.inf` or a very high number; if you want the default behavior, pass `solver_api.DEFAULT_MAX_RETRIES`" + "max_retries cannot be None. If you want to disable retries, pass `0`; if you want unlimited retries, pass `math.inf` or a very high number; if you want the default behavior, pass `solverai.DEFAULT_MAX_RETRIES`" ) def _enforce_trailing_slash(self, url: URL) -> URL: diff --git a/src/solver_api/_client.py b/src/solverai/_client.py similarity index 99% rename from src/solver_api/_client.py rename to src/solverai/_client.py index 2e154b3..1403c60 100644 --- a/src/solver_api/_client.py +++ b/src/solverai/_client.py @@ -79,7 +79,7 @@ def __init__( if base_url is None: base_url = os.environ.get("SOLVER_BASE_URL") if base_url is None: - base_url = f"https://api.eng.laredolabs.com/alpha/" + base_url = f"https://api.solverai.com" super().__init__( version=__version__, @@ -247,7 +247,7 @@ def __init__( if base_url is None: base_url = os.environ.get("SOLVER_BASE_URL") if base_url is None: - base_url = f"https://api.eng.laredolabs.com/alpha/" + base_url = f"https://api.solverai.com" super().__init__( version=__version__, diff --git a/src/solver_api/_compat.py b/src/solverai/_compat.py similarity index 100% rename from src/solver_api/_compat.py rename to src/solverai/_compat.py diff --git a/src/solver_api/_constants.py b/src/solverai/_constants.py similarity index 100% rename from src/solver_api/_constants.py rename to src/solverai/_constants.py diff --git a/src/solver_api/_exceptions.py b/src/solverai/_exceptions.py similarity index 100% rename from src/solver_api/_exceptions.py rename to src/solverai/_exceptions.py diff --git a/src/solver_api/_files.py b/src/solverai/_files.py similarity index 100% rename from src/solver_api/_files.py rename to src/solverai/_files.py diff --git a/src/solver_api/_models.py b/src/solverai/_models.py similarity index 100% rename from src/solver_api/_models.py rename to src/solverai/_models.py diff --git a/src/solver_api/_qs.py b/src/solverai/_qs.py similarity index 100% rename from src/solver_api/_qs.py rename to src/solverai/_qs.py diff --git a/src/solver_api/_resource.py b/src/solverai/_resource.py similarity index 100% rename from src/solver_api/_resource.py rename to src/solverai/_resource.py diff --git a/src/solver_api/_response.py b/src/solverai/_response.py similarity index 98% rename from src/solver_api/_response.py rename to src/solverai/_response.py index a791860..4db90b8 100644 --- a/src/solver_api/_response.py +++ b/src/solverai/_response.py @@ -217,9 +217,7 @@ def _parse(self, *, to: type[_T] | None = None) -> R | _T: and not issubclass(origin, BaseModel) and issubclass(origin, pydantic.BaseModel) ): - raise TypeError( - "Pydantic models must subclass our base model type, e.g. `from solver_api import BaseModel`" - ) + raise TypeError("Pydantic models must subclass our base model type, e.g. `from solverai import BaseModel`") if ( cast_to is not object @@ -235,7 +233,7 @@ def _parse(self, *, to: type[_T] | None = None) -> R | _T: # split is required to handle cases where additional information is included # in the response, e.g. application/json; charset=utf-8 content_type, *_ = response.headers.get("content-type", "*").split(";") - if content_type != "application/json": + if not content_type.endswith("json"): if is_basemodel(cast_to): try: data = response.json() @@ -285,7 +283,7 @@ def parse(self, *, to: type[_T] | None = None) -> R | _T: the `to` argument, e.g. ```py - from solver_api import BaseModel + from solverai import BaseModel class MyModel(BaseModel): @@ -387,7 +385,7 @@ async def parse(self, *, to: type[_T] | None = None) -> R | _T: the `to` argument, e.g. ```py - from solver_api import BaseModel + from solverai import BaseModel class MyModel(BaseModel): @@ -558,7 +556,7 @@ async def stream_to_file( class MissingStreamClassError(TypeError): def __init__(self) -> None: super().__init__( - "The `stream` argument was set to `True` but the `stream_cls` argument was not given. See `solver_api._streaming` for reference", + "The `stream` argument was set to `True` but the `stream_cls` argument was not given. See `solverai._streaming` for reference", ) diff --git a/src/solver_api/_streaming.py b/src/solverai/_streaming.py similarity index 100% rename from src/solver_api/_streaming.py rename to src/solverai/_streaming.py diff --git a/src/solver_api/_types.py b/src/solverai/_types.py similarity index 99% rename from src/solver_api/_types.py rename to src/solverai/_types.py index 6e9bf43..98a5e3a 100644 --- a/src/solver_api/_types.py +++ b/src/solverai/_types.py @@ -81,7 +81,7 @@ # This unfortunately means that you will either have # to import this type and pass it explicitly: # -# from solver_api import NoneType +# from solverai import NoneType # client.get('/foo', cast_to=NoneType) # # or build it yourself: diff --git a/src/solver_api/_utils/__init__.py b/src/solverai/_utils/__init__.py similarity index 100% rename from src/solver_api/_utils/__init__.py rename to src/solverai/_utils/__init__.py diff --git a/src/solver_api/_utils/_logs.py b/src/solverai/_utils/_logs.py similarity index 76% rename from src/solver_api/_utils/_logs.py rename to src/solverai/_utils/_logs.py index ee0f93e..06defa4 100644 --- a/src/solver_api/_utils/_logs.py +++ b/src/solverai/_utils/_logs.py @@ -1,12 +1,12 @@ import os import logging -logger: logging.Logger = logging.getLogger("solver_api") +logger: logging.Logger = logging.getLogger("solverai") httpx_logger: logging.Logger = logging.getLogger("httpx") def _basic_config() -> None: - # e.g. [2023-10-05 14:12:26 - solver_api._base_client:818 - DEBUG] HTTP Request: POST http://127.0.0.1:4010/foo/bar "200 OK" + # e.g. [2023-10-05 14:12:26 - solverai._base_client:818 - DEBUG] HTTP Request: POST http://127.0.0.1:4010/foo/bar "200 OK" logging.basicConfig( format="[%(asctime)s - %(name)s:%(lineno)d - %(levelname)s] %(message)s", datefmt="%Y-%m-%d %H:%M:%S", diff --git a/src/solver_api/_utils/_proxy.py b/src/solverai/_utils/_proxy.py similarity index 100% rename from src/solver_api/_utils/_proxy.py rename to src/solverai/_utils/_proxy.py diff --git a/src/solver_api/_utils/_reflection.py b/src/solverai/_utils/_reflection.py similarity index 100% rename from src/solver_api/_utils/_reflection.py rename to src/solverai/_utils/_reflection.py diff --git a/src/solver_api/_utils/_streams.py b/src/solverai/_utils/_streams.py similarity index 100% rename from src/solver_api/_utils/_streams.py rename to src/solverai/_utils/_streams.py diff --git a/src/solver_api/_utils/_sync.py b/src/solverai/_utils/_sync.py similarity index 100% rename from src/solver_api/_utils/_sync.py rename to src/solverai/_utils/_sync.py diff --git a/src/solver_api/_utils/_transform.py b/src/solverai/_utils/_transform.py similarity index 100% rename from src/solver_api/_utils/_transform.py rename to src/solverai/_utils/_transform.py diff --git a/src/solver_api/_utils/_typing.py b/src/solverai/_utils/_typing.py similarity index 100% rename from src/solver_api/_utils/_typing.py rename to src/solverai/_utils/_typing.py diff --git a/src/solver_api/_utils/_utils.py b/src/solverai/_utils/_utils.py similarity index 100% rename from src/solver_api/_utils/_utils.py rename to src/solverai/_utils/_utils.py diff --git a/src/solver_api/_version.py b/src/solverai/_version.py similarity index 51% rename from src/solver_api/_version.py rename to src/solverai/_version.py index 7ac8377..29eb443 100644 --- a/src/solver_api/_version.py +++ b/src/solverai/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -__title__ = "solver_api" -__version__ = "0.0.1-alpha.0" +__title__ = "solverai" +__version__ = "0.1.0-alpha.1" # x-release-please-version diff --git a/src/solverai/lib/.keep b/src/solverai/lib/.keep new file mode 100644 index 0000000..5e2c99f --- /dev/null +++ b/src/solverai/lib/.keep @@ -0,0 +1,4 @@ +File generated from our OpenAPI spec by Stainless. + +This directory can be used to store custom files to expand the SDK. +It is ignored by Stainless code generation and its content (other than this keep file) won't be touched. \ No newline at end of file diff --git a/src/solver_api/py.typed b/src/solverai/py.typed similarity index 100% rename from src/solver_api/py.typed rename to src/solverai/py.typed diff --git a/src/solver_api/resources/__init__.py b/src/solverai/resources/__init__.py similarity index 100% rename from src/solver_api/resources/__init__.py rename to src/solverai/resources/__init__.py diff --git a/src/solver_api/resources/repos/__init__.py b/src/solverai/resources/repos/__init__.py similarity index 100% rename from src/solver_api/resources/repos/__init__.py rename to src/solverai/resources/repos/__init__.py diff --git a/src/solver_api/resources/repos/repos.py b/src/solverai/resources/repos/repos.py similarity index 91% rename from src/solver_api/resources/repos/repos.py rename to src/solverai/resources/repos/repos.py index 491263f..ac0dd75 100644 --- a/src/solver_api/resources/repos/repos.py +++ b/src/solverai/resources/repos/repos.py @@ -40,7 +40,7 @@ def with_raw_response(self) -> ReposResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/solver-api-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/Laredo-Labs/solverai-sdk-python#accessing-raw-response-data-eg-headers """ return ReposResourceWithRawResponse(self) @@ -49,7 +49,7 @@ def with_streaming_response(self) -> ReposResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/solver-api-python#with_streaming_response + For more information, see https://www.github.com/Laredo-Labs/solverai-sdk-python#with_streaming_response """ return ReposResourceWithStreamingResponse(self) @@ -77,7 +77,7 @@ def list( if not provider: raise ValueError(f"Expected a non-empty value for `provider` but received {provider!r}") return self._get( - f"/repos/{provider}", + f"/alpha/repos/{provider}", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -96,7 +96,7 @@ def with_raw_response(self) -> AsyncReposResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/solver-api-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/Laredo-Labs/solverai-sdk-python#accessing-raw-response-data-eg-headers """ return AsyncReposResourceWithRawResponse(self) @@ -105,7 +105,7 @@ def with_streaming_response(self) -> AsyncReposResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/solver-api-python#with_streaming_response + For more information, see https://www.github.com/Laredo-Labs/solverai-sdk-python#with_streaming_response """ return AsyncReposResourceWithStreamingResponse(self) @@ -133,7 +133,7 @@ async def list( if not provider: raise ValueError(f"Expected a non-empty value for `provider` but received {provider!r}") return await self._get( - f"/repos/{provider}", + f"/alpha/repos/{provider}", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/solver_api/resources/repos/sessions/__init__.py b/src/solverai/resources/repos/sessions/__init__.py similarity index 100% rename from src/solver_api/resources/repos/sessions/__init__.py rename to src/solverai/resources/repos/sessions/__init__.py diff --git a/src/solver_api/resources/repos/sessions/events.py b/src/solverai/resources/repos/sessions/events.py similarity index 88% rename from src/solver_api/resources/repos/sessions/events.py rename to src/solverai/resources/repos/sessions/events.py index 73b1ec1..f9ae1d4 100644 --- a/src/solver_api/resources/repos/sessions/events.py +++ b/src/solverai/resources/repos/sessions/events.py @@ -18,9 +18,9 @@ from ...._streaming import Stream, AsyncStream from ...._base_client import make_request_options from ....types.vcs_provider import VcsProvider -from ....types.repos.sessions import event_patch_params +from ....types.repos.sessions import event_get_patch_params from ....types.repos.sessions.trace_event import TraceEvent -from ....types.repos.sessions.event_patch_response import EventPatchResponse +from ....types.repos.sessions.event_get_patch_response import EventGetPatchResponse __all__ = ["EventsResource", "AsyncEventsResource"] @@ -32,7 +32,7 @@ def with_raw_response(self) -> EventsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/solver-api-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/Laredo-Labs/solverai-sdk-python#accessing-raw-response-data-eg-headers """ return EventsResourceWithRawResponse(self) @@ -41,7 +41,7 @@ def with_streaming_response(self) -> EventsResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/solver-api-python#with_streaming_response + For more information, see https://www.github.com/Laredo-Labs/solverai-sdk-python#with_streaming_response """ return EventsResourceWithStreamingResponse(self) @@ -81,14 +81,14 @@ def get( if not event_id: raise ValueError(f"Expected a non-empty value for `event_id` but received {event_id!r}") return self._get( - f"/repos/{provider}/{org}/{repo}/sessions/{session_id}/events/{event_id}", + f"/alpha/repos/{provider}/{org}/{repo}/sessions/{session_id}/events/{event_id}", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), cast_to=TraceEvent, ) - def patch( + def get_patch( self, event_id: str, *, @@ -104,7 +104,7 @@ def patch( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, - ) -> EventPatchResponse: + ) -> EventGetPatchResponse: """ Args: extra_headers: Send extra headers @@ -126,7 +126,7 @@ def patch( if not event_id: raise ValueError(f"Expected a non-empty value for `event_id` but received {event_id!r}") return self._get( - f"/repos/{provider}/{org}/{repo}/sessions/{session_id}/events/{event_id}/patch", + f"/alpha/repos/{provider}/{org}/{repo}/sessions/{session_id}/events/{event_id}/patch", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -137,10 +137,10 @@ def patch( "context_lines": context_lines, "interhunk_lines": interhunk_lines, }, - event_patch_params.EventPatchParams, + event_get_patch_params.EventGetPatchParams, ), ), - cast_to=EventPatchResponse, + cast_to=EventGetPatchResponse, ) def stream( @@ -177,7 +177,7 @@ def stream( raise ValueError(f"Expected a non-empty value for `session_id` but received {session_id!r}") extra_headers = {"Accept": "text/event-stream", **(extra_headers or {})} return self._get( - f"/repos/{provider}/{org}/{repo}/sessions/{session_id}/events/stream", + f"/alpha/repos/{provider}/{org}/{repo}/sessions/{session_id}/events/stream", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -194,7 +194,7 @@ def with_raw_response(self) -> AsyncEventsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/solver-api-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/Laredo-Labs/solverai-sdk-python#accessing-raw-response-data-eg-headers """ return AsyncEventsResourceWithRawResponse(self) @@ -203,7 +203,7 @@ def with_streaming_response(self) -> AsyncEventsResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/solver-api-python#with_streaming_response + For more information, see https://www.github.com/Laredo-Labs/solverai-sdk-python#with_streaming_response """ return AsyncEventsResourceWithStreamingResponse(self) @@ -243,14 +243,14 @@ async def get( if not event_id: raise ValueError(f"Expected a non-empty value for `event_id` but received {event_id!r}") return await self._get( - f"/repos/{provider}/{org}/{repo}/sessions/{session_id}/events/{event_id}", + f"/alpha/repos/{provider}/{org}/{repo}/sessions/{session_id}/events/{event_id}", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), cast_to=TraceEvent, ) - async def patch( + async def get_patch( self, event_id: str, *, @@ -266,7 +266,7 @@ async def patch( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, - ) -> EventPatchResponse: + ) -> EventGetPatchResponse: """ Args: extra_headers: Send extra headers @@ -288,7 +288,7 @@ async def patch( if not event_id: raise ValueError(f"Expected a non-empty value for `event_id` but received {event_id!r}") return await self._get( - f"/repos/{provider}/{org}/{repo}/sessions/{session_id}/events/{event_id}/patch", + f"/alpha/repos/{provider}/{org}/{repo}/sessions/{session_id}/events/{event_id}/patch", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -299,10 +299,10 @@ async def patch( "context_lines": context_lines, "interhunk_lines": interhunk_lines, }, - event_patch_params.EventPatchParams, + event_get_patch_params.EventGetPatchParams, ), ), - cast_to=EventPatchResponse, + cast_to=EventGetPatchResponse, ) async def stream( @@ -339,7 +339,7 @@ async def stream( raise ValueError(f"Expected a non-empty value for `session_id` but received {session_id!r}") extra_headers = {"Accept": "text/event-stream", **(extra_headers or {})} return await self._get( - f"/repos/{provider}/{org}/{repo}/sessions/{session_id}/events/stream", + f"/alpha/repos/{provider}/{org}/{repo}/sessions/{session_id}/events/stream", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -356,8 +356,8 @@ def __init__(self, events: EventsResource) -> None: self.get = to_raw_response_wrapper( events.get, ) - self.patch = to_raw_response_wrapper( - events.patch, + self.get_patch = to_raw_response_wrapper( + events.get_patch, ) self.stream = to_raw_response_wrapper( events.stream, @@ -371,8 +371,8 @@ def __init__(self, events: AsyncEventsResource) -> None: self.get = async_to_raw_response_wrapper( events.get, ) - self.patch = async_to_raw_response_wrapper( - events.patch, + self.get_patch = async_to_raw_response_wrapper( + events.get_patch, ) self.stream = async_to_raw_response_wrapper( events.stream, @@ -386,8 +386,8 @@ def __init__(self, events: EventsResource) -> None: self.get = to_streamed_response_wrapper( events.get, ) - self.patch = to_streamed_response_wrapper( - events.patch, + self.get_patch = to_streamed_response_wrapper( + events.get_patch, ) self.stream = to_streamed_response_wrapper( events.stream, @@ -401,8 +401,8 @@ def __init__(self, events: AsyncEventsResource) -> None: self.get = async_to_streamed_response_wrapper( events.get, ) - self.patch = async_to_streamed_response_wrapper( - events.patch, + self.get_patch = async_to_streamed_response_wrapper( + events.get_patch, ) self.stream = async_to_streamed_response_wrapper( events.stream, diff --git a/src/solver_api/resources/repos/sessions/sessions.py b/src/solverai/resources/repos/sessions/sessions.py similarity index 93% rename from src/solver_api/resources/repos/sessions/sessions.py rename to src/solverai/resources/repos/sessions/sessions.py index cb37dfe..976942c 100644 --- a/src/solver_api/resources/repos/sessions/sessions.py +++ b/src/solverai/resources/repos/sessions/sessions.py @@ -45,9 +45,9 @@ from ....types.repos import ( SessionVisibility, session_list_params, - session_patch_params, session_solve_params, session_create_params, + session_get_patch_params, ) from ...._base_client import make_request_options from ....types.repos.turn import Turn @@ -56,7 +56,7 @@ from ....types.repos.session_status import SessionStatus from ....types.repos.session_visibility import SessionVisibility from ....types.repos.session_list_response import SessionListResponse -from ....types.repos.session_patch_response import SessionPatchResponse +from ....types.repos.session_get_patch_response import SessionGetPatchResponse __all__ = ["SessionsResource", "AsyncSessionsResource"] @@ -80,7 +80,7 @@ def with_raw_response(self) -> SessionsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/solver-api-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/Laredo-Labs/solverai-sdk-python#accessing-raw-response-data-eg-headers """ return SessionsResourceWithRawResponse(self) @@ -89,7 +89,7 @@ def with_streaming_response(self) -> SessionsResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/solver-api-python#with_streaming_response + For more information, see https://www.github.com/Laredo-Labs/solverai-sdk-python#with_streaming_response """ return SessionsResourceWithStreamingResponse(self) @@ -127,7 +127,7 @@ def create( if not repo: raise ValueError(f"Expected a non-empty value for `repo` but received {repo!r}") return self._post( - f"/repos/{provider}/{org}/{repo}/sessions", + f"/alpha/repos/{provider}/{org}/{repo}/sessions", body=maybe_transform( { "user_branch_name": user_branch_name, @@ -180,7 +180,7 @@ def list( if not repo: raise ValueError(f"Expected a non-empty value for `repo` but received {repo!r}") return self._get( - f"/repos/{provider}/{org}/{repo}/sessions", + f"/alpha/repos/{provider}/{org}/{repo}/sessions", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -235,14 +235,14 @@ def get( if not session_id: raise ValueError(f"Expected a non-empty value for `session_id` but received {session_id!r}") return self._get( - f"/repos/{provider}/{org}/{repo}/sessions/{session_id}", + f"/alpha/repos/{provider}/{org}/{repo}/sessions/{session_id}", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), cast_to=Session, ) - def patch( + def get_patch( self, session_id: str, *, @@ -257,7 +257,7 @@ def patch( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, - ) -> SessionPatchResponse: + ) -> SessionGetPatchResponse: """ Args: extra_headers: Send extra headers @@ -277,7 +277,7 @@ def patch( if not session_id: raise ValueError(f"Expected a non-empty value for `session_id` but received {session_id!r}") return self._get( - f"/repos/{provider}/{org}/{repo}/sessions/{session_id}/patch", + f"/alpha/repos/{provider}/{org}/{repo}/sessions/{session_id}/patch", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -288,10 +288,10 @@ def patch( "context_lines": context_lines, "interhunk_lines": interhunk_lines, }, - session_patch_params.SessionPatchParams, + session_get_patch_params.SessionGetPatchParams, ), ), - cast_to=SessionPatchResponse, + cast_to=SessionGetPatchResponse, ) def solve( @@ -332,7 +332,7 @@ def solve( if not session_id: raise ValueError(f"Expected a non-empty value for `session_id` but received {session_id!r}") return self._post( - f"/repos/{provider}/{org}/{repo}/sessions/{session_id}/solve", + f"/alpha/repos/{provider}/{org}/{repo}/sessions/{session_id}/solve", body=maybe_transform( { "instruction": instruction, @@ -367,7 +367,7 @@ def with_raw_response(self) -> AsyncSessionsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/solver-api-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/Laredo-Labs/solverai-sdk-python#accessing-raw-response-data-eg-headers """ return AsyncSessionsResourceWithRawResponse(self) @@ -376,7 +376,7 @@ def with_streaming_response(self) -> AsyncSessionsResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/solver-api-python#with_streaming_response + For more information, see https://www.github.com/Laredo-Labs/solverai-sdk-python#with_streaming_response """ return AsyncSessionsResourceWithStreamingResponse(self) @@ -414,7 +414,7 @@ async def create( if not repo: raise ValueError(f"Expected a non-empty value for `repo` but received {repo!r}") return await self._post( - f"/repos/{provider}/{org}/{repo}/sessions", + f"/alpha/repos/{provider}/{org}/{repo}/sessions", body=await async_maybe_transform( { "user_branch_name": user_branch_name, @@ -467,7 +467,7 @@ async def list( if not repo: raise ValueError(f"Expected a non-empty value for `repo` but received {repo!r}") return await self._get( - f"/repos/{provider}/{org}/{repo}/sessions", + f"/alpha/repos/{provider}/{org}/{repo}/sessions", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -522,14 +522,14 @@ async def get( if not session_id: raise ValueError(f"Expected a non-empty value for `session_id` but received {session_id!r}") return await self._get( - f"/repos/{provider}/{org}/{repo}/sessions/{session_id}", + f"/alpha/repos/{provider}/{org}/{repo}/sessions/{session_id}", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), cast_to=Session, ) - async def patch( + async def get_patch( self, session_id: str, *, @@ -544,7 +544,7 @@ async def patch( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, - ) -> SessionPatchResponse: + ) -> SessionGetPatchResponse: """ Args: extra_headers: Send extra headers @@ -564,7 +564,7 @@ async def patch( if not session_id: raise ValueError(f"Expected a non-empty value for `session_id` but received {session_id!r}") return await self._get( - f"/repos/{provider}/{org}/{repo}/sessions/{session_id}/patch", + f"/alpha/repos/{provider}/{org}/{repo}/sessions/{session_id}/patch", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -575,10 +575,10 @@ async def patch( "context_lines": context_lines, "interhunk_lines": interhunk_lines, }, - session_patch_params.SessionPatchParams, + session_get_patch_params.SessionGetPatchParams, ), ), - cast_to=SessionPatchResponse, + cast_to=SessionGetPatchResponse, ) async def solve( @@ -619,7 +619,7 @@ async def solve( if not session_id: raise ValueError(f"Expected a non-empty value for `session_id` but received {session_id!r}") return await self._post( - f"/repos/{provider}/{org}/{repo}/sessions/{session_id}/solve", + f"/alpha/repos/{provider}/{org}/{repo}/sessions/{session_id}/solve", body=await async_maybe_transform( { "instruction": instruction, @@ -648,8 +648,8 @@ def __init__(self, sessions: SessionsResource) -> None: self.get = to_raw_response_wrapper( sessions.get, ) - self.patch = to_raw_response_wrapper( - sessions.patch, + self.get_patch = to_raw_response_wrapper( + sessions.get_patch, ) self.solve = to_raw_response_wrapper( sessions.solve, @@ -681,8 +681,8 @@ def __init__(self, sessions: AsyncSessionsResource) -> None: self.get = async_to_raw_response_wrapper( sessions.get, ) - self.patch = async_to_raw_response_wrapper( - sessions.patch, + self.get_patch = async_to_raw_response_wrapper( + sessions.get_patch, ) self.solve = async_to_raw_response_wrapper( sessions.solve, @@ -714,8 +714,8 @@ def __init__(self, sessions: SessionsResource) -> None: self.get = to_streamed_response_wrapper( sessions.get, ) - self.patch = to_streamed_response_wrapper( - sessions.patch, + self.get_patch = to_streamed_response_wrapper( + sessions.get_patch, ) self.solve = to_streamed_response_wrapper( sessions.solve, @@ -747,8 +747,8 @@ def __init__(self, sessions: AsyncSessionsResource) -> None: self.get = async_to_streamed_response_wrapper( sessions.get, ) - self.patch = async_to_streamed_response_wrapper( - sessions.patch, + self.get_patch = async_to_streamed_response_wrapper( + sessions.get_patch, ) self.solve = async_to_streamed_response_wrapper( sessions.solve, diff --git a/src/solver_api/resources/repos/sessions/status.py b/src/solverai/resources/repos/sessions/status.py similarity index 91% rename from src/solver_api/resources/repos/sessions/status.py rename to src/solverai/resources/repos/sessions/status.py index 436baa5..7bde89f 100644 --- a/src/solver_api/resources/repos/sessions/status.py +++ b/src/solverai/resources/repos/sessions/status.py @@ -33,7 +33,7 @@ def with_raw_response(self) -> StatusResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/solver-api-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/Laredo-Labs/solverai-sdk-python#accessing-raw-response-data-eg-headers """ return StatusResourceWithRawResponse(self) @@ -42,7 +42,7 @@ def with_streaming_response(self) -> StatusResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/solver-api-python#with_streaming_response + For more information, see https://www.github.com/Laredo-Labs/solverai-sdk-python#with_streaming_response """ return StatusResourceWithStreamingResponse(self) @@ -80,7 +80,7 @@ def stream( raise ValueError(f"Expected a non-empty value for `repo` but received {repo!r}") extra_headers = {"Accept": "text/event-stream", **(extra_headers or {})} return self._get( - f"/repos/{provider}/{org}/{repo}/sessions/status/stream", + f"/alpha/repos/{provider}/{org}/{repo}/sessions/status/stream", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -101,7 +101,7 @@ def with_raw_response(self) -> AsyncStatusResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/solver-api-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/Laredo-Labs/solverai-sdk-python#accessing-raw-response-data-eg-headers """ return AsyncStatusResourceWithRawResponse(self) @@ -110,7 +110,7 @@ def with_streaming_response(self) -> AsyncStatusResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/solver-api-python#with_streaming_response + For more information, see https://www.github.com/Laredo-Labs/solverai-sdk-python#with_streaming_response """ return AsyncStatusResourceWithStreamingResponse(self) @@ -148,7 +148,7 @@ async def stream( raise ValueError(f"Expected a non-empty value for `repo` but received {repo!r}") extra_headers = {"Accept": "text/event-stream", **(extra_headers or {})} return await self._get( - f"/repos/{provider}/{org}/{repo}/sessions/status/stream", + f"/alpha/repos/{provider}/{org}/{repo}/sessions/status/stream", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, diff --git a/src/solver_api/resources/repos/sessions/turns/__init__.py b/src/solverai/resources/repos/sessions/turns/__init__.py similarity index 100% rename from src/solver_api/resources/repos/sessions/turns/__init__.py rename to src/solverai/resources/repos/sessions/turns/__init__.py diff --git a/src/solver_api/resources/repos/sessions/turns/events.py b/src/solverai/resources/repos/sessions/turns/events.py similarity index 90% rename from src/solver_api/resources/repos/sessions/turns/events.py rename to src/solverai/resources/repos/sessions/turns/events.py index 91757cf..2e5dc6f 100644 --- a/src/solver_api/resources/repos/sessions/turns/events.py +++ b/src/solverai/resources/repos/sessions/turns/events.py @@ -29,7 +29,7 @@ def with_raw_response(self) -> EventsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/solver-api-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/Laredo-Labs/solverai-sdk-python#accessing-raw-response-data-eg-headers """ return EventsResourceWithRawResponse(self) @@ -38,7 +38,7 @@ def with_streaming_response(self) -> EventsResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/solver-api-python#with_streaming_response + For more information, see https://www.github.com/Laredo-Labs/solverai-sdk-python#with_streaming_response """ return EventsResourceWithStreamingResponse(self) @@ -79,7 +79,7 @@ def stream( raise ValueError(f"Expected a non-empty value for `turn_id` but received {turn_id!r}") extra_headers = {"Accept": "text/event-stream", **(extra_headers or {})} return self._get( - f"/repos/{provider}/{org}/{repo}/sessions/{session_id}/turns/{turn_id}/events/stream", + f"/alpha/repos/{provider}/{org}/{repo}/sessions/{session_id}/turns/{turn_id}/events/stream", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -96,7 +96,7 @@ def with_raw_response(self) -> AsyncEventsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/solver-api-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/Laredo-Labs/solverai-sdk-python#accessing-raw-response-data-eg-headers """ return AsyncEventsResourceWithRawResponse(self) @@ -105,7 +105,7 @@ def with_streaming_response(self) -> AsyncEventsResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/solver-api-python#with_streaming_response + For more information, see https://www.github.com/Laredo-Labs/solverai-sdk-python#with_streaming_response """ return AsyncEventsResourceWithStreamingResponse(self) @@ -146,7 +146,7 @@ async def stream( raise ValueError(f"Expected a non-empty value for `turn_id` but received {turn_id!r}") extra_headers = {"Accept": "text/event-stream", **(extra_headers or {})} return await self._get( - f"/repos/{provider}/{org}/{repo}/sessions/{session_id}/turns/{turn_id}/events/stream", + f"/alpha/repos/{provider}/{org}/{repo}/sessions/{session_id}/turns/{turn_id}/events/stream", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), diff --git a/src/solver_api/resources/repos/sessions/turns/turns.py b/src/solverai/resources/repos/sessions/turns/turns.py similarity index 90% rename from src/solver_api/resources/repos/sessions/turns/turns.py rename to src/solverai/resources/repos/sessions/turns/turns.py index ae986fc..1dc5dbf 100644 --- a/src/solver_api/resources/repos/sessions/turns/turns.py +++ b/src/solverai/resources/repos/sessions/turns/turns.py @@ -26,7 +26,7 @@ from .....types.repos.turn import Turn from .....types.vcs_provider import VcsProvider from .....types.repos.sessions.turn_list_response import TurnListResponse -from .....types.repos.sessions.turn_patch_response import TurnPatchResponse +from .....types.repos.sessions.turn_get_patch_response import TurnGetPatchResponse __all__ = ["TurnsResource", "AsyncTurnsResource"] @@ -42,7 +42,7 @@ def with_raw_response(self) -> TurnsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/solver-api-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/Laredo-Labs/solverai-sdk-python#accessing-raw-response-data-eg-headers """ return TurnsResourceWithRawResponse(self) @@ -51,7 +51,7 @@ def with_streaming_response(self) -> TurnsResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/solver-api-python#with_streaming_response + For more information, see https://www.github.com/Laredo-Labs/solverai-sdk-python#with_streaming_response """ return TurnsResourceWithStreamingResponse(self) @@ -88,7 +88,7 @@ def list( if not session_id: raise ValueError(f"Expected a non-empty value for `session_id` but received {session_id!r}") return self._get( - f"/repos/{provider}/{org}/{repo}/sessions/{session_id}/turns", + f"/alpha/repos/{provider}/{org}/{repo}/sessions/{session_id}/turns", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -131,7 +131,7 @@ def cancel( if not turn_id: raise ValueError(f"Expected a non-empty value for `turn_id` but received {turn_id!r}") return self._post( - f"/repos/{provider}/{org}/{repo}/sessions/{session_id}/turns/{turn_id}/cancel", + f"/alpha/repos/{provider}/{org}/{repo}/sessions/{session_id}/turns/{turn_id}/cancel", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -174,14 +174,14 @@ def get( if not turn_id: raise ValueError(f"Expected a non-empty value for `turn_id` but received {turn_id!r}") return self._get( - f"/repos/{provider}/{org}/{repo}/sessions/{session_id}/turns/{turn_id}", + f"/alpha/repos/{provider}/{org}/{repo}/sessions/{session_id}/turns/{turn_id}", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), cast_to=Turn, ) - def patch( + def get_patch( self, turn_id: str, *, @@ -195,7 +195,7 @@ def patch( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, - ) -> TurnPatchResponse: + ) -> TurnGetPatchResponse: """ Args: extra_headers: Send extra headers @@ -217,11 +217,11 @@ def patch( if not turn_id: raise ValueError(f"Expected a non-empty value for `turn_id` but received {turn_id!r}") return self._get( - f"/repos/{provider}/{org}/{repo}/sessions/{session_id}/turns/{turn_id}/patch", + f"/alpha/repos/{provider}/{org}/{repo}/sessions/{session_id}/turns/{turn_id}/patch", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), - cast_to=TurnPatchResponse, + cast_to=TurnGetPatchResponse, ) @@ -236,7 +236,7 @@ def with_raw_response(self) -> AsyncTurnsResourceWithRawResponse: This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. - For more information, see https://www.github.com/stainless-sdks/solver-api-python#accessing-raw-response-data-eg-headers + For more information, see https://www.github.com/Laredo-Labs/solverai-sdk-python#accessing-raw-response-data-eg-headers """ return AsyncTurnsResourceWithRawResponse(self) @@ -245,7 +245,7 @@ def with_streaming_response(self) -> AsyncTurnsResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. - For more information, see https://www.github.com/stainless-sdks/solver-api-python#with_streaming_response + For more information, see https://www.github.com/Laredo-Labs/solverai-sdk-python#with_streaming_response """ return AsyncTurnsResourceWithStreamingResponse(self) @@ -282,7 +282,7 @@ async def list( if not session_id: raise ValueError(f"Expected a non-empty value for `session_id` but received {session_id!r}") return await self._get( - f"/repos/{provider}/{org}/{repo}/sessions/{session_id}/turns", + f"/alpha/repos/{provider}/{org}/{repo}/sessions/{session_id}/turns", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -325,7 +325,7 @@ async def cancel( if not turn_id: raise ValueError(f"Expected a non-empty value for `turn_id` but received {turn_id!r}") return await self._post( - f"/repos/{provider}/{org}/{repo}/sessions/{session_id}/turns/{turn_id}/cancel", + f"/alpha/repos/{provider}/{org}/{repo}/sessions/{session_id}/turns/{turn_id}/cancel", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -368,14 +368,14 @@ async def get( if not turn_id: raise ValueError(f"Expected a non-empty value for `turn_id` but received {turn_id!r}") return await self._get( - f"/repos/{provider}/{org}/{repo}/sessions/{session_id}/turns/{turn_id}", + f"/alpha/repos/{provider}/{org}/{repo}/sessions/{session_id}/turns/{turn_id}", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), cast_to=Turn, ) - async def patch( + async def get_patch( self, turn_id: str, *, @@ -389,7 +389,7 @@ async def patch( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, - ) -> TurnPatchResponse: + ) -> TurnGetPatchResponse: """ Args: extra_headers: Send extra headers @@ -411,11 +411,11 @@ async def patch( if not turn_id: raise ValueError(f"Expected a non-empty value for `turn_id` but received {turn_id!r}") return await self._get( - f"/repos/{provider}/{org}/{repo}/sessions/{session_id}/turns/{turn_id}/patch", + f"/alpha/repos/{provider}/{org}/{repo}/sessions/{session_id}/turns/{turn_id}/patch", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), - cast_to=TurnPatchResponse, + cast_to=TurnGetPatchResponse, ) @@ -432,8 +432,8 @@ def __init__(self, turns: TurnsResource) -> None: self.get = to_raw_response_wrapper( turns.get, ) - self.patch = to_raw_response_wrapper( - turns.patch, + self.get_patch = to_raw_response_wrapper( + turns.get_patch, ) @cached_property @@ -454,8 +454,8 @@ def __init__(self, turns: AsyncTurnsResource) -> None: self.get = async_to_raw_response_wrapper( turns.get, ) - self.patch = async_to_raw_response_wrapper( - turns.patch, + self.get_patch = async_to_raw_response_wrapper( + turns.get_patch, ) @cached_property @@ -476,8 +476,8 @@ def __init__(self, turns: TurnsResource) -> None: self.get = to_streamed_response_wrapper( turns.get, ) - self.patch = to_streamed_response_wrapper( - turns.patch, + self.get_patch = to_streamed_response_wrapper( + turns.get_patch, ) @cached_property @@ -498,8 +498,8 @@ def __init__(self, turns: AsyncTurnsResource) -> None: self.get = async_to_streamed_response_wrapper( turns.get, ) - self.patch = async_to_streamed_response_wrapper( - turns.patch, + self.get_patch = async_to_streamed_response_wrapper( + turns.get_patch, ) @cached_property diff --git a/src/solver_api/types/__init__.py b/src/solverai/types/__init__.py similarity index 100% rename from src/solver_api/types/__init__.py rename to src/solverai/types/__init__.py diff --git a/src/solver_api/types/repo_list_response.py b/src/solverai/types/repo_list_response.py similarity index 100% rename from src/solver_api/types/repo_list_response.py rename to src/solverai/types/repo_list_response.py diff --git a/src/solver_api/types/repos/__init__.py b/src/solverai/types/repos/__init__.py similarity index 78% rename from src/solver_api/types/repos/__init__.py rename to src/solverai/types/repos/__init__.py index 98c2083..57e8177 100644 --- a/src/solver_api/types/repos/__init__.py +++ b/src/solverai/types/repos/__init__.py @@ -7,8 +7,8 @@ from .session_status import SessionStatus as SessionStatus from .session_visibility import SessionVisibility as SessionVisibility from .session_list_params import SessionListParams as SessionListParams -from .session_patch_params import SessionPatchParams as SessionPatchParams from .session_solve_params import SessionSolveParams as SessionSolveParams from .session_create_params import SessionCreateParams as SessionCreateParams from .session_list_response import SessionListResponse as SessionListResponse -from .session_patch_response import SessionPatchResponse as SessionPatchResponse +from .session_get_patch_params import SessionGetPatchParams as SessionGetPatchParams +from .session_get_patch_response import SessionGetPatchResponse as SessionGetPatchResponse diff --git a/src/solver_api/types/repos/session.py b/src/solverai/types/repos/session.py similarity index 100% rename from src/solver_api/types/repos/session.py rename to src/solverai/types/repos/session.py diff --git a/src/solver_api/types/repos/session_create_params.py b/src/solverai/types/repos/session_create_params.py similarity index 100% rename from src/solver_api/types/repos/session_create_params.py rename to src/solverai/types/repos/session_create_params.py diff --git a/src/solver_api/types/repos/session_patch_params.py b/src/solverai/types/repos/session_get_patch_params.py similarity index 84% rename from src/solver_api/types/repos/session_patch_params.py rename to src/solverai/types/repos/session_get_patch_params.py index 88bfa6a..a21de3c 100644 --- a/src/solver_api/types/repos/session_patch_params.py +++ b/src/solverai/types/repos/session_get_patch_params.py @@ -7,10 +7,10 @@ from ..._utils import PropertyInfo from ..vcs_provider import VcsProvider -__all__ = ["SessionPatchParams"] +__all__ = ["SessionGetPatchParams"] -class SessionPatchParams(TypedDict, total=False): +class SessionGetPatchParams(TypedDict, total=False): provider: Required[VcsProvider] org: Required[str] diff --git a/src/solver_api/types/repos/session_patch_response.py b/src/solverai/types/repos/session_get_patch_response.py similarity index 76% rename from src/solver_api/types/repos/session_patch_response.py rename to src/solverai/types/repos/session_get_patch_response.py index baa78be..6d50e5b 100644 --- a/src/solver_api/types/repos/session_patch_response.py +++ b/src/solverai/types/repos/session_get_patch_response.py @@ -6,8 +6,8 @@ from ..._models import BaseModel -__all__ = ["SessionPatchResponse"] +__all__ = ["SessionGetPatchResponse"] -class SessionPatchResponse(BaseModel): +class SessionGetPatchResponse(BaseModel): patch_set: Optional[str] = FieldInfo(alias="patchSet", default=None) diff --git a/src/solver_api/types/repos/session_list_params.py b/src/solverai/types/repos/session_list_params.py similarity index 100% rename from src/solver_api/types/repos/session_list_params.py rename to src/solverai/types/repos/session_list_params.py diff --git a/src/solver_api/types/repos/session_list_response.py b/src/solverai/types/repos/session_list_response.py similarity index 100% rename from src/solver_api/types/repos/session_list_response.py rename to src/solverai/types/repos/session_list_response.py diff --git a/src/solver_api/types/repos/session_solve_params.py b/src/solverai/types/repos/session_solve_params.py similarity index 100% rename from src/solver_api/types/repos/session_solve_params.py rename to src/solverai/types/repos/session_solve_params.py diff --git a/src/solver_api/types/repos/session_status.py b/src/solverai/types/repos/session_status.py similarity index 100% rename from src/solver_api/types/repos/session_status.py rename to src/solverai/types/repos/session_status.py diff --git a/src/solver_api/types/repos/session_visibility.py b/src/solverai/types/repos/session_visibility.py similarity index 100% rename from src/solver_api/types/repos/session_visibility.py rename to src/solverai/types/repos/session_visibility.py diff --git a/src/solver_api/types/repos/sessions/__init__.py b/src/solverai/types/repos/sessions/__init__.py similarity index 61% rename from src/solver_api/types/repos/sessions/__init__.py rename to src/solverai/types/repos/sessions/__init__.py index e104e82..5836f31 100644 --- a/src/solver_api/types/repos/sessions/__init__.py +++ b/src/solverai/types/repos/sessions/__init__.py @@ -3,9 +3,9 @@ from __future__ import annotations from .trace_event import TraceEvent as TraceEvent -from .event_patch_params import EventPatchParams as EventPatchParams from .turn_list_response import TurnListResponse as TurnListResponse -from .turn_patch_response import TurnPatchResponse as TurnPatchResponse -from .event_patch_response import EventPatchResponse as EventPatchResponse from .status_stream_params import StatusStreamParams as StatusStreamParams +from .event_get_patch_params import EventGetPatchParams as EventGetPatchParams from .status_stream_response import StatusStreamResponse as StatusStreamResponse +from .turn_get_patch_response import TurnGetPatchResponse as TurnGetPatchResponse +from .event_get_patch_response import EventGetPatchResponse as EventGetPatchResponse diff --git a/src/solver_api/types/repos/sessions/event_patch_params.py b/src/solverai/types/repos/sessions/event_get_patch_params.py similarity index 87% rename from src/solver_api/types/repos/sessions/event_patch_params.py rename to src/solverai/types/repos/sessions/event_get_patch_params.py index 3eca06e..b877ee4 100644 --- a/src/solver_api/types/repos/sessions/event_patch_params.py +++ b/src/solverai/types/repos/sessions/event_get_patch_params.py @@ -7,10 +7,10 @@ from ...._utils import PropertyInfo from ...vcs_provider import VcsProvider -__all__ = ["EventPatchParams"] +__all__ = ["EventGetPatchParams"] -class EventPatchParams(TypedDict, total=False): +class EventGetPatchParams(TypedDict, total=False): provider: Required[VcsProvider] org: Required[str] diff --git a/src/solver_api/types/repos/sessions/event_patch_response.py b/src/solverai/types/repos/sessions/event_get_patch_response.py similarity index 77% rename from src/solver_api/types/repos/sessions/event_patch_response.py rename to src/solverai/types/repos/sessions/event_get_patch_response.py index 3c3eb8a..f63fcbb 100644 --- a/src/solver_api/types/repos/sessions/event_patch_response.py +++ b/src/solverai/types/repos/sessions/event_get_patch_response.py @@ -6,8 +6,8 @@ from ...._models import BaseModel -__all__ = ["EventPatchResponse"] +__all__ = ["EventGetPatchResponse"] -class EventPatchResponse(BaseModel): +class EventGetPatchResponse(BaseModel): patch_set: Optional[str] = FieldInfo(alias="patchSet", default=None) diff --git a/src/solver_api/types/repos/sessions/status_stream_params.py b/src/solverai/types/repos/sessions/status_stream_params.py similarity index 100% rename from src/solver_api/types/repos/sessions/status_stream_params.py rename to src/solverai/types/repos/sessions/status_stream_params.py diff --git a/src/solver_api/types/repos/sessions/status_stream_response.py b/src/solverai/types/repos/sessions/status_stream_response.py similarity index 86% rename from src/solver_api/types/repos/sessions/status_stream_response.py rename to src/solverai/types/repos/sessions/status_stream_response.py index 3d89a5a..0ac6815 100644 --- a/src/solver_api/types/repos/sessions/status_stream_response.py +++ b/src/solverai/types/repos/sessions/status_stream_response.py @@ -12,7 +12,6 @@ class ChangeData(BaseModel): new_visibility: Optional[SessionVisibility] = None - """The new session visibility.""" class StatusStreamResponse(BaseModel): @@ -28,4 +27,3 @@ class StatusStreamResponse(BaseModel): """Additional data about the change. Only present for `visibility_changed` events.""" new_state: Optional[SessionStatus] = None - """The new status of the session. Only present for `state_transition` events.""" diff --git a/src/solver_api/types/repos/sessions/trace_event.py b/src/solverai/types/repos/sessions/trace_event.py similarity index 100% rename from src/solver_api/types/repos/sessions/trace_event.py rename to src/solverai/types/repos/sessions/trace_event.py diff --git a/src/solver_api/types/repos/sessions/turn_patch_response.py b/src/solverai/types/repos/sessions/turn_get_patch_response.py similarity index 78% rename from src/solver_api/types/repos/sessions/turn_patch_response.py rename to src/solverai/types/repos/sessions/turn_get_patch_response.py index c0742b7..5c13e95 100644 --- a/src/solver_api/types/repos/sessions/turn_patch_response.py +++ b/src/solverai/types/repos/sessions/turn_get_patch_response.py @@ -6,8 +6,8 @@ from ...._models import BaseModel -__all__ = ["TurnPatchResponse"] +__all__ = ["TurnGetPatchResponse"] -class TurnPatchResponse(BaseModel): +class TurnGetPatchResponse(BaseModel): patch_set: Optional[str] = FieldInfo(alias="patchSet", default=None) diff --git a/src/solver_api/types/repos/sessions/turn_list_response.py b/src/solverai/types/repos/sessions/turn_list_response.py similarity index 100% rename from src/solver_api/types/repos/sessions/turn_list_response.py rename to src/solverai/types/repos/sessions/turn_list_response.py diff --git a/src/solver_api/types/repos/sessions/turns/__init__.py b/src/solverai/types/repos/sessions/turns/__init__.py similarity index 100% rename from src/solver_api/types/repos/sessions/turns/__init__.py rename to src/solverai/types/repos/sessions/turns/__init__.py diff --git a/src/solver_api/types/repos/turn.py b/src/solverai/types/repos/turn.py similarity index 100% rename from src/solver_api/types/repos/turn.py rename to src/solverai/types/repos/turn.py diff --git a/src/solver_api/types/vcs_provider.py b/src/solverai/types/vcs_provider.py similarity index 100% rename from src/solver_api/types/vcs_provider.py rename to src/solverai/types/vcs_provider.py diff --git a/tests/api_resources/repos/sessions/test_events.py b/tests/api_resources/repos/sessions/test_events.py index 027a7e4..22888f5 100644 --- a/tests/api_resources/repos/sessions/test_events.py +++ b/tests/api_resources/repos/sessions/test_events.py @@ -7,9 +7,9 @@ import pytest -from solver_api import Solver, AsyncSolver +from solverai import Solver, AsyncSolver from tests.utils import assert_matches_type -from solver_api.types.repos.sessions import TraceEvent, EventPatchResponse +from solverai.types.repos.sessions import TraceEvent, EventGetPatchResponse base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") @@ -104,20 +104,20 @@ def test_path_params_get(self, client: Solver) -> None: @pytest.mark.skip() @parametrize - def test_method_patch(self, client: Solver) -> None: - event = client.repos.sessions.events.patch( + def test_method_get_patch(self, client: Solver) -> None: + event = client.repos.sessions.events.get_patch( event_id="eventId", provider="github", org="org", repo="repo", session_id="sessionId", ) - assert_matches_type(EventPatchResponse, event, path=["response"]) + assert_matches_type(EventGetPatchResponse, event, path=["response"]) @pytest.mark.skip() @parametrize - def test_method_patch_with_all_params(self, client: Solver) -> None: - event = client.repos.sessions.events.patch( + def test_method_get_patch_with_all_params(self, client: Solver) -> None: + event = client.repos.sessions.events.get_patch( event_id="eventId", provider="github", org="org", @@ -126,12 +126,12 @@ def test_method_patch_with_all_params(self, client: Solver) -> None: context_lines=0, interhunk_lines=0, ) - assert_matches_type(EventPatchResponse, event, path=["response"]) + assert_matches_type(EventGetPatchResponse, event, path=["response"]) @pytest.mark.skip() @parametrize - def test_raw_response_patch(self, client: Solver) -> None: - response = client.repos.sessions.events.with_raw_response.patch( + def test_raw_response_get_patch(self, client: Solver) -> None: + response = client.repos.sessions.events.with_raw_response.get_patch( event_id="eventId", provider="github", org="org", @@ -142,12 +142,12 @@ def test_raw_response_patch(self, client: Solver) -> None: assert response.is_closed is True assert response.http_request.headers.get("X-Stainless-Lang") == "python" event = response.parse() - assert_matches_type(EventPatchResponse, event, path=["response"]) + assert_matches_type(EventGetPatchResponse, event, path=["response"]) @pytest.mark.skip() @parametrize - def test_streaming_response_patch(self, client: Solver) -> None: - with client.repos.sessions.events.with_streaming_response.patch( + def test_streaming_response_get_patch(self, client: Solver) -> None: + with client.repos.sessions.events.with_streaming_response.get_patch( event_id="eventId", provider="github", org="org", @@ -158,15 +158,15 @@ def test_streaming_response_patch(self, client: Solver) -> None: assert response.http_request.headers.get("X-Stainless-Lang") == "python" event = response.parse() - assert_matches_type(EventPatchResponse, event, path=["response"]) + assert_matches_type(EventGetPatchResponse, event, path=["response"]) assert cast(Any, response.is_closed) is True @pytest.mark.skip() @parametrize - def test_path_params_patch(self, client: Solver) -> None: + def test_path_params_get_patch(self, client: Solver) -> None: with pytest.raises(ValueError, match=r"Expected a non-empty value for `org` but received ''"): - client.repos.sessions.events.with_raw_response.patch( + client.repos.sessions.events.with_raw_response.get_patch( event_id="eventId", provider="github", org="", @@ -175,7 +175,7 @@ def test_path_params_patch(self, client: Solver) -> None: ) with pytest.raises(ValueError, match=r"Expected a non-empty value for `repo` but received ''"): - client.repos.sessions.events.with_raw_response.patch( + client.repos.sessions.events.with_raw_response.get_patch( event_id="eventId", provider="github", org="org", @@ -184,7 +184,7 @@ def test_path_params_patch(self, client: Solver) -> None: ) with pytest.raises(ValueError, match=r"Expected a non-empty value for `session_id` but received ''"): - client.repos.sessions.events.with_raw_response.patch( + client.repos.sessions.events.with_raw_response.get_patch( event_id="eventId", provider="github", org="org", @@ -193,7 +193,7 @@ def test_path_params_patch(self, client: Solver) -> None: ) with pytest.raises(ValueError, match=r"Expected a non-empty value for `event_id` but received ''"): - client.repos.sessions.events.with_raw_response.patch( + client.repos.sessions.events.with_raw_response.get_patch( event_id="", provider="github", org="org", @@ -369,20 +369,20 @@ async def test_path_params_get(self, async_client: AsyncSolver) -> None: @pytest.mark.skip() @parametrize - async def test_method_patch(self, async_client: AsyncSolver) -> None: - event = await async_client.repos.sessions.events.patch( + async def test_method_get_patch(self, async_client: AsyncSolver) -> None: + event = await async_client.repos.sessions.events.get_patch( event_id="eventId", provider="github", org="org", repo="repo", session_id="sessionId", ) - assert_matches_type(EventPatchResponse, event, path=["response"]) + assert_matches_type(EventGetPatchResponse, event, path=["response"]) @pytest.mark.skip() @parametrize - async def test_method_patch_with_all_params(self, async_client: AsyncSolver) -> None: - event = await async_client.repos.sessions.events.patch( + async def test_method_get_patch_with_all_params(self, async_client: AsyncSolver) -> None: + event = await async_client.repos.sessions.events.get_patch( event_id="eventId", provider="github", org="org", @@ -391,12 +391,12 @@ async def test_method_patch_with_all_params(self, async_client: AsyncSolver) -> context_lines=0, interhunk_lines=0, ) - assert_matches_type(EventPatchResponse, event, path=["response"]) + assert_matches_type(EventGetPatchResponse, event, path=["response"]) @pytest.mark.skip() @parametrize - async def test_raw_response_patch(self, async_client: AsyncSolver) -> None: - response = await async_client.repos.sessions.events.with_raw_response.patch( + async def test_raw_response_get_patch(self, async_client: AsyncSolver) -> None: + response = await async_client.repos.sessions.events.with_raw_response.get_patch( event_id="eventId", provider="github", org="org", @@ -407,12 +407,12 @@ async def test_raw_response_patch(self, async_client: AsyncSolver) -> None: assert response.is_closed is True assert response.http_request.headers.get("X-Stainless-Lang") == "python" event = await response.parse() - assert_matches_type(EventPatchResponse, event, path=["response"]) + assert_matches_type(EventGetPatchResponse, event, path=["response"]) @pytest.mark.skip() @parametrize - async def test_streaming_response_patch(self, async_client: AsyncSolver) -> None: - async with async_client.repos.sessions.events.with_streaming_response.patch( + async def test_streaming_response_get_patch(self, async_client: AsyncSolver) -> None: + async with async_client.repos.sessions.events.with_streaming_response.get_patch( event_id="eventId", provider="github", org="org", @@ -423,15 +423,15 @@ async def test_streaming_response_patch(self, async_client: AsyncSolver) -> None assert response.http_request.headers.get("X-Stainless-Lang") == "python" event = await response.parse() - assert_matches_type(EventPatchResponse, event, path=["response"]) + assert_matches_type(EventGetPatchResponse, event, path=["response"]) assert cast(Any, response.is_closed) is True @pytest.mark.skip() @parametrize - async def test_path_params_patch(self, async_client: AsyncSolver) -> None: + async def test_path_params_get_patch(self, async_client: AsyncSolver) -> None: with pytest.raises(ValueError, match=r"Expected a non-empty value for `org` but received ''"): - await async_client.repos.sessions.events.with_raw_response.patch( + await async_client.repos.sessions.events.with_raw_response.get_patch( event_id="eventId", provider="github", org="", @@ -440,7 +440,7 @@ async def test_path_params_patch(self, async_client: AsyncSolver) -> None: ) with pytest.raises(ValueError, match=r"Expected a non-empty value for `repo` but received ''"): - await async_client.repos.sessions.events.with_raw_response.patch( + await async_client.repos.sessions.events.with_raw_response.get_patch( event_id="eventId", provider="github", org="org", @@ -449,7 +449,7 @@ async def test_path_params_patch(self, async_client: AsyncSolver) -> None: ) with pytest.raises(ValueError, match=r"Expected a non-empty value for `session_id` but received ''"): - await async_client.repos.sessions.events.with_raw_response.patch( + await async_client.repos.sessions.events.with_raw_response.get_patch( event_id="eventId", provider="github", org="org", @@ -458,7 +458,7 @@ async def test_path_params_patch(self, async_client: AsyncSolver) -> None: ) with pytest.raises(ValueError, match=r"Expected a non-empty value for `event_id` but received ''"): - await async_client.repos.sessions.events.with_raw_response.patch( + await async_client.repos.sessions.events.with_raw_response.get_patch( event_id="", provider="github", org="org", diff --git a/tests/api_resources/repos/sessions/test_status.py b/tests/api_resources/repos/sessions/test_status.py index 19ab3f6..5c56790 100644 --- a/tests/api_resources/repos/sessions/test_status.py +++ b/tests/api_resources/repos/sessions/test_status.py @@ -7,7 +7,7 @@ import pytest -from solver_api import Solver, AsyncSolver +from solverai import Solver, AsyncSolver base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") diff --git a/tests/api_resources/repos/sessions/test_turns.py b/tests/api_resources/repos/sessions/test_turns.py index aa6624e..90eb827 100644 --- a/tests/api_resources/repos/sessions/test_turns.py +++ b/tests/api_resources/repos/sessions/test_turns.py @@ -7,10 +7,10 @@ import pytest -from solver_api import Solver, AsyncSolver +from solverai import Solver, AsyncSolver from tests.utils import assert_matches_type -from solver_api.types.repos import Turn -from solver_api.types.repos.sessions import TurnListResponse, TurnPatchResponse +from solverai.types.repos import Turn +from solverai.types.repos.sessions import TurnListResponse, TurnGetPatchResponse base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") @@ -260,20 +260,20 @@ def test_path_params_get(self, client: Solver) -> None: @pytest.mark.skip() @parametrize - def test_method_patch(self, client: Solver) -> None: - turn = client.repos.sessions.turns.patch( + def test_method_get_patch(self, client: Solver) -> None: + turn = client.repos.sessions.turns.get_patch( turn_id="turnId", provider="github", org="org", repo="repo", session_id="sessionId", ) - assert_matches_type(TurnPatchResponse, turn, path=["response"]) + assert_matches_type(TurnGetPatchResponse, turn, path=["response"]) @pytest.mark.skip() @parametrize - def test_raw_response_patch(self, client: Solver) -> None: - response = client.repos.sessions.turns.with_raw_response.patch( + def test_raw_response_get_patch(self, client: Solver) -> None: + response = client.repos.sessions.turns.with_raw_response.get_patch( turn_id="turnId", provider="github", org="org", @@ -284,12 +284,12 @@ def test_raw_response_patch(self, client: Solver) -> None: assert response.is_closed is True assert response.http_request.headers.get("X-Stainless-Lang") == "python" turn = response.parse() - assert_matches_type(TurnPatchResponse, turn, path=["response"]) + assert_matches_type(TurnGetPatchResponse, turn, path=["response"]) @pytest.mark.skip() @parametrize - def test_streaming_response_patch(self, client: Solver) -> None: - with client.repos.sessions.turns.with_streaming_response.patch( + def test_streaming_response_get_patch(self, client: Solver) -> None: + with client.repos.sessions.turns.with_streaming_response.get_patch( turn_id="turnId", provider="github", org="org", @@ -300,15 +300,15 @@ def test_streaming_response_patch(self, client: Solver) -> None: assert response.http_request.headers.get("X-Stainless-Lang") == "python" turn = response.parse() - assert_matches_type(TurnPatchResponse, turn, path=["response"]) + assert_matches_type(TurnGetPatchResponse, turn, path=["response"]) assert cast(Any, response.is_closed) is True @pytest.mark.skip() @parametrize - def test_path_params_patch(self, client: Solver) -> None: + def test_path_params_get_patch(self, client: Solver) -> None: with pytest.raises(ValueError, match=r"Expected a non-empty value for `org` but received ''"): - client.repos.sessions.turns.with_raw_response.patch( + client.repos.sessions.turns.with_raw_response.get_patch( turn_id="turnId", provider="github", org="", @@ -317,7 +317,7 @@ def test_path_params_patch(self, client: Solver) -> None: ) with pytest.raises(ValueError, match=r"Expected a non-empty value for `repo` but received ''"): - client.repos.sessions.turns.with_raw_response.patch( + client.repos.sessions.turns.with_raw_response.get_patch( turn_id="turnId", provider="github", org="org", @@ -326,7 +326,7 @@ def test_path_params_patch(self, client: Solver) -> None: ) with pytest.raises(ValueError, match=r"Expected a non-empty value for `session_id` but received ''"): - client.repos.sessions.turns.with_raw_response.patch( + client.repos.sessions.turns.with_raw_response.get_patch( turn_id="turnId", provider="github", org="org", @@ -335,7 +335,7 @@ def test_path_params_patch(self, client: Solver) -> None: ) with pytest.raises(ValueError, match=r"Expected a non-empty value for `turn_id` but received ''"): - client.repos.sessions.turns.with_raw_response.patch( + client.repos.sessions.turns.with_raw_response.get_patch( turn_id="", provider="github", org="org", @@ -589,20 +589,20 @@ async def test_path_params_get(self, async_client: AsyncSolver) -> None: @pytest.mark.skip() @parametrize - async def test_method_patch(self, async_client: AsyncSolver) -> None: - turn = await async_client.repos.sessions.turns.patch( + async def test_method_get_patch(self, async_client: AsyncSolver) -> None: + turn = await async_client.repos.sessions.turns.get_patch( turn_id="turnId", provider="github", org="org", repo="repo", session_id="sessionId", ) - assert_matches_type(TurnPatchResponse, turn, path=["response"]) + assert_matches_type(TurnGetPatchResponse, turn, path=["response"]) @pytest.mark.skip() @parametrize - async def test_raw_response_patch(self, async_client: AsyncSolver) -> None: - response = await async_client.repos.sessions.turns.with_raw_response.patch( + async def test_raw_response_get_patch(self, async_client: AsyncSolver) -> None: + response = await async_client.repos.sessions.turns.with_raw_response.get_patch( turn_id="turnId", provider="github", org="org", @@ -613,12 +613,12 @@ async def test_raw_response_patch(self, async_client: AsyncSolver) -> None: assert response.is_closed is True assert response.http_request.headers.get("X-Stainless-Lang") == "python" turn = await response.parse() - assert_matches_type(TurnPatchResponse, turn, path=["response"]) + assert_matches_type(TurnGetPatchResponse, turn, path=["response"]) @pytest.mark.skip() @parametrize - async def test_streaming_response_patch(self, async_client: AsyncSolver) -> None: - async with async_client.repos.sessions.turns.with_streaming_response.patch( + async def test_streaming_response_get_patch(self, async_client: AsyncSolver) -> None: + async with async_client.repos.sessions.turns.with_streaming_response.get_patch( turn_id="turnId", provider="github", org="org", @@ -629,15 +629,15 @@ async def test_streaming_response_patch(self, async_client: AsyncSolver) -> None assert response.http_request.headers.get("X-Stainless-Lang") == "python" turn = await response.parse() - assert_matches_type(TurnPatchResponse, turn, path=["response"]) + assert_matches_type(TurnGetPatchResponse, turn, path=["response"]) assert cast(Any, response.is_closed) is True @pytest.mark.skip() @parametrize - async def test_path_params_patch(self, async_client: AsyncSolver) -> None: + async def test_path_params_get_patch(self, async_client: AsyncSolver) -> None: with pytest.raises(ValueError, match=r"Expected a non-empty value for `org` but received ''"): - await async_client.repos.sessions.turns.with_raw_response.patch( + await async_client.repos.sessions.turns.with_raw_response.get_patch( turn_id="turnId", provider="github", org="", @@ -646,7 +646,7 @@ async def test_path_params_patch(self, async_client: AsyncSolver) -> None: ) with pytest.raises(ValueError, match=r"Expected a non-empty value for `repo` but received ''"): - await async_client.repos.sessions.turns.with_raw_response.patch( + await async_client.repos.sessions.turns.with_raw_response.get_patch( turn_id="turnId", provider="github", org="org", @@ -655,7 +655,7 @@ async def test_path_params_patch(self, async_client: AsyncSolver) -> None: ) with pytest.raises(ValueError, match=r"Expected a non-empty value for `session_id` but received ''"): - await async_client.repos.sessions.turns.with_raw_response.patch( + await async_client.repos.sessions.turns.with_raw_response.get_patch( turn_id="turnId", provider="github", org="org", @@ -664,7 +664,7 @@ async def test_path_params_patch(self, async_client: AsyncSolver) -> None: ) with pytest.raises(ValueError, match=r"Expected a non-empty value for `turn_id` but received ''"): - await async_client.repos.sessions.turns.with_raw_response.patch( + await async_client.repos.sessions.turns.with_raw_response.get_patch( turn_id="", provider="github", org="org", diff --git a/tests/api_resources/repos/sessions/turns/test_events.py b/tests/api_resources/repos/sessions/turns/test_events.py index 3b48e2d..882b795 100644 --- a/tests/api_resources/repos/sessions/turns/test_events.py +++ b/tests/api_resources/repos/sessions/turns/test_events.py @@ -7,7 +7,7 @@ import pytest -from solver_api import Solver, AsyncSolver +from solverai import Solver, AsyncSolver base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") diff --git a/tests/api_resources/repos/test_sessions.py b/tests/api_resources/repos/test_sessions.py index e4fe8f0..214488a 100644 --- a/tests/api_resources/repos/test_sessions.py +++ b/tests/api_resources/repos/test_sessions.py @@ -7,13 +7,13 @@ import pytest -from solver_api import Solver, AsyncSolver +from solverai import Solver, AsyncSolver from tests.utils import assert_matches_type -from solver_api.types.repos import ( +from solverai.types.repos import ( Turn, Session, SessionListResponse, - SessionPatchResponse, + SessionGetPatchResponse, ) base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") @@ -244,19 +244,19 @@ def test_path_params_get(self, client: Solver) -> None: @pytest.mark.skip() @parametrize - def test_method_patch(self, client: Solver) -> None: - session = client.repos.sessions.patch( + def test_method_get_patch(self, client: Solver) -> None: + session = client.repos.sessions.get_patch( session_id="sessionId", provider="github", org="org", repo="repo", ) - assert_matches_type(SessionPatchResponse, session, path=["response"]) + assert_matches_type(SessionGetPatchResponse, session, path=["response"]) @pytest.mark.skip() @parametrize - def test_method_patch_with_all_params(self, client: Solver) -> None: - session = client.repos.sessions.patch( + def test_method_get_patch_with_all_params(self, client: Solver) -> None: + session = client.repos.sessions.get_patch( session_id="sessionId", provider="github", org="org", @@ -264,12 +264,12 @@ def test_method_patch_with_all_params(self, client: Solver) -> None: context_lines=0, interhunk_lines=0, ) - assert_matches_type(SessionPatchResponse, session, path=["response"]) + assert_matches_type(SessionGetPatchResponse, session, path=["response"]) @pytest.mark.skip() @parametrize - def test_raw_response_patch(self, client: Solver) -> None: - response = client.repos.sessions.with_raw_response.patch( + def test_raw_response_get_patch(self, client: Solver) -> None: + response = client.repos.sessions.with_raw_response.get_patch( session_id="sessionId", provider="github", org="org", @@ -279,12 +279,12 @@ def test_raw_response_patch(self, client: Solver) -> None: assert response.is_closed is True assert response.http_request.headers.get("X-Stainless-Lang") == "python" session = response.parse() - assert_matches_type(SessionPatchResponse, session, path=["response"]) + assert_matches_type(SessionGetPatchResponse, session, path=["response"]) @pytest.mark.skip() @parametrize - def test_streaming_response_patch(self, client: Solver) -> None: - with client.repos.sessions.with_streaming_response.patch( + def test_streaming_response_get_patch(self, client: Solver) -> None: + with client.repos.sessions.with_streaming_response.get_patch( session_id="sessionId", provider="github", org="org", @@ -294,15 +294,15 @@ def test_streaming_response_patch(self, client: Solver) -> None: assert response.http_request.headers.get("X-Stainless-Lang") == "python" session = response.parse() - assert_matches_type(SessionPatchResponse, session, path=["response"]) + assert_matches_type(SessionGetPatchResponse, session, path=["response"]) assert cast(Any, response.is_closed) is True @pytest.mark.skip() @parametrize - def test_path_params_patch(self, client: Solver) -> None: + def test_path_params_get_patch(self, client: Solver) -> None: with pytest.raises(ValueError, match=r"Expected a non-empty value for `org` but received ''"): - client.repos.sessions.with_raw_response.patch( + client.repos.sessions.with_raw_response.get_patch( session_id="sessionId", provider="github", org="", @@ -310,7 +310,7 @@ def test_path_params_patch(self, client: Solver) -> None: ) with pytest.raises(ValueError, match=r"Expected a non-empty value for `repo` but received ''"): - client.repos.sessions.with_raw_response.patch( + client.repos.sessions.with_raw_response.get_patch( session_id="sessionId", provider="github", org="org", @@ -318,7 +318,7 @@ def test_path_params_patch(self, client: Solver) -> None: ) with pytest.raises(ValueError, match=r"Expected a non-empty value for `session_id` but received ''"): - client.repos.sessions.with_raw_response.patch( + client.repos.sessions.with_raw_response.get_patch( session_id="", provider="github", org="org", @@ -647,19 +647,19 @@ async def test_path_params_get(self, async_client: AsyncSolver) -> None: @pytest.mark.skip() @parametrize - async def test_method_patch(self, async_client: AsyncSolver) -> None: - session = await async_client.repos.sessions.patch( + async def test_method_get_patch(self, async_client: AsyncSolver) -> None: + session = await async_client.repos.sessions.get_patch( session_id="sessionId", provider="github", org="org", repo="repo", ) - assert_matches_type(SessionPatchResponse, session, path=["response"]) + assert_matches_type(SessionGetPatchResponse, session, path=["response"]) @pytest.mark.skip() @parametrize - async def test_method_patch_with_all_params(self, async_client: AsyncSolver) -> None: - session = await async_client.repos.sessions.patch( + async def test_method_get_patch_with_all_params(self, async_client: AsyncSolver) -> None: + session = await async_client.repos.sessions.get_patch( session_id="sessionId", provider="github", org="org", @@ -667,12 +667,12 @@ async def test_method_patch_with_all_params(self, async_client: AsyncSolver) -> context_lines=0, interhunk_lines=0, ) - assert_matches_type(SessionPatchResponse, session, path=["response"]) + assert_matches_type(SessionGetPatchResponse, session, path=["response"]) @pytest.mark.skip() @parametrize - async def test_raw_response_patch(self, async_client: AsyncSolver) -> None: - response = await async_client.repos.sessions.with_raw_response.patch( + async def test_raw_response_get_patch(self, async_client: AsyncSolver) -> None: + response = await async_client.repos.sessions.with_raw_response.get_patch( session_id="sessionId", provider="github", org="org", @@ -682,12 +682,12 @@ async def test_raw_response_patch(self, async_client: AsyncSolver) -> None: assert response.is_closed is True assert response.http_request.headers.get("X-Stainless-Lang") == "python" session = await response.parse() - assert_matches_type(SessionPatchResponse, session, path=["response"]) + assert_matches_type(SessionGetPatchResponse, session, path=["response"]) @pytest.mark.skip() @parametrize - async def test_streaming_response_patch(self, async_client: AsyncSolver) -> None: - async with async_client.repos.sessions.with_streaming_response.patch( + async def test_streaming_response_get_patch(self, async_client: AsyncSolver) -> None: + async with async_client.repos.sessions.with_streaming_response.get_patch( session_id="sessionId", provider="github", org="org", @@ -697,15 +697,15 @@ async def test_streaming_response_patch(self, async_client: AsyncSolver) -> None assert response.http_request.headers.get("X-Stainless-Lang") == "python" session = await response.parse() - assert_matches_type(SessionPatchResponse, session, path=["response"]) + assert_matches_type(SessionGetPatchResponse, session, path=["response"]) assert cast(Any, response.is_closed) is True @pytest.mark.skip() @parametrize - async def test_path_params_patch(self, async_client: AsyncSolver) -> None: + async def test_path_params_get_patch(self, async_client: AsyncSolver) -> None: with pytest.raises(ValueError, match=r"Expected a non-empty value for `org` but received ''"): - await async_client.repos.sessions.with_raw_response.patch( + await async_client.repos.sessions.with_raw_response.get_patch( session_id="sessionId", provider="github", org="", @@ -713,7 +713,7 @@ async def test_path_params_patch(self, async_client: AsyncSolver) -> None: ) with pytest.raises(ValueError, match=r"Expected a non-empty value for `repo` but received ''"): - await async_client.repos.sessions.with_raw_response.patch( + await async_client.repos.sessions.with_raw_response.get_patch( session_id="sessionId", provider="github", org="org", @@ -721,7 +721,7 @@ async def test_path_params_patch(self, async_client: AsyncSolver) -> None: ) with pytest.raises(ValueError, match=r"Expected a non-empty value for `session_id` but received ''"): - await async_client.repos.sessions.with_raw_response.patch( + await async_client.repos.sessions.with_raw_response.get_patch( session_id="", provider="github", org="org", diff --git a/tests/api_resources/test_repos.py b/tests/api_resources/test_repos.py index 80a4b4e..9c86a8a 100644 --- a/tests/api_resources/test_repos.py +++ b/tests/api_resources/test_repos.py @@ -7,9 +7,9 @@ import pytest -from solver_api import Solver, AsyncSolver +from solverai import Solver, AsyncSolver from tests.utils import assert_matches_type -from solver_api.types import RepoListResponse +from solverai.types import RepoListResponse base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") diff --git a/tests/conftest.py b/tests/conftest.py index a3a238c..3f140f5 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -7,14 +7,14 @@ import pytest from pytest_asyncio import is_async_test -from solver_api import Solver, AsyncSolver +from solverai import Solver, AsyncSolver if TYPE_CHECKING: from _pytest.fixtures import FixtureRequest # pyright: ignore[reportPrivateImportUsage] pytest.register_assert_rewrite("tests.utils") -logging.getLogger("solver_api").setLevel(logging.DEBUG) +logging.getLogger("solverai").setLevel(logging.DEBUG) # automatically add `pytest.mark.asyncio()` to all of our async tests diff --git a/tests/test_client.py b/tests/test_client.py index cd72101..e69755b 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -21,17 +21,19 @@ from respx import MockRouter from pydantic import ValidationError -from solver_api import Solver, AsyncSolver, APIResponseValidationError -from solver_api._types import Omit -from solver_api._models import BaseModel, FinalRequestOptions -from solver_api._constants import RAW_RESPONSE_HEADER -from solver_api._exceptions import SolverError, APIStatusError, APITimeoutError, APIResponseValidationError -from solver_api._base_client import ( +from solverai import Solver, AsyncSolver, APIResponseValidationError +from solverai._types import Omit +from solverai._utils import maybe_transform +from solverai._models import BaseModel, FinalRequestOptions +from solverai._constants import RAW_RESPONSE_HEADER +from solverai._exceptions import SolverError, APIStatusError, APITimeoutError, APIResponseValidationError +from solverai._base_client import ( DEFAULT_TIMEOUT, HTTPX_DEFAULT_TIMEOUT, BaseClient, make_request_options, ) +from solverai.types.repos.session_create_params import SessionCreateParams from .utils import update_env @@ -230,10 +232,10 @@ def add_leak(leaks: list[tracemalloc.StatisticDiff], diff: tracemalloc.Statistic # to_raw_response_wrapper leaks through the @functools.wraps() decorator. # # removing the decorator fixes the leak for reasons we don't understand. - "solver_api/_legacy_response.py", - "solver_api/_response.py", + "solverai/_legacy_response.py", + "solverai/_response.py", # pydantic.BaseModel.model_dump || pydantic.BaseModel.dict leak memory for some reason. - "solver_api/_compat.py", + "solverai/_compat.py", # Standard library leaks we don't care about. "/logging/__init__.py", ] @@ -707,32 +709,40 @@ def test_parse_retry_after_header(self, remaining_retries: int, retry_after: str calculated = client._calculate_retry_timeout(remaining_retries, options, headers) assert calculated == pytest.approx(timeout, 0.5 * 0.875) # pyright: ignore[reportUnknownMemberType] - @mock.patch("solver_api._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) + @mock.patch("solverai._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) @pytest.mark.respx(base_url=base_url) def test_retrying_timeout_errors_doesnt_leak(self, respx_mock: MockRouter) -> None: - respx_mock.get("/repos/github").mock(side_effect=httpx.TimeoutException("Test timeout error")) + respx_mock.post("/alpha/repos/github/org/repo/sessions").mock( + side_effect=httpx.TimeoutException("Test timeout error") + ) with pytest.raises(APITimeoutError): - self.client.get( - "/repos/github", cast_to=httpx.Response, options={"headers": {RAW_RESPONSE_HEADER: "stream"}} + self.client.post( + "/alpha/repos/github/org/repo/sessions", + body=cast(object, maybe_transform(dict(user_branch_name="main"), SessionCreateParams)), + cast_to=httpx.Response, + options={"headers": {RAW_RESPONSE_HEADER: "stream"}}, ) assert _get_open_connections(self.client) == 0 - @mock.patch("solver_api._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) + @mock.patch("solverai._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) @pytest.mark.respx(base_url=base_url) def test_retrying_status_errors_doesnt_leak(self, respx_mock: MockRouter) -> None: - respx_mock.get("/repos/github").mock(return_value=httpx.Response(500)) + respx_mock.post("/alpha/repos/github/org/repo/sessions").mock(return_value=httpx.Response(500)) with pytest.raises(APIStatusError): - self.client.get( - "/repos/github", cast_to=httpx.Response, options={"headers": {RAW_RESPONSE_HEADER: "stream"}} + self.client.post( + "/alpha/repos/github/org/repo/sessions", + body=cast(object, maybe_transform(dict(user_branch_name="main"), SessionCreateParams)), + cast_to=httpx.Response, + options={"headers": {RAW_RESPONSE_HEADER: "stream"}}, ) assert _get_open_connections(self.client) == 0 @pytest.mark.parametrize("failures_before_success", [0, 2, 4]) - @mock.patch("solver_api._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) + @mock.patch("solverai._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) @pytest.mark.respx(base_url=base_url) @pytest.mark.parametrize("failure_mode", ["status", "exception"]) def test_retries_taken( @@ -755,15 +765,17 @@ def retry_handler(_request: httpx.Request) -> httpx.Response: return httpx.Response(500) return httpx.Response(200) - respx_mock.get("/repos/github").mock(side_effect=retry_handler) + respx_mock.post("/alpha/repos/github/org/repo/sessions").mock(side_effect=retry_handler) - response = client.repos.with_raw_response.list("github") + response = client.repos.sessions.with_raw_response.create( + repo="repo", provider="github", org="org", user_branch_name="userBranchName" + ) assert response.retries_taken == failures_before_success assert int(response.http_request.headers.get("x-stainless-retry-count")) == failures_before_success @pytest.mark.parametrize("failures_before_success", [0, 2, 4]) - @mock.patch("solver_api._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) + @mock.patch("solverai._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) @pytest.mark.respx(base_url=base_url) def test_omit_retry_count_header( self, client: Solver, failures_before_success: int, respx_mock: MockRouter @@ -779,14 +791,20 @@ def retry_handler(_request: httpx.Request) -> httpx.Response: return httpx.Response(500) return httpx.Response(200) - respx_mock.get("/repos/github").mock(side_effect=retry_handler) + respx_mock.post("/alpha/repos/github/org/repo/sessions").mock(side_effect=retry_handler) - response = client.repos.with_raw_response.list("github", extra_headers={"x-stainless-retry-count": Omit()}) + response = client.repos.sessions.with_raw_response.create( + repo="repo", + provider="github", + org="org", + user_branch_name="userBranchName", + extra_headers={"x-stainless-retry-count": Omit()}, + ) assert len(response.http_request.headers.get_list("x-stainless-retry-count")) == 0 @pytest.mark.parametrize("failures_before_success", [0, 2, 4]) - @mock.patch("solver_api._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) + @mock.patch("solverai._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) @pytest.mark.respx(base_url=base_url) def test_overwrite_retry_count_header( self, client: Solver, failures_before_success: int, respx_mock: MockRouter @@ -802,9 +820,15 @@ def retry_handler(_request: httpx.Request) -> httpx.Response: return httpx.Response(500) return httpx.Response(200) - respx_mock.get("/repos/github").mock(side_effect=retry_handler) + respx_mock.post("/alpha/repos/github/org/repo/sessions").mock(side_effect=retry_handler) - response = client.repos.with_raw_response.list("github", extra_headers={"x-stainless-retry-count": "42"}) + response = client.repos.sessions.with_raw_response.create( + repo="repo", + provider="github", + org="org", + user_branch_name="userBranchName", + extra_headers={"x-stainless-retry-count": "42"}, + ) assert response.http_request.headers.get("x-stainless-retry-count") == "42" @@ -984,10 +1008,10 @@ def add_leak(leaks: list[tracemalloc.StatisticDiff], diff: tracemalloc.Statistic # to_raw_response_wrapper leaks through the @functools.wraps() decorator. # # removing the decorator fixes the leak for reasons we don't understand. - "solver_api/_legacy_response.py", - "solver_api/_response.py", + "solverai/_legacy_response.py", + "solverai/_response.py", # pydantic.BaseModel.model_dump || pydantic.BaseModel.dict leak memory for some reason. - "solver_api/_compat.py", + "solverai/_compat.py", # Standard library leaks we don't care about. "/logging/__init__.py", ] @@ -1477,32 +1501,40 @@ async def test_parse_retry_after_header(self, remaining_retries: int, retry_afte calculated = client._calculate_retry_timeout(remaining_retries, options, headers) assert calculated == pytest.approx(timeout, 0.5 * 0.875) # pyright: ignore[reportUnknownMemberType] - @mock.patch("solver_api._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) + @mock.patch("solverai._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) @pytest.mark.respx(base_url=base_url) async def test_retrying_timeout_errors_doesnt_leak(self, respx_mock: MockRouter) -> None: - respx_mock.get("/repos/github").mock(side_effect=httpx.TimeoutException("Test timeout error")) + respx_mock.post("/alpha/repos/github/org/repo/sessions").mock( + side_effect=httpx.TimeoutException("Test timeout error") + ) with pytest.raises(APITimeoutError): - await self.client.get( - "/repos/github", cast_to=httpx.Response, options={"headers": {RAW_RESPONSE_HEADER: "stream"}} + await self.client.post( + "/alpha/repos/github/org/repo/sessions", + body=cast(object, maybe_transform(dict(user_branch_name="main"), SessionCreateParams)), + cast_to=httpx.Response, + options={"headers": {RAW_RESPONSE_HEADER: "stream"}}, ) assert _get_open_connections(self.client) == 0 - @mock.patch("solver_api._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) + @mock.patch("solverai._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) @pytest.mark.respx(base_url=base_url) async def test_retrying_status_errors_doesnt_leak(self, respx_mock: MockRouter) -> None: - respx_mock.get("/repos/github").mock(return_value=httpx.Response(500)) + respx_mock.post("/alpha/repos/github/org/repo/sessions").mock(return_value=httpx.Response(500)) with pytest.raises(APIStatusError): - await self.client.get( - "/repos/github", cast_to=httpx.Response, options={"headers": {RAW_RESPONSE_HEADER: "stream"}} + await self.client.post( + "/alpha/repos/github/org/repo/sessions", + body=cast(object, maybe_transform(dict(user_branch_name="main"), SessionCreateParams)), + cast_to=httpx.Response, + options={"headers": {RAW_RESPONSE_HEADER: "stream"}}, ) assert _get_open_connections(self.client) == 0 @pytest.mark.parametrize("failures_before_success", [0, 2, 4]) - @mock.patch("solver_api._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) + @mock.patch("solverai._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) @pytest.mark.respx(base_url=base_url) @pytest.mark.asyncio @pytest.mark.parametrize("failure_mode", ["status", "exception"]) @@ -1526,15 +1558,17 @@ def retry_handler(_request: httpx.Request) -> httpx.Response: return httpx.Response(500) return httpx.Response(200) - respx_mock.get("/repos/github").mock(side_effect=retry_handler) + respx_mock.post("/alpha/repos/github/org/repo/sessions").mock(side_effect=retry_handler) - response = await client.repos.with_raw_response.list("github") + response = await client.repos.sessions.with_raw_response.create( + repo="repo", provider="github", org="org", user_branch_name="userBranchName" + ) assert response.retries_taken == failures_before_success assert int(response.http_request.headers.get("x-stainless-retry-count")) == failures_before_success @pytest.mark.parametrize("failures_before_success", [0, 2, 4]) - @mock.patch("solver_api._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) + @mock.patch("solverai._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) @pytest.mark.respx(base_url=base_url) @pytest.mark.asyncio async def test_omit_retry_count_header( @@ -1551,16 +1585,20 @@ def retry_handler(_request: httpx.Request) -> httpx.Response: return httpx.Response(500) return httpx.Response(200) - respx_mock.get("/repos/github").mock(side_effect=retry_handler) + respx_mock.post("/alpha/repos/github/org/repo/sessions").mock(side_effect=retry_handler) - response = await client.repos.with_raw_response.list( - "github", extra_headers={"x-stainless-retry-count": Omit()} + response = await client.repos.sessions.with_raw_response.create( + repo="repo", + provider="github", + org="org", + user_branch_name="userBranchName", + extra_headers={"x-stainless-retry-count": Omit()}, ) assert len(response.http_request.headers.get_list("x-stainless-retry-count")) == 0 @pytest.mark.parametrize("failures_before_success", [0, 2, 4]) - @mock.patch("solver_api._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) + @mock.patch("solverai._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout) @pytest.mark.respx(base_url=base_url) @pytest.mark.asyncio async def test_overwrite_retry_count_header( @@ -1577,9 +1615,15 @@ def retry_handler(_request: httpx.Request) -> httpx.Response: return httpx.Response(500) return httpx.Response(200) - respx_mock.get("/repos/github").mock(side_effect=retry_handler) + respx_mock.post("/alpha/repos/github/org/repo/sessions").mock(side_effect=retry_handler) - response = await client.repos.with_raw_response.list("github", extra_headers={"x-stainless-retry-count": "42"}) + response = await client.repos.sessions.with_raw_response.create( + repo="repo", + provider="github", + org="org", + user_branch_name="userBranchName", + extra_headers={"x-stainless-retry-count": "42"}, + ) assert response.http_request.headers.get("x-stainless-retry-count") == "42" @@ -1594,8 +1638,8 @@ def test_get_platform(self) -> None: import nest_asyncio import threading - from solver_api._utils import asyncify - from solver_api._base_client import get_platform + from solverai._utils import asyncify + from solverai._base_client import get_platform async def test_main() -> None: result = await asyncify(get_platform)() diff --git a/tests/test_deepcopy.py b/tests/test_deepcopy.py index 95274cc..19c814a 100644 --- a/tests/test_deepcopy.py +++ b/tests/test_deepcopy.py @@ -1,4 +1,4 @@ -from solver_api._utils import deepcopy_minimal +from solverai._utils import deepcopy_minimal def assert_different_identities(obj1: object, obj2: object) -> None: diff --git a/tests/test_extract_files.py b/tests/test_extract_files.py index 6ecfbaa..13b9036 100644 --- a/tests/test_extract_files.py +++ b/tests/test_extract_files.py @@ -4,8 +4,8 @@ import pytest -from solver_api._types import FileTypes -from solver_api._utils import extract_files +from solverai._types import FileTypes +from solverai._utils import extract_files def test_removes_files_from_input() -> None: diff --git a/tests/test_files.py b/tests/test_files.py index 97932bf..7e4cb1a 100644 --- a/tests/test_files.py +++ b/tests/test_files.py @@ -4,7 +4,7 @@ import pytest from dirty_equals import IsDict, IsList, IsBytes, IsTuple -from solver_api._files import to_httpx_files, async_to_httpx_files +from solverai._files import to_httpx_files, async_to_httpx_files readme_path = Path(__file__).parent.parent.joinpath("README.md") diff --git a/tests/test_models.py b/tests/test_models.py index d3e4b6d..78972ae 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -7,9 +7,9 @@ import pydantic from pydantic import Field -from solver_api._utils import PropertyInfo -from solver_api._compat import PYDANTIC_V2, parse_obj, model_dump, model_json -from solver_api._models import BaseModel, construct_type +from solverai._utils import PropertyInfo +from solverai._compat import PYDANTIC_V2, parse_obj, model_dump, model_json +from solverai._models import BaseModel, construct_type class BasicModel(BaseModel): diff --git a/tests/test_qs.py b/tests/test_qs.py index a40d062..5f525a3 100644 --- a/tests/test_qs.py +++ b/tests/test_qs.py @@ -4,7 +4,7 @@ import pytest -from solver_api._qs import Querystring, stringify +from solverai._qs import Querystring, stringify def test_empty() -> None: diff --git a/tests/test_required_args.py b/tests/test_required_args.py index 89bc6c3..a1957ee 100644 --- a/tests/test_required_args.py +++ b/tests/test_required_args.py @@ -2,7 +2,7 @@ import pytest -from solver_api._utils import required_args +from solverai._utils import required_args def test_too_many_positional_params() -> None: diff --git a/tests/test_response.py b/tests/test_response.py index 749d672..d97f3d9 100644 --- a/tests/test_response.py +++ b/tests/test_response.py @@ -6,8 +6,8 @@ import pytest import pydantic -from solver_api import Solver, BaseModel, AsyncSolver -from solver_api._response import ( +from solverai import Solver, BaseModel, AsyncSolver +from solverai._response import ( APIResponse, BaseAPIResponse, AsyncAPIResponse, @@ -15,8 +15,8 @@ AsyncBinaryAPIResponse, extract_response_type, ) -from solver_api._streaming import Stream -from solver_api._base_client import FinalRequestOptions +from solverai._streaming import Stream +from solverai._base_client import FinalRequestOptions class ConcreteBaseAPIResponse(APIResponse[bytes]): ... @@ -37,7 +37,7 @@ def test_extract_response_type_direct_classes() -> None: def test_extract_response_type_direct_class_missing_type_arg() -> None: with pytest.raises( RuntimeError, - match="Expected type to have a type argument at index 0 but it did not", + match="Expected type to have a type argument at index 0 but it did not", ): extract_response_type(AsyncAPIResponse) @@ -68,7 +68,7 @@ def test_response_parse_mismatched_basemodel(client: Solver) -> None: with pytest.raises( TypeError, - match="Pydantic models must subclass our base model type, e.g. `from solver_api import BaseModel`", + match="Pydantic models must subclass our base model type, e.g. `from solverai import BaseModel`", ): response.parse(to=PydanticModel) @@ -86,7 +86,7 @@ async def test_async_response_parse_mismatched_basemodel(async_client: AsyncSolv with pytest.raises( TypeError, - match="Pydantic models must subclass our base model type, e.g. `from solver_api import BaseModel`", + match="Pydantic models must subclass our base model type, e.g. `from solverai import BaseModel`", ): await response.parse(to=PydanticModel) diff --git a/tests/test_streaming.py b/tests/test_streaming.py index 408fa3a..4243972 100644 --- a/tests/test_streaming.py +++ b/tests/test_streaming.py @@ -5,8 +5,8 @@ import httpx import pytest -from solver_api import Solver, AsyncSolver -from solver_api._streaming import Stream, AsyncStream, ServerSentEvent +from solverai import Solver, AsyncSolver +from solverai._streaming import Stream, AsyncStream, ServerSentEvent @pytest.mark.asyncio diff --git a/tests/test_transform.py b/tests/test_transform.py index 76fb057..1b4277f 100644 --- a/tests/test_transform.py +++ b/tests/test_transform.py @@ -8,15 +8,15 @@ import pytest -from solver_api._types import NOT_GIVEN, Base64FileInput -from solver_api._utils import ( +from solverai._types import NOT_GIVEN, Base64FileInput +from solverai._utils import ( PropertyInfo, transform as _transform, parse_datetime, async_transform as _async_transform, ) -from solver_api._compat import PYDANTIC_V2 -from solver_api._models import BaseModel +from solverai._compat import PYDANTIC_V2 +from solverai._models import BaseModel _T = TypeVar("_T") diff --git a/tests/test_utils/test_proxy.py b/tests/test_utils/test_proxy.py index 333f375..a05646b 100644 --- a/tests/test_utils/test_proxy.py +++ b/tests/test_utils/test_proxy.py @@ -2,7 +2,7 @@ from typing import Any from typing_extensions import override -from solver_api._utils import LazyProxy +from solverai._utils import LazyProxy class RecursiveLazyProxy(LazyProxy[Any]): diff --git a/tests/test_utils/test_typing.py b/tests/test_utils/test_typing.py index 4b22184..faef5e7 100644 --- a/tests/test_utils/test_typing.py +++ b/tests/test_utils/test_typing.py @@ -2,7 +2,7 @@ from typing import Generic, TypeVar, cast -from solver_api._utils import extract_type_var_from_base +from solverai._utils import extract_type_var_from_base _T = TypeVar("_T") _T2 = TypeVar("_T2") diff --git a/tests/utils.py b/tests/utils.py index 5008fa9..93c7308 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -8,8 +8,8 @@ from datetime import date, datetime from typing_extensions import Literal, get_args, get_origin, assert_type -from solver_api._types import Omit, NoneType -from solver_api._utils import ( +from solverai._types import Omit, NoneType +from solverai._utils import ( is_dict, is_list, is_list_type, @@ -18,8 +18,8 @@ is_annotated_type, is_type_alias_type, ) -from solver_api._compat import PYDANTIC_V2, field_outer_type, get_model_fields -from solver_api._models import BaseModel +from solverai._compat import PYDANTIC_V2, field_outer_type, get_model_fields +from solverai._models import BaseModel BaseModelT = TypeVar("BaseModelT", bound=BaseModel)