Name | ruson JSON |
Version |
1.0.6
JSON |
| download |
home_page | None |
Summary | Asynchronous MongoDB Driver Wrapper For Rust MongoDB crate |
upload_time | 2024-04-29 03:13:09 |
maintainer | None |
docs_url | None |
author | None |
requires_python | >=3.11 |
license | None |
keywords |
rust
mongo
driver
database
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
[![PyPI version](https://badge.fury.io/py/ruson.svg)](https://badge.fury.io/py/ruson)
# Ruson-ODM
Ruson-ODM is an asynchronous object-document mapper for Python 3.11+. It is designed to be a lightweight and easy-to-use ODM for MongoDB.
## Installation
Ruson-ODM is available to be installed from PyPi with:
```bash
pip install ruson
```
## Usage
Using Ruson-ODM is easy and requires only two setup steps: setup and inheritance. After these two steps are complete, you can start using Ruson-ODM to query, insert, update and deleted documents from the database.
### Inheriting RusonDoc
`RusonDoc` is the interface that your classes will use to interact with the ODM. To use it, you must create a class that inherits from it.
```python
import asyncio
from ruson.core.config import Config
from ruson.core.instance import Ruson
from ruson.core.ruson_doc import RusonDoc
class User(RusonDoc):
email: str
```
Note that subclasses can override super class attributes like the "id" field.
### Setup
To use the ruson ODM, you need to first create a `Config` instance with the necessary parameters for your database connection (`connection_name` is optional). With the config object created, you can then setup a `Ruson` connection using the singleton `Ruson`.
```python
async def setup_ruson():
config = Config(database_uri="mongodb://localhost:27017", database_name="test", connection_name="default")
await Ruson.create_connection(config)
```
### Querying the database
Once the `Ruson` connection is setup, you can start querying the database. Your classes that inherited from RusonDoc can now use the `find`, `find_one` and `find_many` methods to query the database.
By default, `Ruson` will not format your data. You can use the `formatter` parameter to pass a callable to format the response from the database.
```python
async def formatter(value: dict):
# This function does not need to be async, it is just an
# example to show that async functions are also supported
return value["email"]
async def find():
email = "test@example.com"
# Return iterator over matched users
users = await User(email=email).find(many=True)
# Consumes iterator and transform into a list
users_list = await users.tolist()
print("Find method")
print(f"Users found with email: '{email}'", len(users_list))
print("Users", list(users_list[0].items()))
print()
async def find_one():
user_email = await User.find_one({"email": "test@example.com"}, formatter=formatter)
print("Find one method")
print("User email", user_email)
print()
async def find_many():
users_emails = await User.find_many(formatter=formatter)
print("Find many method")
# Iteration asynchronously through the results
async for email in users_emails:
print(email)
print()
```
### Inserting into the database
To insert a document into the database, you can use the `insert_one` method either with an instance or a class.
```python
async def insert_one():
print("Insert one method")
# Insert using class method
user = User(email="test@example.com")
result = await User.insert_one(user)
print("Inserted id", result.inserted_id)
# Insert using instance method
another = User(email="another@example.com")
result = await another.insert()
print("Inserted id", result.inserted_id)
print()
```
To insert multiple documents into the database, you can use the `insert_many` method either with a class.
```python
async def insert_many():
users = [
User(email="test1@example.com"),
User(email="test2@example.com"),
User(email="test3@example.com"),
User(email="test4@example.com"),
]
result = await User.insert_many(users)
print("Insert many method")
print("Inserted ids", list(map(str, result.inserted_ids)))
print()
```
### Updating records in the database
To update a record in the database, you can use the `update_one` method. This method takes two parameters, the filter and the update. The filter is used to find the document to update and the update is the data to update the document with. It can be used either with the class method or the instance method.
```python
async def update_one():
result = await User.update_one(
{"$set": {"email": "updated@example.com"}}, {"email": "test1@example.com"}
)
print("Update one method")
print("Matched count", result.matched_count)
print("Modified count", result.modified_count)
print()
```
### Deleting records from the database
To delete a record from the database, you can use the `delete_one` method. This method takes a filter as a parameter and can be used either with the class method or the instance method.
```python
async def delete():
# Delete only the first match using "many=False"
result = await User(email="test4@example.com").delete(many=False)
print("Delete method")
print("Deleted count", result.deleted_count)
print()
async def delete_one():
# Delete class method
result = await User.delete_one({"email": "test3@example.com"})
print("Delete one method")
print("Deleted count", result.deleted_count)
print()
```
It is also possible to delete multiple records from the database using the `delete_many` method. This method takes a filter as a parameter and can be used either with the class method or the instance method `delete` combined with the flag `many=True`.
```python
async def delete_many():
# Delete many using class method
result = await User.delete_many({"email": {"$regex": "^test"}})
print("Delete many method")
print("Deleted count", result.deleted_count)
print()
```
### To run the examples
```python
async def main():
await setup_ruson()
await insert_one()
await insert_many()
await find()
await find_one()
await find_many()
await update_one()
await delete()
await delete_one()
await delete_many()
if __name__ == "__main__":
asyncio.run(main())
```
### Other supported methods
#### Ruson
- `get_client`
- `get_config`
- `create_session`
#### Client
- `database`
- `default_database`
- `list_databases`
- `create_session`
- `shutdown`
#### Database
- `collection`
- `list_collections`
- `drop`
#### Collection
- `upsert`
- `count_documents`
- `distinct`
- `create_index`
- `list_indexes`
- `drop_indexes`
- `drop`
Raw data
{
"_id": null,
"home_page": null,
"name": "ruson",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.11",
"maintainer_email": null,
"keywords": "rust, mongo, driver, database",
"author": null,
"author_email": "Jo\u00e3o Severo <contato@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/45/27/278a1218492809cfaf3894ab8ba84f6db466592f1603c7b0ff2cf292ec58/ruson-1.0.6.tar.gz",
"platform": null,
"description": "[![PyPI version](https://badge.fury.io/py/ruson.svg)](https://badge.fury.io/py/ruson)\n\n# Ruson-ODM\n\nRuson-ODM is an asynchronous object-document mapper for Python 3.11+. It is designed to be a lightweight and easy-to-use ODM for MongoDB.\n\n## Installation\n\nRuson-ODM is available to be installed from PyPi with:\n\n```bash\npip install ruson\n``` \n\n## Usage\n\nUsing Ruson-ODM is easy and requires only two setup steps: setup and inheritance. After these two steps are complete, you can start using Ruson-ODM to query, insert, update and deleted documents from the database.\n\n### Inheriting RusonDoc\n\n`RusonDoc` is the interface that your classes will use to interact with the ODM. To use it, you must create a class that inherits from it.\n\n```python\nimport asyncio\nfrom ruson.core.config import Config\nfrom ruson.core.instance import Ruson\nfrom ruson.core.ruson_doc import RusonDoc\n\n\nclass User(RusonDoc):\n email: str\n```\n\nNote that subclasses can override super class attributes like the \"id\" field.\n\n### Setup\n\nTo use the ruson ODM, you need to first create a `Config` instance with the necessary parameters for your database connection (`connection_name` is optional). With the config object created, you can then setup a `Ruson` connection using the singleton `Ruson`.\n\n```python\nasync def setup_ruson():\n config = Config(database_uri=\"mongodb://localhost:27017\", database_name=\"test\", connection_name=\"default\")\n await Ruson.create_connection(config)\n```\n\n### Querying the database\n\nOnce the `Ruson` connection is setup, you can start querying the database. Your classes that inherited from RusonDoc can now use the `find`, `find_one` and `find_many` methods to query the database.\n\nBy default, `Ruson` will not format your data. You can use the `formatter` parameter to pass a callable to format the response from the database.\n\n```python\nasync def formatter(value: dict):\n # This function does not need to be async, it is just an\n # example to show that async functions are also supported\n return value[\"email\"]\n\n\nasync def find():\n email = \"test@example.com\"\n\n # Return iterator over matched users\n users = await User(email=email).find(many=True)\n\n # Consumes iterator and transform into a list\n users_list = await users.tolist()\n\n print(\"Find method\")\n print(f\"Users found with email: '{email}'\", len(users_list))\n print(\"Users\", list(users_list[0].items()))\n print()\n\n\nasync def find_one():\n user_email = await User.find_one({\"email\": \"test@example.com\"}, formatter=formatter)\n print(\"Find one method\")\n print(\"User email\", user_email)\n print()\n\n\nasync def find_many():\n users_emails = await User.find_many(formatter=formatter)\n\n print(\"Find many method\")\n # Iteration asynchronously through the results\n async for email in users_emails:\n print(email)\n\n print()\n```\n\n### Inserting into the database\n\nTo insert a document into the database, you can use the `insert_one` method either with an instance or a class.\n\n```python\nasync def insert_one():\n print(\"Insert one method\")\n\n # Insert using class method\n user = User(email=\"test@example.com\")\n result = await User.insert_one(user)\n print(\"Inserted id\", result.inserted_id)\n\n # Insert using instance method\n another = User(email=\"another@example.com\")\n result = await another.insert()\n print(\"Inserted id\", result.inserted_id)\n\n print()\n```\n\nTo insert multiple documents into the database, you can use the `insert_many` method either with a class.\n\n```python\nasync def insert_many():\n users = [\n User(email=\"test1@example.com\"),\n User(email=\"test2@example.com\"),\n User(email=\"test3@example.com\"),\n User(email=\"test4@example.com\"),\n ]\n result = await User.insert_many(users)\n\n print(\"Insert many method\")\n print(\"Inserted ids\", list(map(str, result.inserted_ids)))\n print()\n```\n\n### Updating records in the database\n\nTo update a record in the database, you can use the `update_one` method. This method takes two parameters, the filter and the update. The filter is used to find the document to update and the update is the data to update the document with. It can be used either with the class method or the instance method.\n\n```python\nasync def update_one():\n result = await User.update_one(\n {\"$set\": {\"email\": \"updated@example.com\"}}, {\"email\": \"test1@example.com\"}\n )\n\n print(\"Update one method\")\n print(\"Matched count\", result.matched_count)\n print(\"Modified count\", result.modified_count)\n print()\n```\n\n### Deleting records from the database\n\nTo delete a record from the database, you can use the `delete_one` method. This method takes a filter as a parameter and can be used either with the class method or the instance method.\n\n```python\nasync def delete():\n # Delete only the first match using \"many=False\"\n result = await User(email=\"test4@example.com\").delete(many=False)\n\n print(\"Delete method\")\n print(\"Deleted count\", result.deleted_count)\n print()\n\n\nasync def delete_one():\n # Delete class method\n result = await User.delete_one({\"email\": \"test3@example.com\"})\n\n print(\"Delete one method\")\n print(\"Deleted count\", result.deleted_count)\n print()\n```\n\nIt is also possible to delete multiple records from the database using the `delete_many` method. This method takes a filter as a parameter and can be used either with the class method or the instance method `delete` combined with the flag `many=True`.\n\n```python\nasync def delete_many():\n # Delete many using class method\n result = await User.delete_many({\"email\": {\"$regex\": \"^test\"}})\n\n print(\"Delete many method\")\n print(\"Deleted count\", result.deleted_count)\n print()\n```\n\n### To run the examples\n\n```python\nasync def main():\n await setup_ruson()\n await insert_one()\n await insert_many()\n await find()\n await find_one()\n await find_many()\n await update_one()\n await delete()\n await delete_one()\n await delete_many()\n\n\nif __name__ == \"__main__\":\n asyncio.run(main())\n```\n\n### Other supported methods\n\n#### Ruson\n\n- `get_client`\n- `get_config`\n- `create_session`\n\n#### Client\n\n- `database`\n- `default_database`\n- `list_databases`\n- `create_session`\n- `shutdown`\n\n#### Database\n\n- `collection`\n- `list_collections`\n- `drop`\n\n#### Collection\n\n- `upsert`\n- `count_documents`\n- `distinct`\n- `create_index`\n- `list_indexes`\n- `drop_indexes`\n- `drop`\n\n",
"bugtrack_url": null,
"license": null,
"summary": "Asynchronous MongoDB Driver Wrapper For Rust MongoDB crate",
"version": "1.0.6",
"project_urls": null,
"split_keywords": [
"rust",
" mongo",
" driver",
" database"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "caee9006d1e7e0bba5ed112a51f4a85f3338059321e6a789b0341fb6720598bc",
"md5": "2a05096fefa93d87c64bb9b574b6f586",
"sha256": "ba19e06f653fe647a960152663f94420a989219fdd93e47af2b6a619eedf449c"
},
"downloads": -1,
"filename": "ruson-1.0.6-cp311-cp311-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "2a05096fefa93d87c64bb9b574b6f586",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.11",
"size": 4958337,
"upload_time": "2024-04-29T03:12:38",
"upload_time_iso_8601": "2024-04-29T03:12:38.236400Z",
"url": "https://files.pythonhosted.org/packages/ca/ee/9006d1e7e0bba5ed112a51f4a85f3338059321e6a789b0341fb6720598bc/ruson-1.0.6-cp311-cp311-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c09074a1f29f591dfbbc94019e33426207ed67ba9b1ae6de5361373c7cf0657f",
"md5": "dfb717b872c16112af7804b699e3e886",
"sha256": "0452c9e310168c8b7252f2cc3109fc8f6179a50376bc3db7d0bdc047468090ad"
},
"downloads": -1,
"filename": "ruson-1.0.6-cp311-cp311-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "dfb717b872c16112af7804b699e3e886",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.11",
"size": 4726921,
"upload_time": "2024-04-29T03:12:40",
"upload_time_iso_8601": "2024-04-29T03:12:40.912395Z",
"url": "https://files.pythonhosted.org/packages/c0/90/74a1f29f591dfbbc94019e33426207ed67ba9b1ae6de5361373c7cf0657f/ruson-1.0.6-cp311-cp311-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f445976dc9aeb468797e8daa4453a36eaf43e2881069bb0017cddf66bca58bfc",
"md5": "48d191327cf91863f881bc3c13697f78",
"sha256": "d512b74dff984a3d50c86351d693d0c859c989cccce5503ed607a7bc6ba5cfee"
},
"downloads": -1,
"filename": "ruson-1.0.6-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl",
"has_sig": false,
"md5_digest": "48d191327cf91863f881bc3c13697f78",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.11",
"size": 6891356,
"upload_time": "2024-04-29T03:12:43",
"upload_time_iso_8601": "2024-04-29T03:12:43.480198Z",
"url": "https://files.pythonhosted.org/packages/f4/45/976dc9aeb468797e8daa4453a36eaf43e2881069bb0017cddf66bca58bfc/ruson-1.0.6-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1c274e996826ee6f9c994883832408d3aacb83c2b717ced362cff63ccd8b0850",
"md5": "da65a72dd8c55380680700c37f31e68b",
"sha256": "25f775c1d5e375995ccfc6e3cc5aef227dc2ae39a619483e5b8a8c99a74a898d"
},
"downloads": -1,
"filename": "ruson-1.0.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "da65a72dd8c55380680700c37f31e68b",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.11",
"size": 6522665,
"upload_time": "2024-04-29T03:12:46",
"upload_time_iso_8601": "2024-04-29T03:12:46.271473Z",
"url": "https://files.pythonhosted.org/packages/1c/27/4e996826ee6f9c994883832408d3aacb83c2b717ced362cff63ccd8b0850/ruson-1.0.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1a4a65f5416466757693a12da75aab0575880709804d9fd88acfa05246b061c9",
"md5": "db7af58c5fabeb519bed2465b9fd5859",
"sha256": "72565836a3e23fb800fe83c32464c20610f9ddf6b2197c12352b70bfbab92793"
},
"downloads": -1,
"filename": "ruson-1.0.6-cp311-none-win32.whl",
"has_sig": false,
"md5_digest": "db7af58c5fabeb519bed2465b9fd5859",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.11",
"size": 4018627,
"upload_time": "2024-04-29T03:12:48",
"upload_time_iso_8601": "2024-04-29T03:12:48.881856Z",
"url": "https://files.pythonhosted.org/packages/1a/4a/65f5416466757693a12da75aab0575880709804d9fd88acfa05246b061c9/ruson-1.0.6-cp311-none-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b3a17e5bba5231ab4a17e06d50a9e969a6ebdfa183980600f5a4db28f4e5d353",
"md5": "a6c7ea04493dc882cca87b55f6ebc2a1",
"sha256": "68fd36e2b98d6578b3f1e726e9fe0b9cfe9a17b0f7464f638048aa64b7a2f074"
},
"downloads": -1,
"filename": "ruson-1.0.6-cp311-none-win_amd64.whl",
"has_sig": false,
"md5_digest": "a6c7ea04493dc882cca87b55f6ebc2a1",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.11",
"size": 4755799,
"upload_time": "2024-04-29T03:12:51",
"upload_time_iso_8601": "2024-04-29T03:12:51.719465Z",
"url": "https://files.pythonhosted.org/packages/b3/a1/7e5bba5231ab4a17e06d50a9e969a6ebdfa183980600f5a4db28f4e5d353/ruson-1.0.6-cp311-none-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "90dad7a4419215d93cc539e98487716498e5952c7543c26c0a8c5c44236c5678",
"md5": "f4f4d541c9ff23b3115d9fce70b1a579",
"sha256": "97e3e761db36a885ba191798ac32251939a73a4f9f5905deaf56eafd5264ec50"
},
"downloads": -1,
"filename": "ruson-1.0.6-cp312-cp312-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "f4f4d541c9ff23b3115d9fce70b1a579",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.11",
"size": 4957514,
"upload_time": "2024-04-29T03:12:53",
"upload_time_iso_8601": "2024-04-29T03:12:53.773723Z",
"url": "https://files.pythonhosted.org/packages/90/da/d7a4419215d93cc539e98487716498e5952c7543c26c0a8c5c44236c5678/ruson-1.0.6-cp312-cp312-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "29a2019b46c3945c18c57d238c36fdcb00ce233a921500db054793a3ea673ff7",
"md5": "16004bf67bd109f4a68c57852d7fb892",
"sha256": "71f12fb7761fcfd0f39edc8811a27ceff033cbe15403db0b1ab8dd224efed2e4"
},
"downloads": -1,
"filename": "ruson-1.0.6-cp312-cp312-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "16004bf67bd109f4a68c57852d7fb892",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.11",
"size": 4725146,
"upload_time": "2024-04-29T03:12:56",
"upload_time_iso_8601": "2024-04-29T03:12:56.624702Z",
"url": "https://files.pythonhosted.org/packages/29/a2/019b46c3945c18c57d238c36fdcb00ce233a921500db054793a3ea673ff7/ruson-1.0.6-cp312-cp312-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1e75e87efa25694c2ceddea74dc90151dfbe3299fd830c8aca21d29cb9773874",
"md5": "7890c707a35f5804c10b831d5198b6da",
"sha256": "e89c497ba6d4de80da93ab4e95560eb9b30b9e430e447a7957ccd66a451813ae"
},
"downloads": -1,
"filename": "ruson-1.0.6-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl",
"has_sig": false,
"md5_digest": "7890c707a35f5804c10b831d5198b6da",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.11",
"size": 6896655,
"upload_time": "2024-04-29T03:12:59",
"upload_time_iso_8601": "2024-04-29T03:12:59.330867Z",
"url": "https://files.pythonhosted.org/packages/1e/75/e87efa25694c2ceddea74dc90151dfbe3299fd830c8aca21d29cb9773874/ruson-1.0.6-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "deec4657102da797c3696e4db1800a2796e35c4f8940cdec27f78ab102f8fc75",
"md5": "c5de3ef0ae785971b2c870aa3bff5bb1",
"sha256": "0af5a65e50a9825be8f005ab3c863e46894f11585ae666447fc1142e01add229"
},
"downloads": -1,
"filename": "ruson-1.0.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "c5de3ef0ae785971b2c870aa3bff5bb1",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.11",
"size": 6520860,
"upload_time": "2024-04-29T03:13:02",
"upload_time_iso_8601": "2024-04-29T03:13:02.116292Z",
"url": "https://files.pythonhosted.org/packages/de/ec/4657102da797c3696e4db1800a2796e35c4f8940cdec27f78ab102f8fc75/ruson-1.0.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1cbfbcd8b5979c0eed3a320321286be442d880ff16d4e34fd6e9f7837a645566",
"md5": "e3e8c472b5a1cde33dd099baae3d69e5",
"sha256": "01d40862c07e7ffd9305909a3af8d2dc019f01d3779edacff02767f60191d631"
},
"downloads": -1,
"filename": "ruson-1.0.6-cp312-none-win32.whl",
"has_sig": false,
"md5_digest": "e3e8c472b5a1cde33dd099baae3d69e5",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.11",
"size": 4012764,
"upload_time": "2024-04-29T03:13:04",
"upload_time_iso_8601": "2024-04-29T03:13:04.943458Z",
"url": "https://files.pythonhosted.org/packages/1c/bf/bcd8b5979c0eed3a320321286be442d880ff16d4e34fd6e9f7837a645566/ruson-1.0.6-cp312-none-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "71a6fba05139ee79af4ac57bdc768bcdc489aa880c2f1050e3693e9682405568",
"md5": "86bbedbe78ab32ada5593cac37a43e56",
"sha256": "c8c33caef2d326ba6423b22f747f5351be63183019ac621be994ded699007110"
},
"downloads": -1,
"filename": "ruson-1.0.6-cp312-none-win_amd64.whl",
"has_sig": false,
"md5_digest": "86bbedbe78ab32ada5593cac37a43e56",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.11",
"size": 4749474,
"upload_time": "2024-04-29T03:13:07",
"upload_time_iso_8601": "2024-04-29T03:13:07.455249Z",
"url": "https://files.pythonhosted.org/packages/71/a6/fba05139ee79af4ac57bdc768bcdc489aa880c2f1050e3693e9682405568/ruson-1.0.6-cp312-none-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4527278a1218492809cfaf3894ab8ba84f6db466592f1603c7b0ff2cf292ec58",
"md5": "57c89e0145ffeb1b66c15fd00120fcdc",
"sha256": "75021b099bc425c96f0e5713620b80843fc653df89de8165c6bc59d3059eb2a6"
},
"downloads": -1,
"filename": "ruson-1.0.6.tar.gz",
"has_sig": false,
"md5_digest": "57c89e0145ffeb1b66c15fd00120fcdc",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.11",
"size": 42907,
"upload_time": "2024-04-29T03:13:09",
"upload_time_iso_8601": "2024-04-29T03:13:09.649615Z",
"url": "https://files.pythonhosted.org/packages/45/27/278a1218492809cfaf3894ab8ba84f6db466592f1603c7b0ff2cf292ec58/ruson-1.0.6.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-04-29 03:13:09",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "ruson"
}