# robinzhon
Minimal, high-performance Python helpers for concurrent S3 object transfers.
A small extension that exposes fast, concurrent downloads (and uploads) to Python
using a Rust implementation optimized for I/O-bound workloads.
## Install
- From PyPI: `pip install robinzhon` or `uv add robinzhon`
- From source (requires Rust + maturin):
```bash
# build and install into active venv
maturin develop --release
```
## Quick start
Download a single object:
```python
from robinzhon import S3Downloader
d = S3Downloader("us-east-1")
path = d.download_file("my-bucket", "path/to/object.txt", "./object.txt")
print(path) # ./object.txt
```
Download many objects into a directory:
```python
files = ["data/a.csv", "data/b.csv"]
res = d.download_multiple_files("my-bucket", files, "./downloads")
print(res.successful)
print(res.failed)
```
Upload a single file or multiple files:
```python
from robinzhon import S3Uploader
u = S3Uploader("us-east-1")
u.upload_file("my-bucket", "dest/key.txt", "./local.txt")
paths_and_keys = [("./local1.txt", "key1"), ("./local2.txt", "key2")]
res = u.upload_multiple_files("my-bucket", paths_and_keys)
print(res.successful, res.failed)
```
## Configuration
- Both `S3Downloader` and `S3Uploader` accept an optional concurrency argument (default 5):
```python
S3Downloader("us-east-1", max_concurrent_downloads=10)
S3Uploader("us-east-1", max_concurrent_uploads=10)
```
## API summary
- Results
- Attributes: `successful: List[str]`, `failed: List[str]`
- Methods: `is_complete_success()`, `has_success()`, `has_failures()`, `total_count()`, `success_rate()`
- S3Downloader(region_name, max_concurrent_downloads=5)
- `download_file(bucket, key, local_path) -> str`
- `download_multiple_files(bucket, keys, base_dir) -> Results`
- `download_multiple_files_with_paths(bucket, [(key, local_path), ...]) -> Results`
- S3Uploader(region_name, max_concurrent_uploads=5)
- `upload_file(bucket, key, local_path) -> str`
- `upload_multiple_files(bucket, [(local_path, key), ...]) -> Results`
## Building & testing
- Requires Rust toolchain and `maturin` to build the extension.
- Tests are simple Python tests that assume the compiled extension is available.
## License
See the [LICENSE](LICENSE) file in the repository.
Raw data
{
"_id": null,
"home_page": "https://github.com/rohaquinlop/robinzhon",
"name": "robinzhon",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "s3, aws, download, s3-download, upload, s3-upload, performance, concurrent, async, rust, pyo3, rust-extension, cloud, storage, boto3",
"author": null,
"author_email": "Robin Quintero <rohaquinlop301@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/8a/18/102ff6092fbe99f4efdaac83677bdf073e2ba8e9fc1b8b472e675aa67962/robinzhon-0.2.1.tar.gz",
"platform": null,
"description": "# robinzhon\n\nMinimal, high-performance Python helpers for concurrent S3 object transfers.\n\nA small extension that exposes fast, concurrent downloads (and uploads) to Python\nusing a Rust implementation optimized for I/O-bound workloads.\n\n## Install\n\n- From PyPI: `pip install robinzhon` or `uv add robinzhon`\n- From source (requires Rust + maturin):\n\n```bash\n# build and install into active venv\nmaturin develop --release\n```\n\n## Quick start\n\nDownload a single object:\n\n```python\nfrom robinzhon import S3Downloader\n\nd = S3Downloader(\"us-east-1\")\npath = d.download_file(\"my-bucket\", \"path/to/object.txt\", \"./object.txt\")\nprint(path) # ./object.txt\n```\n\nDownload many objects into a directory:\n\n```python\nfiles = [\"data/a.csv\", \"data/b.csv\"]\nres = d.download_multiple_files(\"my-bucket\", files, \"./downloads\")\nprint(res.successful)\nprint(res.failed)\n```\n\nUpload a single file or multiple files:\n\n```python\nfrom robinzhon import S3Uploader\n\nu = S3Uploader(\"us-east-1\")\nu.upload_file(\"my-bucket\", \"dest/key.txt\", \"./local.txt\")\npaths_and_keys = [(\"./local1.txt\", \"key1\"), (\"./local2.txt\", \"key2\")]\nres = u.upload_multiple_files(\"my-bucket\", paths_and_keys)\nprint(res.successful, res.failed)\n```\n\n## Configuration\n\n- Both `S3Downloader` and `S3Uploader` accept an optional concurrency argument (default 5):\n\n```python\nS3Downloader(\"us-east-1\", max_concurrent_downloads=10)\nS3Uploader(\"us-east-1\", max_concurrent_uploads=10)\n```\n\n## API summary\n\n- Results\n - Attributes: `successful: List[str]`, `failed: List[str]`\n - Methods: `is_complete_success()`, `has_success()`, `has_failures()`, `total_count()`, `success_rate()`\n\n- S3Downloader(region_name, max_concurrent_downloads=5)\n - `download_file(bucket, key, local_path) -> str`\n - `download_multiple_files(bucket, keys, base_dir) -> Results`\n - `download_multiple_files_with_paths(bucket, [(key, local_path), ...]) -> Results`\n\n- S3Uploader(region_name, max_concurrent_uploads=5)\n - `upload_file(bucket, key, local_path) -> str`\n - `upload_multiple_files(bucket, [(local_path, key), ...]) -> Results`\n\n## Building & testing\n\n- Requires Rust toolchain and `maturin` to build the extension.\n- Tests are simple Python tests that assume the compiled extension is available.\n\n## License\n\nSee the [LICENSE](LICENSE) file in the repository.\n\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Minimal, high-performance Python helpers for concurrent S3 object transfers",
"version": "0.2.1",
"project_urls": {
"Homepage": "https://github.com/rohaquinlop/robinzhon"
},
"split_keywords": [
"s3",
" aws",
" download",
" s3-download",
" upload",
" s3-upload",
" performance",
" concurrent",
" async",
" rust",
" pyo3",
" rust-extension",
" cloud",
" storage",
" boto3"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "5847679633032fb3bce5b1f771db5f0fa05dc878dfc98dd74478dd463efe1d9f",
"md5": "2cd6d6b6aead980a17cca248b8ddd278",
"sha256": "98ba104f9bf5f1ef85d9e71542022984d64bedf19fbdd93dd4537d3feb081850"
},
"downloads": -1,
"filename": "robinzhon-0.2.1-cp310-cp310-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "2cd6d6b6aead980a17cca248b8ddd278",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 6784859,
"upload_time": "2025-08-20T17:27:46",
"upload_time_iso_8601": "2025-08-20T17:27:46.155889Z",
"url": "https://files.pythonhosted.org/packages/58/47/679633032fb3bce5b1f771db5f0fa05dc878dfc98dd74478dd463efe1d9f/robinzhon-0.2.1-cp310-cp310-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e309714cfe03bd275ebfc38d9e51cea2be962705cbcb5f96aebd39fa6c3e4456",
"md5": "f21d66169cd97da1a6dce957d4afa5b7",
"sha256": "707705f8213411c54d244567dd6d18578e05d63b8e5e147d045a188b549e34ea"
},
"downloads": -1,
"filename": "robinzhon-0.2.1-cp310-cp310-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "f21d66169cd97da1a6dce957d4afa5b7",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 6585089,
"upload_time": "2025-08-20T17:27:47",
"upload_time_iso_8601": "2025-08-20T17:27:47.693934Z",
"url": "https://files.pythonhosted.org/packages/e3/09/714cfe03bd275ebfc38d9e51cea2be962705cbcb5f96aebd39fa6c3e4456/robinzhon-0.2.1-cp310-cp310-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "eb33afffc1f1e096b0a01aeb4526477582577f73264fc0e05f38668f2a4118f8",
"md5": "b979a5364498200b2f48b31f508ccee1",
"sha256": "1a83dbb97d1b8af48c1ddf86c6cfa74a356acd63cb70c6a053c62e52f17fb4ef"
},
"downloads": -1,
"filename": "robinzhon-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "b979a5364498200b2f48b31f508ccee1",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 7384323,
"upload_time": "2025-08-20T17:27:49",
"upload_time_iso_8601": "2025-08-20T17:27:49.201496Z",
"url": "https://files.pythonhosted.org/packages/eb/33/afffc1f1e096b0a01aeb4526477582577f73264fc0e05f38668f2a4118f8/robinzhon-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "3355f8dc25a75de11f99886d03ceac94cb2d18beddaac68bb95c2444483c9121",
"md5": "7c1222c02e04d1e46d612bd3d8df7186",
"sha256": "c5e4b3ab4dc4585374e2819c11b07f5383954f4128bb987b28e2c373c173c339"
},
"downloads": -1,
"filename": "robinzhon-0.2.1-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "7c1222c02e04d1e46d612bd3d8df7186",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 5548388,
"upload_time": "2025-08-20T17:27:51",
"upload_time_iso_8601": "2025-08-20T17:27:51.822542Z",
"url": "https://files.pythonhosted.org/packages/33/55/f8dc25a75de11f99886d03ceac94cb2d18beddaac68bb95c2444483c9121/robinzhon-0.2.1-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "20222f518c176f78539793769e721fa0db590a2a8b5b240d6a0491557ba963b2",
"md5": "dc50bb6b7ef31babf8cad3431845736e",
"sha256": "7ed372024594baeef1c20e9849aca79cffe00837f17dca920ba9816129977e1b"
},
"downloads": -1,
"filename": "robinzhon-0.2.1-cp311-cp311-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "dc50bb6b7ef31babf8cad3431845736e",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 6788619,
"upload_time": "2025-08-20T17:27:53",
"upload_time_iso_8601": "2025-08-20T17:27:53.226041Z",
"url": "https://files.pythonhosted.org/packages/20/22/2f518c176f78539793769e721fa0db590a2a8b5b240d6a0491557ba963b2/robinzhon-0.2.1-cp311-cp311-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4f46d3a52325bdeb18c1d056e0d87307caa4f1cfdcd418d11ee15c0ae3a219bf",
"md5": "36de1532d8bc4d66ffb522da8e3b0e43",
"sha256": "27f1e468a2cc1a83b6491d091b6256f5be84537e31c5ff8c89fb310e092fc238"
},
"downloads": -1,
"filename": "robinzhon-0.2.1-cp311-cp311-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "36de1532d8bc4d66ffb522da8e3b0e43",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 6583649,
"upload_time": "2025-08-20T17:27:55",
"upload_time_iso_8601": "2025-08-20T17:27:55.159807Z",
"url": "https://files.pythonhosted.org/packages/4f/46/d3a52325bdeb18c1d056e0d87307caa4f1cfdcd418d11ee15c0ae3a219bf/robinzhon-0.2.1-cp311-cp311-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1879364aaae4ab6ce7c86216aca68dfc7386b7926d18c9ab96492729361b9862",
"md5": "14da0e40bc6f48a68523690e169e2072",
"sha256": "a23e7567c5232049fed2d41733a2418f888446575698a5cdf7901cce19314e96"
},
"downloads": -1,
"filename": "robinzhon-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "14da0e40bc6f48a68523690e169e2072",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 7383197,
"upload_time": "2025-08-20T17:27:57",
"upload_time_iso_8601": "2025-08-20T17:27:57.222681Z",
"url": "https://files.pythonhosted.org/packages/18/79/364aaae4ab6ce7c86216aca68dfc7386b7926d18c9ab96492729361b9862/robinzhon-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "98de069d66ea0ca0377e11c39525624b561012aa100c8d906d762fe816659dc8",
"md5": "519d6dd327e9596c06dcf41510a2a877",
"sha256": "57d49119d1acfbca99926e0b6a5c0c5a9757b302d99b8a1b937e8c27926d42a7"
},
"downloads": -1,
"filename": "robinzhon-0.2.1-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "519d6dd327e9596c06dcf41510a2a877",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 5547192,
"upload_time": "2025-08-20T17:27:59",
"upload_time_iso_8601": "2025-08-20T17:27:59.166280Z",
"url": "https://files.pythonhosted.org/packages/98/de/069d66ea0ca0377e11c39525624b561012aa100c8d906d762fe816659dc8/robinzhon-0.2.1-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ad8620784e38d4503278754d91326468019dc8951ccea09b18e3be8b9f45637d",
"md5": "27931f9ff1ff4244db9c5b428ebc887f",
"sha256": "72234b9aabba1ba2dd2ac238321f53c0379ed9112438a59d9b0a7196bd013abe"
},
"downloads": -1,
"filename": "robinzhon-0.2.1-cp312-cp312-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "27931f9ff1ff4244db9c5b428ebc887f",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 6784436,
"upload_time": "2025-08-20T17:28:00",
"upload_time_iso_8601": "2025-08-20T17:28:00.880697Z",
"url": "https://files.pythonhosted.org/packages/ad/86/20784e38d4503278754d91326468019dc8951ccea09b18e3be8b9f45637d/robinzhon-0.2.1-cp312-cp312-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "03150cfcce71f82620824f3d17da96cb94db88c625e08261f133b0e3e095d97f",
"md5": "89fdf88cf7a19e5fa1632c0e6c468fa4",
"sha256": "21258f94c24478fb90b58ff9b37095381f84698af86bec280b9e1835e12c8420"
},
"downloads": -1,
"filename": "robinzhon-0.2.1-cp312-cp312-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "89fdf88cf7a19e5fa1632c0e6c468fa4",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 6576358,
"upload_time": "2025-08-20T17:28:02",
"upload_time_iso_8601": "2025-08-20T17:28:02.188371Z",
"url": "https://files.pythonhosted.org/packages/03/15/0cfcce71f82620824f3d17da96cb94db88c625e08261f133b0e3e095d97f/robinzhon-0.2.1-cp312-cp312-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "47700d599fbaffeb956d422dba3e439d1bdfeaad96cf9ba645f72db63880f442",
"md5": "4b1f8e59442977b24927cf5aa023fb81",
"sha256": "7700e01f8f8321e0538dbd1bc0d81d9956e4f7b711f1957b953db291f71b2630"
},
"downloads": -1,
"filename": "robinzhon-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "4b1f8e59442977b24927cf5aa023fb81",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 7380650,
"upload_time": "2025-08-20T17:28:03",
"upload_time_iso_8601": "2025-08-20T17:28:03.906174Z",
"url": "https://files.pythonhosted.org/packages/47/70/0d599fbaffeb956d422dba3e439d1bdfeaad96cf9ba645f72db63880f442/robinzhon-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "946c58eb5f27a6de3ab748b8d0e14affc0eeeda3c18c15516785191446be8c81",
"md5": "2e017dffc1b3e77c3d8a47ef053b13ba",
"sha256": "947eca2d8178e991eb60a6476adcf661d0b3d59a39d9b559daf4b43072eb555e"
},
"downloads": -1,
"filename": "robinzhon-0.2.1-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "2e017dffc1b3e77c3d8a47ef053b13ba",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 5546428,
"upload_time": "2025-08-20T17:28:06",
"upload_time_iso_8601": "2025-08-20T17:28:06.039062Z",
"url": "https://files.pythonhosted.org/packages/94/6c/58eb5f27a6de3ab748b8d0e14affc0eeeda3c18c15516785191446be8c81/robinzhon-0.2.1-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "8bfd195152e19fecd68cfcb3b08aec7b9e9f9ce37cf9a7b2dd7c7493c9cc8c0b",
"md5": "ef0017d6896a8faf56ab37d72e2072c7",
"sha256": "ae2661f20fd53075db536220009a5f836b0e42ebf11992fa6a94e8acafb187fc"
},
"downloads": -1,
"filename": "robinzhon-0.2.1-cp313-cp313-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "ef0017d6896a8faf56ab37d72e2072c7",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 6784547,
"upload_time": "2025-08-20T17:28:07",
"upload_time_iso_8601": "2025-08-20T17:28:07.890283Z",
"url": "https://files.pythonhosted.org/packages/8b/fd/195152e19fecd68cfcb3b08aec7b9e9f9ce37cf9a7b2dd7c7493c9cc8c0b/robinzhon-0.2.1-cp313-cp313-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ba47a35101c5209da9b01f98de8d6f45e1d2876342f5af0524337659881e2894",
"md5": "b658be2d7201995cd256c9eed8d228b7",
"sha256": "0444a1899f17efc827877606cc873af9f25f4e0223584bc7c0e619ada5c901cc"
},
"downloads": -1,
"filename": "robinzhon-0.2.1-cp313-cp313-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "b658be2d7201995cd256c9eed8d228b7",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 6577038,
"upload_time": "2025-08-20T17:28:09",
"upload_time_iso_8601": "2025-08-20T17:28:09.203624Z",
"url": "https://files.pythonhosted.org/packages/ba/47/a35101c5209da9b01f98de8d6f45e1d2876342f5af0524337659881e2894/robinzhon-0.2.1-cp313-cp313-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "8a099eafd489289e1fd7c5dca9196f2270c19423ac3e87f64846c9a4112fb2ff",
"md5": "bcb9f6cb02d91f41c74a4fe5ae2e8718",
"sha256": "ce582ec347fb2c31be608281ec9d6c545918509dfc6da47697e895f147874376"
},
"downloads": -1,
"filename": "robinzhon-0.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "bcb9f6cb02d91f41c74a4fe5ae2e8718",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 7381428,
"upload_time": "2025-08-20T17:28:10",
"upload_time_iso_8601": "2025-08-20T17:28:10.566878Z",
"url": "https://files.pythonhosted.org/packages/8a/09/9eafd489289e1fd7c5dca9196f2270c19423ac3e87f64846c9a4112fb2ff/robinzhon-0.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f9a4da96ade6b0535099b9105d06a243cb575e6e17871b3eafd7c05ba9d36b25",
"md5": "e1832eeb0788a1d329b9ad8ce3f6414b",
"sha256": "a63ba0d2ff01df0a5dd2564c940d275baf359741c5ad9feb42a52bfb997c6700"
},
"downloads": -1,
"filename": "robinzhon-0.2.1-cp313-cp313-win_amd64.whl",
"has_sig": false,
"md5_digest": "e1832eeb0788a1d329b9ad8ce3f6414b",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 5546639,
"upload_time": "2025-08-20T17:28:12",
"upload_time_iso_8601": "2025-08-20T17:28:12.744571Z",
"url": "https://files.pythonhosted.org/packages/f9/a4/da96ade6b0535099b9105d06a243cb575e6e17871b3eafd7c05ba9d36b25/robinzhon-0.2.1-cp313-cp313-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "24255454095e4622ffdebb701f8d0deed9b35877b59e5d311eb47b8d7978b8fe",
"md5": "7e7212e97a9e8a96364df5ebaba7a4f8",
"sha256": "a192409535715151f5245a3522ade9b2d2096e097da8eebf65d2a21be81f37c3"
},
"downloads": -1,
"filename": "robinzhon-0.2.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "7e7212e97a9e8a96364df5ebaba7a4f8",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.9",
"size": 7382958,
"upload_time": "2025-08-20T17:28:14",
"upload_time_iso_8601": "2025-08-20T17:28:14.567398Z",
"url": "https://files.pythonhosted.org/packages/24/25/5454095e4622ffdebb701f8d0deed9b35877b59e5d311eb47b8d7978b8fe/robinzhon-0.2.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "a539b45ab6b3b5136f5a97b88aac7a9ec9f6635c34e7cc57a196b686ef7acc7b",
"md5": "1fe72e4b5227e8060d256a2397b8a78d",
"sha256": "a76196e7877f38e352d413f8a5c45113131a64833520632e7bb543fdd868a2b4"
},
"downloads": -1,
"filename": "robinzhon-0.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "1fe72e4b5227e8060d256a2397b8a78d",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 7385046,
"upload_time": "2025-08-20T17:28:16",
"upload_time_iso_8601": "2025-08-20T17:28:16.389817Z",
"url": "https://files.pythonhosted.org/packages/a5/39/b45ab6b3b5136f5a97b88aac7a9ec9f6635c34e7cc57a196b686ef7acc7b/robinzhon-0.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "540e2cb4f4419f9b96fd16fa7651857beb0d5e36a2b3c8e9b75c94f31b2693a1",
"md5": "b9523c4858328bd7aff9fe137ad2fb4a",
"sha256": "64e833be369c6c84f54d8c0999089a8615e9f56231d95c43dc34a29bfb727e00"
},
"downloads": -1,
"filename": "robinzhon-0.2.1-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "b9523c4858328bd7aff9fe137ad2fb4a",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 5548704,
"upload_time": "2025-08-20T17:28:17",
"upload_time_iso_8601": "2025-08-20T17:28:17.987639Z",
"url": "https://files.pythonhosted.org/packages/54/0e/2cb4f4419f9b96fd16fa7651857beb0d5e36a2b3c8e9b75c94f31b2693a1/robinzhon-0.2.1-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "651ef3f45115adb3f1afa846ff76da0ca88aec0da231ada1e9455902d92999e8",
"md5": "19ab9629206f54bce341ab3ba61c8052",
"sha256": "d54e15c9063442d615d37b2b572720eabf59f29db8f3dc2dc5acc9ad9df651f8"
},
"downloads": -1,
"filename": "robinzhon-0.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "19ab9629206f54bce341ab3ba61c8052",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.9",
"size": 7382261,
"upload_time": "2025-08-20T17:28:19",
"upload_time_iso_8601": "2025-08-20T17:28:19.726238Z",
"url": "https://files.pythonhosted.org/packages/65/1e/f3f45115adb3f1afa846ff76da0ca88aec0da231ada1e9455902d92999e8/robinzhon-0.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "30f8e62f12cb7c5499f9c4175261932b5730a338e9d8980b76db0f59a635120c",
"md5": "8dc2ce9f70751882dfa8bf3b59ee2bff",
"sha256": "247bbe2f1552f35e452340512d71595632e626e898c0392dc10b00a552ac75c2"
},
"downloads": -1,
"filename": "robinzhon-0.2.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "8dc2ce9f70751882dfa8bf3b59ee2bff",
"packagetype": "bdist_wheel",
"python_version": "pp311",
"requires_python": ">=3.9",
"size": 7381566,
"upload_time": "2025-08-20T17:28:21",
"upload_time_iso_8601": "2025-08-20T17:28:21.059046Z",
"url": "https://files.pythonhosted.org/packages/30/f8/e62f12cb7c5499f9c4175261932b5730a338e9d8980b76db0f59a635120c/robinzhon-0.2.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "8a18102ff6092fbe99f4efdaac83677bdf073e2ba8e9fc1b8b472e675aa67962",
"md5": "497d48ef4afeedfa308cc538cf052616",
"sha256": "03be8709f38fb59fab2af4a644cdb1313c3b4e2e16243c3fdb786a64c5cd5b3d"
},
"downloads": -1,
"filename": "robinzhon-0.2.1.tar.gz",
"has_sig": false,
"md5_digest": "497d48ef4afeedfa308cc538cf052616",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 98425,
"upload_time": "2025-08-20T17:28:22",
"upload_time_iso_8601": "2025-08-20T17:28:22.406615Z",
"url": "https://files.pythonhosted.org/packages/8a/18/102ff6092fbe99f4efdaac83677bdf073e2ba8e9fc1b8b472e675aa67962/robinzhon-0.2.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-20 17:28:22",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "rohaquinlop",
"github_project": "robinzhon",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "robinzhon"
}