httpr 0.1.0__tar.gz → 0.1.11__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of httpr might be problematic. Click here for more details.

Files changed (40) hide show
  1. {httpr-0.1.0 → httpr-0.1.11}/.github/workflows/CI.yml +63 -2
  2. {httpr-0.1.0 → httpr-0.1.11}/.github/workflows/mkdocs.yml +1 -1
  3. httpr-0.1.11/.github/workflows/set_version.py +56 -0
  4. {httpr-0.1.0 → httpr-0.1.11}/.gitignore +3 -1
  5. {httpr-0.1.0 → httpr-0.1.11}/PKG-INFO +17 -11
  6. {httpr-0.1.0 → httpr-0.1.11}/README.md +15 -9
  7. httpr-0.1.11/benchmark.jpg +0 -0
  8. httpr-0.1.11/docs/writings/index.md +1 -0
  9. httpr-0.1.11/docs/writings/posts/2025-02-24-python-http-clients-suck.md +9 -0
  10. {httpr-0.1.0 → httpr-0.1.11}/httpr/__init__.py +14 -0
  11. httpr-0.1.11/mkdocs.yml +41 -0
  12. httpr-0.1.11/pyproject.toml +49 -0
  13. {httpr-0.1.0 → httpr-0.1.11}/src/lib.rs +1 -0
  14. {httpr-0.1.0 → httpr-0.1.11}/tests/test_client.py +2 -2
  15. {httpr-0.1.0 → httpr-0.1.11}/uv.lock +104 -65
  16. httpr-0.1.0/benchmark.jpg +0 -0
  17. httpr-0.1.0/mkdocs.yml +0 -4
  18. httpr-0.1.0/pyproject.toml +0 -87
  19. {httpr-0.1.0 → httpr-0.1.11}/.pre-commit-config.yaml +0 -0
  20. {httpr-0.1.0 → httpr-0.1.11}/Cargo.lock +0 -0
  21. {httpr-0.1.0 → httpr-0.1.11}/Cargo.toml +0 -0
  22. {httpr-0.1.0 → httpr-0.1.11}/LICENSE +0 -0
  23. {httpr-0.1.0 → httpr-0.1.11}/benchmark/README.md +0 -0
  24. {httpr-0.1.0 → httpr-0.1.11}/benchmark/benchmark.py +0 -0
  25. {httpr-0.1.0 → httpr-0.1.11}/benchmark/generate_image.py +0 -0
  26. {httpr-0.1.0 → httpr-0.1.11}/benchmark/pyproject.toml +0 -0
  27. {httpr-0.1.0 → httpr-0.1.11}/benchmark/requirements.txt +0 -0
  28. {httpr-0.1.0 → httpr-0.1.11}/benchmark/server.py +0 -0
  29. {httpr-0.1.0 → httpr-0.1.11}/docs/index.md +0 -0
  30. {httpr-0.1.0 → httpr-0.1.11}/httpr/httpr.pyi +0 -0
  31. {httpr-0.1.0 → httpr-0.1.11}/httpr/py.typed +0 -0
  32. {httpr-0.1.0 → httpr-0.1.11}/httpr.code-workspace +0 -0
  33. {httpr-0.1.0 → httpr-0.1.11}/scratch.ipynb +0 -0
  34. {httpr-0.1.0 → httpr-0.1.11}/src/response.rs +0 -0
  35. {httpr-0.1.0 → httpr-0.1.11}/src/traits.rs +0 -0
  36. {httpr-0.1.0 → httpr-0.1.11}/src/utils.rs +0 -0
  37. {httpr-0.1.0 → httpr-0.1.11}/tests/httpx_conns.py +0 -0
  38. {httpr-0.1.0 → httpr-0.1.11}/tests/test_asyncclient.py +0 -0
  39. {httpr-0.1.0 → httpr-0.1.11}/tests/test_defs.py +0 -0
  40. {httpr-0.1.0 → httpr-0.1.11}/tests/test_ssl.py +0 -0
@@ -19,6 +19,20 @@ permissions:
19
19
  contents: read
20
20
 
21
21
  jobs:
22
+ extract-version:
23
+ runs-on: ubuntu-latest
24
+ if: ${{ startsWith(github.ref, 'refs/tags/') }}
25
+ outputs:
26
+ version: ${{ steps.get_version.outputs.version }}
27
+ steps:
28
+ - name: Extract version from tag
29
+ id: get_version
30
+ run: |
31
+ # Extract version from tag (e.g., v0.1.0 -> 0.1.0)
32
+ TAG_VERSION=${GITHUB_REF#refs/tags/v}
33
+ echo "version=$TAG_VERSION" >> $GITHUB_OUTPUT
34
+ echo "Version extracted: $TAG_VERSION"
35
+
22
36
  linux:
23
37
  runs-on: ${{ matrix.platform.runner }}
24
38
  strategy:
@@ -47,6 +61,13 @@ jobs:
47
61
  - uses: actions/setup-python@v5
48
62
  with:
49
63
  python-version: 3.x
64
+ # Only modify pyproject.toml temporarily for this job if running from a tag
65
+ - name: Update version in pyproject.toml
66
+ if: ${{ startsWith(github.ref, 'refs/tags/') }}
67
+ run: |
68
+ TAG_VERSION=${GITHUB_REF#refs/tags/v}
69
+ pip install toml
70
+ python .github/workflows/set_version.py $TAG_VERSION
50
71
  - name: Build wheels
51
72
  uses: PyO3/maturin-action@v1
52
73
  with:
@@ -103,13 +124,20 @@ jobs:
103
124
  target: x86
104
125
  - runner: ubuntu-22.04
105
126
  target: aarch64
106
- - runner: ubuntu-22.04
107
- target: armv7
127
+ # - runner: ubuntu-22.04
128
+ # target: armv7
108
129
  steps:
109
130
  - uses: actions/checkout@v4
110
131
  - uses: actions/setup-python@v5
111
132
  with:
112
133
  python-version: 3.x
134
+ # Only modify pyproject.toml temporarily for this job if running from a tag
135
+ - name: Update version in pyproject.toml
136
+ if: ${{ startsWith(github.ref, 'refs/tags/') }}
137
+ run: |
138
+ TAG_VERSION=${GITHUB_REF#refs/tags/v}
139
+ pip install toml
140
+ python .github/workflows/set_version.py $TAG_VERSION
113
141
  - name: Build wheels
114
142
  uses: PyO3/maturin-action@v1
115
143
  with:
@@ -175,6 +203,14 @@ jobs:
175
203
  with:
176
204
  python-version: 3.x
177
205
  architecture: ${{ matrix.platform.target }}
206
+ # Only modify pyproject.toml temporarily for this job if running from a tag
207
+ - name: Update version in pyproject.toml
208
+ if: ${{ startsWith(github.ref, 'refs/tags/') }}
209
+ shell: pwsh
210
+ run: |
211
+ $TAG_VERSION = $env:GITHUB_REF -replace 'refs/tags/v', ''
212
+ pip install toml
213
+ python .github/workflows/set_version.py $TAG_VERSION
178
214
  - name: Build wheels
179
215
  uses: PyO3/maturin-action@v1
180
216
  with:
@@ -216,6 +252,13 @@ jobs:
216
252
  - uses: actions/setup-python@v5
217
253
  with:
218
254
  python-version: 3.x
255
+ # Only modify pyproject.toml temporarily for this job if running from a tag
256
+ - name: Update version in pyproject.toml
257
+ if: ${{ startsWith(github.ref, 'refs/tags/') }}
258
+ run: |
259
+ TAG_VERSION=${GITHUB_REF#refs/tags/v}
260
+ pip install toml
261
+ python .github/workflows/set_version.py $TAG_VERSION
219
262
  - name: Build wheels
220
263
  uses: PyO3/maturin-action@v1
221
264
  with:
@@ -246,6 +289,16 @@ jobs:
246
289
  runs-on: ubuntu-latest
247
290
  steps:
248
291
  - uses: actions/checkout@v4
292
+ - uses: actions/setup-python@v5
293
+ with:
294
+ python-version: 3.x
295
+ # Only modify pyproject.toml temporarily for this job if running from a tag
296
+ - name: Update version in pyproject.toml
297
+ if: ${{ startsWith(github.ref, 'refs/tags/') }}
298
+ run: |
299
+ TAG_VERSION=${GITHUB_REF#refs/tags/v}
300
+ pip install toml
301
+ python .github/workflows/set_version.py $TAG_VERSION
249
302
  - name: Build sdist
250
303
  uses: PyO3/maturin-action@v1
251
304
  with:
@@ -292,6 +345,8 @@ jobs:
292
345
  needs: [linux]
293
346
  steps:
294
347
  - uses: actions/checkout@v4
348
+ with:
349
+ fetch-depth: 0
295
350
  - name: Set up Python
296
351
  uses: actions/setup-python@v5
297
352
  with:
@@ -312,8 +367,14 @@ jobs:
312
367
  run: python benchmark/benchmark.py
313
368
  - name: Generate image
314
369
  run: python benchmark/generate_image.py
370
+ - name: Checkout main branch
371
+ if: ${{ startsWith(github.ref, 'refs/tags/') }}
372
+ run: |
373
+ git checkout main
315
374
  - name: Commit generated image if changed
316
375
  uses: EndBug/add-and-commit@v9
317
376
  with:
318
377
  message: "Update generated image"
319
378
  add: "*.jpg"
379
+ default_author: github_actions
380
+ push: true
@@ -25,5 +25,5 @@ jobs:
25
25
  path: .cache
26
26
  restore-keys: |
27
27
  mkdocs-material-
28
- - run: pip install mkdocs-material
28
+ - run: pip install mkdocs-material[imaging]
29
29
  - run: mkdocs gh-deploy --force
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env python3
2
+
3
+ import argparse
4
+ import os
5
+ import sys
6
+
7
+ # Replace tomllib with toml (needs to be installed with pip)
8
+ import toml
9
+
10
+
11
+ def update_version(version):
12
+ """Update project version in pyproject.toml file"""
13
+ # Get the project root directory (assuming script is in .github/workflows)
14
+ project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
15
+ pyproject_path = os.path.join(project_root, "pyproject.toml")
16
+
17
+ # Check if pyproject.toml exists
18
+ if not os.path.isfile(pyproject_path):
19
+ print(f"Error: pyproject.toml not found at {pyproject_path}")
20
+ sys.exit(1)
21
+
22
+ try:
23
+ # Load the pyproject.toml file
24
+ data = toml.load(pyproject_path)
25
+
26
+ # Show the current version
27
+ current_version = data.get("project", {}).get("version", "unknown")
28
+ print(f"Current version: {current_version}")
29
+
30
+ # Update the version
31
+ if "project" not in data:
32
+ print("Error: 'project' section not found in pyproject.toml")
33
+ sys.exit(1)
34
+
35
+ data["project"]["version"] = version
36
+
37
+ # Write the updated content back to the file
38
+ with open(pyproject_path, "w") as f:
39
+ toml.dump(data, f)
40
+
41
+ print(f"Version updated to: {version}")
42
+
43
+ except Exception as e:
44
+ print(f"Error updating version: {e}")
45
+ sys.exit(1)
46
+
47
+
48
+ if __name__ == "__main__":
49
+ # Parse command line arguments
50
+ parser = argparse.ArgumentParser(description="Update project version in pyproject.toml")
51
+ parser.add_argument("version", help="New version to set (e.g., '0.1.0')")
52
+
53
+ args = parser.parse_args()
54
+
55
+ # Update the version
56
+ update_version(args.version)
@@ -79,4 +79,6 @@ benchmark/*.jpg
79
79
  .env
80
80
 
81
81
  *.pem
82
- *.key
82
+ *.key
83
+
84
+ *.dylib
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: httpr
3
- Version: 0.1.0
3
+ Version: 0.1.11
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: 3
6
6
  Classifier: Programming Language :: Python :: 3 :: Only
@@ -22,7 +22,7 @@ Requires-Dist: mypy>=1.14.1 ; extra == 'dev'
22
22
  Requires-Dist: ruff>=0.9.2 ; extra == 'dev'
23
23
  Requires-Dist: maturin ; extra == 'dev'
24
24
  Requires-Dist: trustme ; extra == 'dev'
25
- Requires-Dist: mkdocs-material ; extra == 'docs'
25
+ Requires-Dist: mkdocs-material[imaging] ; extra == 'docs'
26
26
  Requires-Dist: httpr[dev] ; extra == 'scratch'
27
27
  Requires-Dist: matplotlib ; extra == 'scratch'
28
28
  Requires-Dist: pandas ; extra == 'scratch'
@@ -47,19 +47,24 @@ Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
47
47
 
48
48
  # httpr
49
49
 
50
- **Blazing fast http-client** for Python in Rust 🦀 that can be used as drop-in replacement for `httpx` in most cases.
50
+ **Blazing fast http-client** for Python in Rust 🦀 that can be used as drop-in replacement for `httpx` and `requests` in most cases.
51
51
 
52
- - **Fast**: httpr is built on top of `reqwests` which is a blazing fast http client in Rust. Check out the [benchmark](#benchmark).
53
- - **Both async and sync**: httpr provides both a sync and async client.
54
- - **Lightweight**: httpr is a lightweight http client with 0 python-dependencies.
55
- - **Async**: first-class support for async/await.
56
- - **http2**: httpr supports http2.
57
- - **mTLS**: httpr supports mTLS.
58
- - **Zero python dependencies**: httpr is a pure rust library with no python dependencies.
52
+ - **Fast**: `httpr` is built on top of `reqwests`, which is a blazing fast http client in Rust. Check out the [benchmark](#benchmark).
53
+ - **Both async and sync**: `httpr` provides both a sync and async client.
54
+ - **Lightweight**: `httpr` is a lightweight http client with zero python-dependencies.
55
+ - **Async**: first-class async support.
56
+ - **http2**: `httpr` supports HTTP/2.
57
+ - **mTLS**: `httpr` supports mTLS.
58
+
59
+ ## Not implemented yet
60
+
61
+ - **Streaming**: Streaming is not implemented yet.
62
+ - **Fine-grained error handling**: Fine-grained error handling is not implemented yet.
59
63
 
60
64
  ## Table of Contents
61
65
 
62
66
  - [httpr](#httpr)
67
+ - [Not implemented yet](#not-implemented-yet)
63
68
  - [Table of Contents](#table-of-contents)
64
69
  - [Installation](#installation)
65
70
  - [Install with uv](#install-with-uv)
@@ -310,7 +315,8 @@ Provides precompiled wheels for the following platforms:
310
315
 
311
316
  ## Acknowledgements
312
317
 
313
- - [PRIMP](https://github.com/deedy5/primp): *A lot* of code is borrowed from PRIMP, that wraps rust library `rquest` for python in a similar way.
318
+ - [uv](https://docs.astral.sh/uv/): The package manager used, and for leading the way in the "Rust for python tools"-sphere.
319
+ - [primp](https://github.com/deedy5/primp): *A lot* of code is borrowed from primp, that wraps rust library `rquest` for python in a similar way. If primp supported mTLS, I would have used it instead.
314
320
  - [reqwests](https://github.com/seanmonstar/reqwest): The rust library that powers httpr.
315
321
  - [pyo3](https://github.com/PyO3/pyo3)
316
322
  - [maturin](https://github.com/PyO3/maturin)
@@ -1,18 +1,23 @@
1
1
  # httpr
2
2
 
3
- **Blazing fast http-client** for Python in Rust 🦀 that can be used as drop-in replacement for `httpx` in most cases.
3
+ **Blazing fast http-client** for Python in Rust 🦀 that can be used as drop-in replacement for `httpx` and `requests` in most cases.
4
4
 
5
- - **Fast**: httpr is built on top of `reqwests` which is a blazing fast http client in Rust. Check out the [benchmark](#benchmark).
6
- - **Both async and sync**: httpr provides both a sync and async client.
7
- - **Lightweight**: httpr is a lightweight http client with 0 python-dependencies.
8
- - **Async**: first-class support for async/await.
9
- - **http2**: httpr supports http2.
10
- - **mTLS**: httpr supports mTLS.
11
- - **Zero python dependencies**: httpr is a pure rust library with no python dependencies.
5
+ - **Fast**: `httpr` is built on top of `reqwests`, which is a blazing fast http client in Rust. Check out the [benchmark](#benchmark).
6
+ - **Both async and sync**: `httpr` provides both a sync and async client.
7
+ - **Lightweight**: `httpr` is a lightweight http client with zero python-dependencies.
8
+ - **Async**: first-class async support.
9
+ - **http2**: `httpr` supports HTTP/2.
10
+ - **mTLS**: `httpr` supports mTLS.
11
+
12
+ ## Not implemented yet
13
+
14
+ - **Streaming**: Streaming is not implemented yet.
15
+ - **Fine-grained error handling**: Fine-grained error handling is not implemented yet.
12
16
 
13
17
  ## Table of Contents
14
18
 
15
19
  - [httpr](#httpr)
20
+ - [Not implemented yet](#not-implemented-yet)
16
21
  - [Table of Contents](#table-of-contents)
17
22
  - [Installation](#installation)
18
23
  - [Install with uv](#install-with-uv)
@@ -263,7 +268,8 @@ Provides precompiled wheels for the following platforms:
263
268
 
264
269
  ## Acknowledgements
265
270
 
266
- - [PRIMP](https://github.com/deedy5/primp): *A lot* of code is borrowed from PRIMP, that wraps rust library `rquest` for python in a similar way.
271
+ - [uv](https://docs.astral.sh/uv/): The package manager used, and for leading the way in the "Rust for python tools"-sphere.
272
+ - [primp](https://github.com/deedy5/primp): *A lot* of code is borrowed from primp, that wraps rust library `rquest` for python in a similar way. If primp supported mTLS, I would have used it instead.
267
273
  - [reqwests](https://github.com/seanmonstar/reqwest): The rust library that powers httpr.
268
274
  - [pyo3](https://github.com/PyO3/pyo3)
269
275
  - [maturin](https://github.com/PyO3/maturin)
Binary file
@@ -0,0 +1 @@
1
+ # Blog
@@ -0,0 +1,9 @@
1
+ ---
2
+ date: 2025-02-25T00:00:00-07:00
3
+ social:
4
+ cards: true
5
+ ---
6
+
7
+ # Lorem ipsum dolor sit amet
8
+
9
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Donec et mollis dolor. Praesent et diam eget libero egestas mattis sit amet vitae augue. Nam tincidunt est et ultrices eleifend, nunc risus varius orci, in dignissim purus enim quis turpis.
@@ -80,6 +80,10 @@ class Client(RClient):
80
80
  # Validate the HTTP method. Raise an exception if it's not supported.
81
81
  if method not in ["GET", "HEAD", "OPTIONS", "DELETE", "POST", "PUT", "PATCH"]:
82
82
  raise ValueError(f"Unsupported HTTP method: {method}")
83
+ # Convert all params values to strings if params is present
84
+ if "params" in kwargs and kwargs["params"] is not None:
85
+ kwargs["params"] = {k: str(v) for k, v in kwargs["params"].items()}
86
+
83
87
  return super().request(method=method, url=url, **kwargs)
84
88
 
85
89
  def get(self, url: str, **kwargs: Unpack[RequestParams]) -> Response:
@@ -114,11 +118,21 @@ class AsyncClient(Client):
114
118
  async def __aexit__(self, *args):
115
119
  del self
116
120
 
121
+ async def aclose(self):
122
+ del self
123
+ return
124
+
117
125
  async def _run_sync_asyncio(self, fn, *args, **kwargs):
118
126
  loop = asyncio.get_running_loop()
119
127
  return await loop.run_in_executor(None, partial(fn, *args, **kwargs))
120
128
 
121
129
  async def request(self, method: HttpMethod, url: str, **kwargs: Unpack[RequestParams]): # type: ignore
130
+ if method not in ["GET", "HEAD", "OPTIONS", "DELETE", "POST", "PUT", "PATCH"]:
131
+ raise ValueError(f"Unsupported HTTP method: {method}")
132
+ # Convert all params values to strings if params is present
133
+ if "params" in kwargs and kwargs["params"] is not None:
134
+ kwargs["params"] = {k: str(v) for k, v in kwargs["params"].items()}
135
+
122
136
  return await self._run_sync_asyncio(super().request, method=method, url=url, **kwargs)
123
137
 
124
138
  async def get(self, url: str, **kwargs: Unpack[RequestParams]): # type: ignore
@@ -0,0 +1,41 @@
1
+ site_name: httpr
2
+ site_url: https://thomasht86.github.io/httpr
3
+ plugins:
4
+ - search
5
+ - blog:
6
+ blog_dir: writings
7
+ - social:
8
+ enabled: true
9
+
10
+ nav:
11
+ - Home: index.md
12
+ - Docs: docs.md
13
+ - Blog: writings/index.md
14
+
15
+ theme:
16
+ name: material
17
+ font:
18
+ text: Lato
19
+ code: Fira Code
20
+ features:
21
+ - content.code.copy
22
+ - search.suggest
23
+
24
+ markdown_extensions:
25
+ - attr_list
26
+ - admonition
27
+ - pymdownx.betterem
28
+ - toc:
29
+ permalink: true
30
+ - pymdownx.highlight:
31
+ anchor_linenums: true
32
+ line_spans: __span
33
+ pygments_lang_class: true
34
+ - pymdownx.inlinehilite
35
+ - pymdownx.snippets
36
+ - pymdownx.superfences
37
+ - pymdownx.tabbed:
38
+ alternate_style: true
39
+ - pymdownx.emoji
40
+ - pymdownx.keys
41
+ - footnotes
@@ -0,0 +1,49 @@
1
+ [build-system]
2
+ requires = [ "maturin>=1.5,<2.0",]
3
+ build-backend = "maturin"
4
+
5
+ [project]
6
+ name = "httpr"
7
+ description = "Fast HTTP client for Python"
8
+ requires-python = ">=3.9"
9
+ keywords = [ "python", "request",]
10
+ classifiers = [ "Programming Language :: Rust", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Internet :: WWW/HTTP", "Topic :: Software Development :: Libraries :: Python Modules",]
11
+ dynamic = [ "version",]
12
+ dependencies = []
13
+ version = "0.1.11"
14
+ [[project.authors]]
15
+ name = "thomasht86"
16
+
17
+ [project.license]
18
+ text = "MIT License"
19
+
20
+ [project.optional-dependencies]
21
+ dev = [ "certifi", "pytest>=8.1.1", "pytest-asyncio>=0.25.3", "typing_extensions; python_version <= '3.11'", "mypy>=1.14.1", "ruff>=0.9.2", "maturin", "trustme",]
22
+ docs = [ "mkdocs-material[imaging]",]
23
+ scratch = [ "httpr[dev]", "matplotlib", "pandas", "jupyter", "ipykernel", "httpx", "gunicorn", "uvicorn", "trustme", "starlette", "fastapi",]
24
+
25
+ [tool.maturin]
26
+ features = [ "pyo3/extension-module",]
27
+
28
+ [tool.ruff]
29
+ line-length = 120
30
+ exclude = [ "tests",]
31
+
32
+ [tool.mypy]
33
+ python_version = "0.1.5"
34
+
35
+ [tool.uv]
36
+ [[tool.uv.cache-keys]]
37
+ file = "pyproject.toml"
38
+
39
+ [[tool.uv.cache-keys]]
40
+ file = "rust/Cargo.toml"
41
+
42
+ [[tool.uv.cache-keys]]
43
+ file = "**/*.rs"
44
+
45
+ [tool.ruff.lint]
46
+ select = [ "E", "F", "UP", "B", "SIM", "I",]
47
+
48
+ [tool.uv.workspace]
49
+ members = [ "benchmark",]
@@ -440,5 +440,6 @@ fn httpr(_py: Python, m: &Bound<'_, PyModule>) -> PyResult<()> {
440
440
  pyo3_log::init();
441
441
 
442
442
  m.add_class::<RClient>()?;
443
+ m.add_class::<Response>()?;
443
444
  Ok(())
444
445
  }
@@ -219,7 +219,7 @@ def test_client_post_json():
219
219
  auth_bearer = "bearerXXXXXXXXXXXXXXXXXXXX"
220
220
  headers = {"X-Test": "test"}
221
221
  cookies = {"ccc": "ddd", "cccc": "dddd"}
222
- params = {"x": "aaa", "y": "bbb"}
222
+ params = {"x": "aaa", "y": "bbb", "z": 3}
223
223
  data = {"key1": "value1", "key2": "value2"}
224
224
  response = client.post(
225
225
  "https://httpbin.org/anything",
@@ -235,7 +235,7 @@ def test_client_post_json():
235
235
  assert json_data["headers"]["X-Test"] == "test"
236
236
  assert json_data["headers"]["Cookie"] == "ccc=ddd; cccc=dddd"
237
237
  assert json_data["headers"]["Authorization"] == "Bearer bearerXXXXXXXXXXXXXXXXXXXX"
238
- assert json_data["args"] == {"x": "aaa", "y": "bbb"}
238
+ assert json_data["args"] == {"x": "aaa", "y": "bbb", "z": "3"}
239
239
  assert json_data["json"] == data
240
240
 
241
241
 
@@ -308,6 +308,34 @@ css = [
308
308
  { name = "tinycss2" },
309
309
  ]
310
310
 
311
+ [[package]]
312
+ name = "cairocffi"
313
+ version = "1.7.1"
314
+ source = { registry = "https://pypi.org/simple" }
315
+ dependencies = [
316
+ { name = "cffi" },
317
+ ]
318
+ sdist = { url = "https://files.pythonhosted.org/packages/70/c5/1a4dc131459e68a173cbdab5fad6b524f53f9c1ef7861b7698e998b837cc/cairocffi-1.7.1.tar.gz", hash = "sha256:2e48ee864884ec4a3a34bfa8c9ab9999f688286eb714a15a43ec9d068c36557b", size = 88096 }
319
+ wheels = [
320
+ { url = "https://files.pythonhosted.org/packages/93/d8/ba13451aa6b745c49536e87b6bf8f629b950e84bd0e8308f7dc6883b67e2/cairocffi-1.7.1-py3-none-any.whl", hash = "sha256:9803a0e11f6c962f3b0ae2ec8ba6ae45e957a146a004697a1ac1bbf16b073b3f", size = 75611 },
321
+ ]
322
+
323
+ [[package]]
324
+ name = "cairosvg"
325
+ version = "2.7.1"
326
+ source = { registry = "https://pypi.org/simple" }
327
+ dependencies = [
328
+ { name = "cairocffi" },
329
+ { name = "cssselect2" },
330
+ { name = "defusedxml" },
331
+ { name = "pillow" },
332
+ { name = "tinycss2" },
333
+ ]
334
+ sdist = { url = "https://files.pythonhosted.org/packages/d5/e6/ec5900b724e3c44af7f6f51f719919137284e5da4aabe96508baec8a1b40/CairoSVG-2.7.1.tar.gz", hash = "sha256:432531d72347291b9a9ebfb6777026b607563fd8719c46ee742db0aef7271ba0", size = 8399085 }
335
+ wheels = [
336
+ { url = "https://files.pythonhosted.org/packages/01/a5/1866b42151f50453f1a0d28fc4c39f5be5f412a2e914f33449c42daafdf1/CairoSVG-2.7.1-py3-none-any.whl", hash = "sha256:8a5222d4e6c3f86f1f7046b63246877a63b49923a1cd202184c3a634ef546b3b", size = 43235 },
337
+ ]
338
+
311
339
  [[package]]
312
340
  name = "certifi"
313
341
  version = "2025.1.31"
@@ -638,6 +666,19 @@ wheels = [
638
666
  { url = "https://files.pythonhosted.org/packages/cc/9d/37e5da7519de7b0b070a3fedd4230fe76d50d2a21403e0f2153d70ac4163/cryptography-44.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:62901fb618f74d7d81bf408c8719e9ec14d863086efe4185afd07c352aee1d2c", size = 3128774 },
639
667
  ]
640
668
 
669
+ [[package]]
670
+ name = "cssselect2"
671
+ version = "0.7.0"
672
+ source = { registry = "https://pypi.org/simple" }
673
+ dependencies = [
674
+ { name = "tinycss2" },
675
+ { name = "webencodings" },
676
+ ]
677
+ sdist = { url = "https://files.pythonhosted.org/packages/e7/fc/326cb6f988905998f09bb54a3f5d98d4462ba119363c0dfad29750d48c09/cssselect2-0.7.0.tar.gz", hash = "sha256:1ccd984dab89fc68955043aca4e1b03e0cf29cad9880f6e28e3ba7a74b14aa5a", size = 35888 }
678
+ wheels = [
679
+ { url = "https://files.pythonhosted.org/packages/9d/3a/e39436efe51894243ff145a37c4f9a030839b97779ebcc4f13b3ba21c54e/cssselect2-0.7.0-py3-none-any.whl", hash = "sha256:fd23a65bfd444595913f02fc71f6b286c29261e354c41d722ca7a261a49b5969", size = 15586 },
680
+ ]
681
+
641
682
  [[package]]
642
683
  name = "curl-cffi"
643
684
  version = "0.7.4"
@@ -934,7 +975,7 @@ dev = [
934
975
  { name = "typing-extensions", marker = "python_full_version < '3.12'" },
935
976
  ]
936
977
  docs = [
937
- { name = "mkdocs-material" },
978
+ { name = "mkdocs-material", extra = ["imaging"] },
938
979
  ]
939
980
  scratch = [
940
981
  { name = "certifi" },
@@ -967,7 +1008,7 @@ requires-dist = [
967
1008
  { name = "jupyter", marker = "extra == 'scratch'" },
968
1009
  { name = "matplotlib", marker = "extra == 'scratch'" },
969
1010
  { name = "maturin", marker = "extra == 'dev'" },
970
- { name = "mkdocs-material", marker = "extra == 'docs'" },
1011
+ { name = "mkdocs-material", extras = ["imaging"], marker = "extra == 'docs'" },
971
1012
  { name = "mypy", marker = "extra == 'dev'", specifier = ">=1.14.1" },
972
1013
  { name = "pandas", marker = "extra == 'scratch'" },
973
1014
  { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.1.1" },
@@ -1807,6 +1848,12 @@ wheels = [
1807
1848
  { url = "https://files.pythonhosted.org/packages/5b/a5/f3c0e86c1d28fe04f1b724700ff3dd8b3647c89df03a8e10c4bc6b4db1b8/mkdocs_material-9.6.4-py3-none-any.whl", hash = "sha256:414e8376551def6d644b8e6f77226022868532a792eb2c9accf52199009f568f", size = 8688727 },
1808
1849
  ]
1809
1850
 
1851
+ [package.optional-dependencies]
1852
+ imaging = [
1853
+ { name = "cairosvg" },
1854
+ { name = "pillow" },
1855
+ ]
1856
+
1810
1857
  [[package]]
1811
1858
  name = "mkdocs-material-extensions"
1812
1859
  version = "1.3.1"
@@ -2251,69 +2298,61 @@ wheels = [
2251
2298
 
2252
2299
  [[package]]
2253
2300
  name = "pillow"
2254
- version = "11.1.0"
2255
- source = { registry = "https://pypi.org/simple" }
2256
- sdist = { url = "https://files.pythonhosted.org/packages/f3/af/c097e544e7bd278333db77933e535098c259609c4eb3b85381109602fb5b/pillow-11.1.0.tar.gz", hash = "sha256:368da70808b36d73b4b390a8ffac11069f8a5c85f29eff1f1b01bcf3ef5b2a20", size = 46742715 }
2257
- wheels = [
2258
- { url = "https://files.pythonhosted.org/packages/50/1c/2dcea34ac3d7bc96a1fd1bd0a6e06a57c67167fec2cff8d95d88229a8817/pillow-11.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:e1abe69aca89514737465752b4bcaf8016de61b3be1397a8fc260ba33321b3a8", size = 3229983 },
2259
- { url = "https://files.pythonhosted.org/packages/14/ca/6bec3df25e4c88432681de94a3531cc738bd85dea6c7aa6ab6f81ad8bd11/pillow-11.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c640e5a06869c75994624551f45e5506e4256562ead981cce820d5ab39ae2192", size = 3101831 },
2260
- { url = "https://files.pythonhosted.org/packages/d4/2c/668e18e5521e46eb9667b09e501d8e07049eb5bfe39d56be0724a43117e6/pillow-11.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a07dba04c5e22824816b2615ad7a7484432d7f540e6fa86af60d2de57b0fcee2", size = 4314074 },
2261
- { url = "https://files.pythonhosted.org/packages/02/80/79f99b714f0fc25f6a8499ecfd1f810df12aec170ea1e32a4f75746051ce/pillow-11.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e267b0ed063341f3e60acd25c05200df4193e15a4a5807075cd71225a2386e26", size = 4394933 },
2262
- { url = "https://files.pythonhosted.org/packages/81/aa/8d4ad25dc11fd10a2001d5b8a80fdc0e564ac33b293bdfe04ed387e0fd95/pillow-11.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bd165131fd51697e22421d0e467997ad31621b74bfc0b75956608cb2906dda07", size = 4353349 },
2263
- { url = "https://files.pythonhosted.org/packages/84/7a/cd0c3eaf4a28cb2a74bdd19129f7726277a7f30c4f8424cd27a62987d864/pillow-11.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:abc56501c3fd148d60659aae0af6ddc149660469082859fa7b066a298bde9482", size = 4476532 },
2264
- { url = "https://files.pythonhosted.org/packages/8f/8b/a907fdd3ae8f01c7670dfb1499c53c28e217c338b47a813af8d815e7ce97/pillow-11.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:54ce1c9a16a9561b6d6d8cb30089ab1e5eb66918cb47d457bd996ef34182922e", size = 4279789 },
2265
- { url = "https://files.pythonhosted.org/packages/6f/9a/9f139d9e8cccd661c3efbf6898967a9a337eb2e9be2b454ba0a09533100d/pillow-11.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:73ddde795ee9b06257dac5ad42fcb07f3b9b813f8c1f7f870f402f4dc54b5269", size = 4413131 },
2266
- { url = "https://files.pythonhosted.org/packages/a8/68/0d8d461f42a3f37432203c8e6df94da10ac8081b6d35af1c203bf3111088/pillow-11.1.0-cp310-cp310-win32.whl", hash = "sha256:3a5fe20a7b66e8135d7fd617b13272626a28278d0e578c98720d9ba4b2439d49", size = 2291213 },
2267
- { url = "https://files.pythonhosted.org/packages/14/81/d0dff759a74ba87715509af9f6cb21fa21d93b02b3316ed43bda83664db9/pillow-11.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:b6123aa4a59d75f06e9dd3dac5bf8bc9aa383121bb3dd9a7a612e05eabc9961a", size = 2625725 },
2268
- { url = "https://files.pythonhosted.org/packages/ce/1f/8d50c096a1d58ef0584ddc37e6f602828515219e9d2428e14ce50f5ecad1/pillow-11.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:a76da0a31da6fcae4210aa94fd779c65c75786bc9af06289cd1c184451ef7a65", size = 2375213 },
2269
- { url = "https://files.pythonhosted.org/packages/dd/d6/2000bfd8d5414fb70cbbe52c8332f2283ff30ed66a9cde42716c8ecbe22c/pillow-11.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e06695e0326d05b06833b40b7ef477e475d0b1ba3a6d27da1bb48c23209bf457", size = 3229968 },
2270
- { url = "https://files.pythonhosted.org/packages/d9/45/3fe487010dd9ce0a06adf9b8ff4f273cc0a44536e234b0fad3532a42c15b/pillow-11.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96f82000e12f23e4f29346e42702b6ed9a2f2fea34a740dd5ffffcc8c539eb35", size = 3101806 },
2271
- { url = "https://files.pythonhosted.org/packages/e3/72/776b3629c47d9d5f1c160113158a7a7ad177688d3a1159cd3b62ded5a33a/pillow-11.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3cd561ded2cf2bbae44d4605837221b987c216cff94f49dfeed63488bb228d2", size = 4322283 },
2272
- { url = "https://files.pythonhosted.org/packages/e4/c2/e25199e7e4e71d64eeb869f5b72c7ddec70e0a87926398785ab944d92375/pillow-11.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f189805c8be5ca5add39e6f899e6ce2ed824e65fb45f3c28cb2841911da19070", size = 4402945 },
2273
- { url = "https://files.pythonhosted.org/packages/c1/ed/51d6136c9d5911f78632b1b86c45241c712c5a80ed7fa7f9120a5dff1eba/pillow-11.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:dd0052e9db3474df30433f83a71b9b23bd9e4ef1de13d92df21a52c0303b8ab6", size = 4361228 },
2274
- { url = "https://files.pythonhosted.org/packages/48/a4/fbfe9d5581d7b111b28f1d8c2762dee92e9821bb209af9fa83c940e507a0/pillow-11.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:837060a8599b8f5d402e97197d4924f05a2e0d68756998345c829c33186217b1", size = 4484021 },
2275
- { url = "https://files.pythonhosted.org/packages/39/db/0b3c1a5018117f3c1d4df671fb8e47d08937f27519e8614bbe86153b65a5/pillow-11.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:aa8dd43daa836b9a8128dbe7d923423e5ad86f50a7a14dc688194b7be5c0dea2", size = 4287449 },
2276
- { url = "https://files.pythonhosted.org/packages/d9/58/bc128da7fea8c89fc85e09f773c4901e95b5936000e6f303222490c052f3/pillow-11.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0a2f91f8a8b367e7a57c6e91cd25af510168091fb89ec5146003e424e1558a96", size = 4419972 },
2277
- { url = "https://files.pythonhosted.org/packages/5f/bb/58f34379bde9fe197f51841c5bbe8830c28bbb6d3801f16a83b8f2ad37df/pillow-11.1.0-cp311-cp311-win32.whl", hash = "sha256:c12fc111ef090845de2bb15009372175d76ac99969bdf31e2ce9b42e4b8cd88f", size = 2291201 },
2278
- { url = "https://files.pythonhosted.org/packages/3a/c6/fce9255272bcf0c39e15abd2f8fd8429a954cf344469eaceb9d0d1366913/pillow-11.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbd43429d0d7ed6533b25fc993861b8fd512c42d04514a0dd6337fb3ccf22761", size = 2625686 },
2279
- { url = "https://files.pythonhosted.org/packages/c8/52/8ba066d569d932365509054859f74f2a9abee273edcef5cd75e4bc3e831e/pillow-11.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:f7955ecf5609dee9442cbface754f2c6e541d9e6eda87fad7f7a989b0bdb9d71", size = 2375194 },
2280
- { url = "https://files.pythonhosted.org/packages/95/20/9ce6ed62c91c073fcaa23d216e68289e19d95fb8188b9fb7a63d36771db8/pillow-11.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2062ffb1d36544d42fcaa277b069c88b01bb7298f4efa06731a7fd6cc290b81a", size = 3226818 },
2281
- { url = "https://files.pythonhosted.org/packages/b9/d8/f6004d98579a2596c098d1e30d10b248798cceff82d2b77aa914875bfea1/pillow-11.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a85b653980faad27e88b141348707ceeef8a1186f75ecc600c395dcac19f385b", size = 3101662 },
2282
- { url = "https://files.pythonhosted.org/packages/08/d9/892e705f90051c7a2574d9f24579c9e100c828700d78a63239676f960b74/pillow-11.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9409c080586d1f683df3f184f20e36fb647f2e0bc3988094d4fd8c9f4eb1b3b3", size = 4329317 },
2283
- { url = "https://files.pythonhosted.org/packages/8c/aa/7f29711f26680eab0bcd3ecdd6d23ed6bce180d82e3f6380fb7ae35fcf3b/pillow-11.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fdadc077553621911f27ce206ffcbec7d3f8d7b50e0da39f10997e8e2bb7f6a", size = 4412999 },
2284
- { url = "https://files.pythonhosted.org/packages/c8/c4/8f0fe3b9e0f7196f6d0bbb151f9fba323d72a41da068610c4c960b16632a/pillow-11.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:93a18841d09bcdd774dcdc308e4537e1f867b3dec059c131fde0327899734aa1", size = 4368819 },
2285
- { url = "https://files.pythonhosted.org/packages/38/0d/84200ed6a871ce386ddc82904bfadc0c6b28b0c0ec78176871a4679e40b3/pillow-11.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9aa9aeddeed452b2f616ff5507459e7bab436916ccb10961c4a382cd3e03f47f", size = 4496081 },
2286
- { url = "https://files.pythonhosted.org/packages/84/9c/9bcd66f714d7e25b64118e3952d52841a4babc6d97b6d28e2261c52045d4/pillow-11.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3cdcdb0b896e981678eee140d882b70092dac83ac1cdf6b3a60e2216a73f2b91", size = 4296513 },
2287
- { url = "https://files.pythonhosted.org/packages/db/61/ada2a226e22da011b45f7104c95ebda1b63dcbb0c378ad0f7c2a710f8fd2/pillow-11.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:36ba10b9cb413e7c7dfa3e189aba252deee0602c86c309799da5a74009ac7a1c", size = 4431298 },
2288
- { url = "https://files.pythonhosted.org/packages/e7/c4/fc6e86750523f367923522014b821c11ebc5ad402e659d8c9d09b3c9d70c/pillow-11.1.0-cp312-cp312-win32.whl", hash = "sha256:cfd5cd998c2e36a862d0e27b2df63237e67273f2fc78f47445b14e73a810e7e6", size = 2291630 },
2289
- { url = "https://files.pythonhosted.org/packages/08/5c/2104299949b9d504baf3f4d35f73dbd14ef31bbd1ddc2c1b66a5b7dfda44/pillow-11.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:a697cd8ba0383bba3d2d3ada02b34ed268cb548b369943cd349007730c92bddf", size = 2626369 },
2290
- { url = "https://files.pythonhosted.org/packages/37/f3/9b18362206b244167c958984b57c7f70a0289bfb59a530dd8af5f699b910/pillow-11.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:4dd43a78897793f60766563969442020e90eb7847463eca901e41ba186a7d4a5", size = 2375240 },
2291
- { url = "https://files.pythonhosted.org/packages/b3/31/9ca79cafdce364fd5c980cd3416c20ce1bebd235b470d262f9d24d810184/pillow-11.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae98e14432d458fc3de11a77ccb3ae65ddce70f730e7c76140653048c71bfcbc", size = 3226640 },
2292
- { url = "https://files.pythonhosted.org/packages/ac/0f/ff07ad45a1f172a497aa393b13a9d81a32e1477ef0e869d030e3c1532521/pillow-11.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cc1331b6d5a6e144aeb5e626f4375f5b7ae9934ba620c0ac6b3e43d5e683a0f0", size = 3101437 },
2293
- { url = "https://files.pythonhosted.org/packages/08/2f/9906fca87a68d29ec4530be1f893149e0cb64a86d1f9f70a7cfcdfe8ae44/pillow-11.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:758e9d4ef15d3560214cddbc97b8ef3ef86ce04d62ddac17ad39ba87e89bd3b1", size = 4326605 },
2294
- { url = "https://files.pythonhosted.org/packages/b0/0f/f3547ee15b145bc5c8b336401b2d4c9d9da67da9dcb572d7c0d4103d2c69/pillow-11.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b523466b1a31d0dcef7c5be1f20b942919b62fd6e9a9be199d035509cbefc0ec", size = 4411173 },
2295
- { url = "https://files.pythonhosted.org/packages/b1/df/bf8176aa5db515c5de584c5e00df9bab0713548fd780c82a86cba2c2fedb/pillow-11.1.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:9044b5e4f7083f209c4e35aa5dd54b1dd5b112b108648f5c902ad586d4f945c5", size = 4369145 },
2296
- { url = "https://files.pythonhosted.org/packages/de/7c/7433122d1cfadc740f577cb55526fdc39129a648ac65ce64db2eb7209277/pillow-11.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:3764d53e09cdedd91bee65c2527815d315c6b90d7b8b79759cc48d7bf5d4f114", size = 4496340 },
2297
- { url = "https://files.pythonhosted.org/packages/25/46/dd94b93ca6bd555588835f2504bd90c00d5438fe131cf01cfa0c5131a19d/pillow-11.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31eba6bbdd27dde97b0174ddf0297d7a9c3a507a8a1480e1e60ef914fe23d352", size = 4296906 },
2298
- { url = "https://files.pythonhosted.org/packages/a8/28/2f9d32014dfc7753e586db9add35b8a41b7a3b46540e965cb6d6bc607bd2/pillow-11.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b5d658fbd9f0d6eea113aea286b21d3cd4d3fd978157cbf2447a6035916506d3", size = 4431759 },
2299
- { url = "https://files.pythonhosted.org/packages/33/48/19c2cbe7403870fbe8b7737d19eb013f46299cdfe4501573367f6396c775/pillow-11.1.0-cp313-cp313-win32.whl", hash = "sha256:f86d3a7a9af5d826744fabf4afd15b9dfef44fe69a98541f666f66fbb8d3fef9", size = 2291657 },
2300
- { url = "https://files.pythonhosted.org/packages/3b/ad/285c556747d34c399f332ba7c1a595ba245796ef3e22eae190f5364bb62b/pillow-11.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:593c5fd6be85da83656b93ffcccc2312d2d149d251e98588b14fbc288fd8909c", size = 2626304 },
2301
- { url = "https://files.pythonhosted.org/packages/e5/7b/ef35a71163bf36db06e9c8729608f78dedf032fc8313d19bd4be5c2588f3/pillow-11.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:11633d58b6ee5733bde153a8dafd25e505ea3d32e261accd388827ee987baf65", size = 2375117 },
2302
- { url = "https://files.pythonhosted.org/packages/79/30/77f54228401e84d6791354888549b45824ab0ffde659bafa67956303a09f/pillow-11.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:70ca5ef3b3b1c4a0812b5c63c57c23b63e53bc38e758b37a951e5bc466449861", size = 3230060 },
2303
- { url = "https://files.pythonhosted.org/packages/ce/b1/56723b74b07dd64c1010fee011951ea9c35a43d8020acd03111f14298225/pillow-11.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8000376f139d4d38d6851eb149b321a52bb8893a88dae8ee7d95840431977081", size = 3106192 },
2304
- { url = "https://files.pythonhosted.org/packages/e1/cd/7bf7180e08f80a4dcc6b4c3a0aa9e0b0ae57168562726a05dc8aa8fa66b0/pillow-11.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ee85f0696a17dd28fbcfceb59f9510aa71934b483d1f5601d1030c3c8304f3c", size = 4446805 },
2305
- { url = "https://files.pythonhosted.org/packages/97/42/87c856ea30c8ed97e8efbe672b58c8304dee0573f8c7cab62ae9e31db6ae/pillow-11.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:dd0e081319328928531df7a0e63621caf67652c8464303fd102141b785ef9547", size = 4530623 },
2306
- { url = "https://files.pythonhosted.org/packages/ff/41/026879e90c84a88e33fb00cc6bd915ac2743c67e87a18f80270dfe3c2041/pillow-11.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e63e4e5081de46517099dc30abe418122f54531a6ae2ebc8680bcd7096860eab", size = 4465191 },
2307
- { url = "https://files.pythonhosted.org/packages/e5/fb/a7960e838bc5df57a2ce23183bfd2290d97c33028b96bde332a9057834d3/pillow-11.1.0-cp313-cp313t-win32.whl", hash = "sha256:dda60aa465b861324e65a78c9f5cf0f4bc713e4309f83bc387be158b077963d9", size = 2295494 },
2308
- { url = "https://files.pythonhosted.org/packages/d7/6c/6ec83ee2f6f0fda8d4cf89045c6be4b0373ebfc363ba8538f8c999f63fcd/pillow-11.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ad5db5781c774ab9a9b2c4302bbf0c1014960a0a7be63278d13ae6fdf88126fe", size = 2631595 },
2309
- { url = "https://files.pythonhosted.org/packages/cf/6c/41c21c6c8af92b9fea313aa47c75de49e2f9a467964ee33eb0135d47eb64/pillow-11.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756", size = 2377651 },
2310
- { url = "https://files.pythonhosted.org/packages/fa/c5/389961578fb677b8b3244fcd934f720ed25a148b9a5cc81c91bdf59d8588/pillow-11.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8c730dc3a83e5ac137fbc92dfcfe1511ce3b2b5d7578315b63dbbb76f7f51d90", size = 3198345 },
2311
- { url = "https://files.pythonhosted.org/packages/c4/fa/803c0e50ffee74d4b965229e816af55276eac1d5806712de86f9371858fd/pillow-11.1.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:7d33d2fae0e8b170b6a6c57400e077412240f6f5bb2a342cf1ee512a787942bb", size = 3072938 },
2312
- { url = "https://files.pythonhosted.org/packages/dc/67/2a3a5f8012b5d8c63fe53958ba906c1b1d0482ebed5618057ef4d22f8076/pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8d65b38173085f24bc07f8b6c505cbb7418009fa1a1fcb111b1f4961814a442", size = 3400049 },
2313
- { url = "https://files.pythonhosted.org/packages/e5/a0/514f0d317446c98c478d1872497eb92e7cde67003fed74f696441e647446/pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:015c6e863faa4779251436db398ae75051469f7c903b043a48f078e437656f83", size = 3422431 },
2314
- { url = "https://files.pythonhosted.org/packages/cd/00/20f40a935514037b7d3f87adfc87d2c538430ea625b63b3af8c3f5578e72/pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d44ff19eea13ae4acdaaab0179fa68c0c6f2f45d66a4d8ec1eda7d6cecbcc15f", size = 3446208 },
2315
- { url = "https://files.pythonhosted.org/packages/28/3c/7de681727963043e093c72e6c3348411b0185eab3263100d4490234ba2f6/pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d3d8da4a631471dfaf94c10c85f5277b1f8e42ac42bade1ac67da4b4a7359b73", size = 3509746 },
2316
- { url = "https://files.pythonhosted.org/packages/41/67/936f9814bdd74b2dfd4822f1f7725ab5d8ff4103919a1664eb4874c58b2f/pillow-11.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:4637b88343166249fe8aa94e7c4a62a180c4b3898283bb5d3d2fd5fe10d8e4e0", size = 2626353 },
2301
+ version = "10.4.0"
2302
+ source = { registry = "https://pypi.org/simple" }
2303
+ sdist = { url = "https://files.pythonhosted.org/packages/cd/74/ad3d526f3bf7b6d3f408b73fde271ec69dfac8b81341a318ce825f2b3812/pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06", size = 46555059 }
2304
+ wheels = [
2305
+ { url = "https://files.pythonhosted.org/packages/0e/69/a31cccd538ca0b5272be2a38347f8839b97a14be104ea08b0db92f749c74/pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e", size = 3509271 },
2306
+ { url = "https://files.pythonhosted.org/packages/9a/9e/4143b907be8ea0bce215f2ae4f7480027473f8b61fcedfda9d851082a5d2/pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d", size = 3375658 },
2307
+ { url = "https://files.pythonhosted.org/packages/8a/25/1fc45761955f9359b1169aa75e241551e74ac01a09f487adaaf4c3472d11/pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856", size = 4332075 },
2308
+ { url = "https://files.pythonhosted.org/packages/5e/dd/425b95d0151e1d6c951f45051112394f130df3da67363b6bc75dc4c27aba/pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f", size = 4444808 },
2309
+ { url = "https://files.pythonhosted.org/packages/b1/84/9a15cc5726cbbfe7f9f90bfb11f5d028586595907cd093815ca6644932e3/pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b", size = 4356290 },
2310
+ { url = "https://files.pythonhosted.org/packages/b5/5b/6651c288b08df3b8c1e2f8c1152201e0b25d240e22ddade0f1e242fc9fa0/pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc", size = 4525163 },
2311
+ { url = "https://files.pythonhosted.org/packages/07/8b/34854bf11a83c248505c8cb0fcf8d3d0b459a2246c8809b967963b6b12ae/pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e", size = 4463100 },
2312
+ { url = "https://files.pythonhosted.org/packages/78/63/0632aee4e82476d9cbe5200c0cdf9ba41ee04ed77887432845264d81116d/pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46", size = 4592880 },
2313
+ { url = "https://files.pythonhosted.org/packages/df/56/b8663d7520671b4398b9d97e1ed9f583d4afcbefbda3c6188325e8c297bd/pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984", size = 2235218 },
2314
+ { url = "https://files.pythonhosted.org/packages/f4/72/0203e94a91ddb4a9d5238434ae6c1ca10e610e8487036132ea9bf806ca2a/pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141", size = 2554487 },
2315
+ { url = "https://files.pythonhosted.org/packages/bd/52/7e7e93d7a6e4290543f17dc6f7d3af4bd0b3dd9926e2e8a35ac2282bc5f4/pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1", size = 2243219 },
2316
+ { url = "https://files.pythonhosted.org/packages/a7/62/c9449f9c3043c37f73e7487ec4ef0c03eb9c9afc91a92b977a67b3c0bbc5/pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c", size = 3509265 },
2317
+ { url = "https://files.pythonhosted.org/packages/f4/5f/491dafc7bbf5a3cc1845dc0430872e8096eb9e2b6f8161509d124594ec2d/pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be", size = 3375655 },
2318
+ { url = "https://files.pythonhosted.org/packages/73/d5/c4011a76f4207a3c151134cd22a1415741e42fa5ddecec7c0182887deb3d/pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3", size = 4340304 },
2319
+ { url = "https://files.pythonhosted.org/packages/ac/10/c67e20445a707f7a610699bba4fe050583b688d8cd2d202572b257f46600/pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6", size = 4452804 },
2320
+ { url = "https://files.pythonhosted.org/packages/a9/83/6523837906d1da2b269dee787e31df3b0acb12e3d08f024965a3e7f64665/pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe", size = 4365126 },
2321
+ { url = "https://files.pythonhosted.org/packages/ba/e5/8c68ff608a4203085158cff5cc2a3c534ec384536d9438c405ed6370d080/pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319", size = 4533541 },
2322
+ { url = "https://files.pythonhosted.org/packages/f4/7c/01b8dbdca5bc6785573f4cee96e2358b0918b7b2c7b60d8b6f3abf87a070/pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d", size = 4471616 },
2323
+ { url = "https://files.pythonhosted.org/packages/c8/57/2899b82394a35a0fbfd352e290945440e3b3785655a03365c0ca8279f351/pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696", size = 4600802 },
2324
+ { url = "https://files.pythonhosted.org/packages/4d/d7/a44f193d4c26e58ee5d2d9db3d4854b2cfb5b5e08d360a5e03fe987c0086/pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496", size = 2235213 },
2325
+ { url = "https://files.pythonhosted.org/packages/c1/d0/5866318eec2b801cdb8c82abf190c8343d8a1cd8bf5a0c17444a6f268291/pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91", size = 2554498 },
2326
+ { url = "https://files.pythonhosted.org/packages/d4/c8/310ac16ac2b97e902d9eb438688de0d961660a87703ad1561fd3dfbd2aa0/pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22", size = 2243219 },
2327
+ { url = "https://files.pythonhosted.org/packages/05/cb/0353013dc30c02a8be34eb91d25e4e4cf594b59e5a55ea1128fde1e5f8ea/pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94", size = 3509350 },
2328
+ { url = "https://files.pythonhosted.org/packages/e7/cf/5c558a0f247e0bf9cec92bff9b46ae6474dd736f6d906315e60e4075f737/pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597", size = 3374980 },
2329
+ { url = "https://files.pythonhosted.org/packages/84/48/6e394b86369a4eb68b8a1382c78dc092245af517385c086c5094e3b34428/pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80", size = 4343799 },
2330
+ { url = "https://files.pythonhosted.org/packages/3b/f3/a8c6c11fa84b59b9df0cd5694492da8c039a24cd159f0f6918690105c3be/pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca", size = 4459973 },
2331
+ { url = "https://files.pythonhosted.org/packages/7d/1b/c14b4197b80150fb64453585247e6fb2e1d93761fa0fa9cf63b102fde822/pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef", size = 4370054 },
2332
+ { url = "https://files.pythonhosted.org/packages/55/77/40daddf677897a923d5d33329acd52a2144d54a9644f2a5422c028c6bf2d/pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a", size = 4539484 },
2333
+ { url = "https://files.pythonhosted.org/packages/40/54/90de3e4256b1207300fb2b1d7168dd912a2fb4b2401e439ba23c2b2cabde/pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b", size = 4477375 },
2334
+ { url = "https://files.pythonhosted.org/packages/13/24/1bfba52f44193860918ff7c93d03d95e3f8748ca1de3ceaf11157a14cf16/pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9", size = 4608773 },
2335
+ { url = "https://files.pythonhosted.org/packages/55/04/5e6de6e6120451ec0c24516c41dbaf80cce1b6451f96561235ef2429da2e/pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42", size = 2235690 },
2336
+ { url = "https://files.pythonhosted.org/packages/74/0a/d4ce3c44bca8635bd29a2eab5aa181b654a734a29b263ca8efe013beea98/pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a", size = 2554951 },
2337
+ { url = "https://files.pythonhosted.org/packages/b5/ca/184349ee40f2e92439be9b3502ae6cfc43ac4b50bc4fc6b3de7957563894/pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9", size = 2243427 },
2338
+ { url = "https://files.pythonhosted.org/packages/c3/00/706cebe7c2c12a6318aabe5d354836f54adff7156fd9e1bd6c89f4ba0e98/pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3", size = 3525685 },
2339
+ { url = "https://files.pythonhosted.org/packages/cf/76/f658cbfa49405e5ecbfb9ba42d07074ad9792031267e782d409fd8fe7c69/pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb", size = 3374883 },
2340
+ { url = "https://files.pythonhosted.org/packages/46/2b/99c28c4379a85e65378211971c0b430d9c7234b1ec4d59b2668f6299e011/pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70", size = 4339837 },
2341
+ { url = "https://files.pythonhosted.org/packages/f1/74/b1ec314f624c0c43711fdf0d8076f82d9d802afd58f1d62c2a86878e8615/pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be", size = 4455562 },
2342
+ { url = "https://files.pythonhosted.org/packages/4a/2a/4b04157cb7b9c74372fa867096a1607e6fedad93a44deeff553ccd307868/pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0", size = 4366761 },
2343
+ { url = "https://files.pythonhosted.org/packages/ac/7b/8f1d815c1a6a268fe90481232c98dd0e5fa8c75e341a75f060037bd5ceae/pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc", size = 4536767 },
2344
+ { url = "https://files.pythonhosted.org/packages/e5/77/05fa64d1f45d12c22c314e7b97398ffb28ef2813a485465017b7978b3ce7/pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a", size = 4477989 },
2345
+ { url = "https://files.pythonhosted.org/packages/12/63/b0397cfc2caae05c3fb2f4ed1b4fc4fc878f0243510a7a6034ca59726494/pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309", size = 4610255 },
2346
+ { url = "https://files.pythonhosted.org/packages/7b/f9/cfaa5082ca9bc4a6de66ffe1c12c2d90bf09c309a5f52b27759a596900e7/pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060", size = 2235603 },
2347
+ { url = "https://files.pythonhosted.org/packages/01/6a/30ff0eef6e0c0e71e55ded56a38d4859bf9d3634a94a88743897b5f96936/pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea", size = 2554972 },
2348
+ { url = "https://files.pythonhosted.org/packages/48/2c/2e0a52890f269435eee38b21c8218e102c621fe8d8df8b9dd06fabf879ba/pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d", size = 2243375 },
2349
+ { url = "https://files.pythonhosted.org/packages/38/30/095d4f55f3a053392f75e2eae45eba3228452783bab3d9a920b951ac495c/pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4", size = 3493889 },
2350
+ { url = "https://files.pythonhosted.org/packages/f3/e8/4ff79788803a5fcd5dc35efdc9386af153569853767bff74540725b45863/pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da", size = 3346160 },
2351
+ { url = "https://files.pythonhosted.org/packages/d7/ac/4184edd511b14f760c73f5bb8a5d6fd85c591c8aff7c2229677a355c4179/pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026", size = 3435020 },
2352
+ { url = "https://files.pythonhosted.org/packages/da/21/1749cd09160149c0a246a81d646e05f35041619ce76f6493d6a96e8d1103/pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e", size = 3490539 },
2353
+ { url = "https://files.pythonhosted.org/packages/b6/f5/f71fe1888b96083b3f6dfa0709101f61fc9e972c0c8d04e9d93ccef2a045/pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5", size = 3476125 },
2354
+ { url = "https://files.pythonhosted.org/packages/96/b9/c0362c54290a31866c3526848583a2f45a535aa9d725fd31e25d318c805f/pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885", size = 3579373 },
2355
+ { url = "https://files.pythonhosted.org/packages/52/3b/ce7a01026a7cf46e5452afa86f97a5e88ca97f562cafa76570178ab56d8d/pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5", size = 2554661 },
2317
2356
  ]
2318
2357
 
2319
2358
  [[package]]
httpr-0.1.0/benchmark.jpg DELETED
Binary file
httpr-0.1.0/mkdocs.yml DELETED
@@ -1,4 +0,0 @@
1
- site_name: httpr
2
- site_url: https://thomasht86.github.io/httpr
3
- theme:
4
- name: material
@@ -1,87 +0,0 @@
1
- [build-system]
2
- requires = ["maturin>=1.5,<2.0"]
3
- build-backend = "maturin"
4
-
5
- [project]
6
- name = "httpr"
7
- description = "Fast HTTP client for Python"
8
- requires-python = ">=3.9"
9
- license = { text = "MIT License" }
10
- keywords = ["python", "request"]
11
- authors = [{ name = "thomasht86" }]
12
- classifiers = [
13
- "Programming Language :: Rust",
14
- "Programming Language :: Python :: 3",
15
- "Programming Language :: Python :: 3 :: Only",
16
- "Programming Language :: Python :: 3.8",
17
- "Programming Language :: Python :: 3.9",
18
- "Programming Language :: Python :: 3.10",
19
- "Programming Language :: Python :: 3.11",
20
- "Programming Language :: Python :: 3.12",
21
- "Programming Language :: Python :: 3.13",
22
- "Programming Language :: Python :: Implementation :: CPython",
23
- "Programming Language :: Python :: Implementation :: PyPy",
24
- "Topic :: Internet :: WWW/HTTP",
25
- "Topic :: Software Development :: Libraries :: Python Modules",
26
- ]
27
- dynamic = ["version"]
28
-
29
- dependencies = []
30
-
31
- [project.optional-dependencies]
32
- dev = [
33
- "certifi",
34
- "pytest>=8.1.1",
35
- "pytest-asyncio>=0.25.3",
36
- "typing_extensions; python_version <= '3.11'", # for Unpack[TypedDict]
37
- "mypy>=1.14.1",
38
- "ruff>=0.9.2",
39
- "maturin",
40
- "trustme",
41
- ]
42
- docs = ["mkdocs-material"]
43
- scratch = [
44
- "httpr[dev]",
45
- "matplotlib",
46
- "pandas",
47
- "jupyter",
48
- "ipykernel",
49
- "httpx",
50
- "gunicorn",
51
- "uvicorn",
52
- "trustme",
53
- "starlette",
54
- "fastapi",
55
- ]
56
-
57
- [tool.maturin]
58
- features = ["pyo3/extension-module"]
59
-
60
- [tool.ruff]
61
- line-length = 120
62
- exclude = ["tests"]
63
-
64
- [tool.ruff.lint]
65
- select = [
66
- "E", # pycodestyle
67
- "F", # Pyflakes
68
- "UP", # pyupgrade
69
- "B", # flake8-bugbear
70
- "SIM", # flake8-simplify
71
- "I", # isort
72
- ]
73
-
74
- [tool.mypy]
75
- python_version = "3.8"
76
-
77
- [tool.uv]
78
- # Rebuild package when any rust files change
79
- cache-keys = [
80
- { file = "pyproject.toml" },
81
- { file = "rust/Cargo.toml" },
82
- { file = "**/*.rs" },
83
- ]
84
- # Uncomment to build rust code in development mode
85
- # config-settings = { build-args = '--profile=dev' }
86
- [tool.uv.workspace]
87
- members = ["benchmark"]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes