# xiangting-py
Python bindings for [xiangting](https://crates.io/crates/xiangting).
See also [xiangting](https://crates.io/crates/xiangting) for more information.
Documentation:
- [API reference (main branch)](https://apricot-s.github.io/xiangting-py/)
## Installation
There are 3 options to install this library:
### Option 1: Install from PyPI
```sh
pip install xiangting
```
### Option 2: Install from wheel
1. Download the wheel file for your platform from the [releases page](https://github.com/Apricot-S/xiangting-py/releases/latest).
2. Run the following command:
```sh
pip install PATH/TO/xiangting-{version}-{python tag}-{abitag}-{platform tag}.whl
```
Replace `PATH/TO/xiangting-{version}-{python tag}-{abitag}-{platform tag}.whl` with the actual path to the wheel file on your system.
### Option 3: Build from source
Requires `cargo`:
```sh
xiangting-py$ pip install .
```
## Usage
The hand is represented as an array of `list[int]`, where each element represents the count of a specific tile.
The correspondence between the index and the tile is shown in the table below.
| Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| ----- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| Tile | 1m | 2m | 3m | 4m | 5m | 6m | 7m | 8m | 9m |
| Index | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| ----- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| Tile | 1p | 2p | 3p | 4p | 5p | 6p | 7p | 8p | 9p |
| Index | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| ----- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| Tile | 1s | 2s | 3s | 4s | 5s | 6s | 7s | 8s | 9s |
| Index | 27 | 28 | 29 | 30 | 31 | 32 | 33 |
| ----- | --------- | ---------- | --------- | ---------- | ---------- | ---------- | -------- |
| Tile | East (1z) | South (2z) | West (3z) | North (4z) | White (5z) | Green (6z) | Red (7z) |
Calculates the replacement number, which is equal to the deficiency number (a.k.a. xiangting number, 向聴数) + 1.
```python
from xiangting import calculate_replacement_number
# 123m456p789s11222z
hand_14 = [
1, 1, 1, 0, 0, 0, 0, 0, 0, # m
0, 0, 0, 1, 1, 1, 0, 0, 0, # p
0, 0, 0, 0, 0, 0, 1, 1, 1, # s
2, 3, 0, 0, 0, 0, 0, # z
]
replacement_number = calculate_replacement_number(hand_14, None)
assert replacement_number == 0
```
In the calculation for a hand with melds (副露),
the melded tiles can be included or excluded when counting tiles to determine if a hand contains four identical ones.
If melds are excluded (e.g., 天鳳 (Tenhou), 雀魂 (Mahjong Soul)), specify `None` for `fulu_mianzi_list`.
If melds are included (e.g., World Riichi Championship, M.LEAGUE), the melds should be included in the `fulu_mianzi_list`.
```python
from xiangting import (
ClaimedTilePosition,
FuluMianzi,
calculate_replacement_number,
)
# 123m1z (3 melds)
hand_4 = [
1, 1, 1, 0, 0, 0, 0, 0, 0, # m
0, 0, 0, 0, 0, 0, 0, 0, 0, # p
0, 0, 0, 0, 0, 0, 0, 0, 0, # s
1, 0, 0, 0, 0, 0, 0, # z
]
# 456p 7777s 111z
melds = [
FuluMianzi.Shunzi(12, ClaimedTilePosition.LOW),
FuluMianzi.Gangzi(24),
FuluMianzi.Kezi(27),
None,
]
replacement_number_wo_melds = calculate_replacement_number(hand_4, None)
assert replacement_number_wo_melds == 1
replacement_number_w_melds = calculate_replacement_number(hand_4, melds)
assert replacement_number_w_melds == 2
```
In three-player mahjong, the tiles from 2m (二萬) to 8m (八萬) are not used.
Additionally, melded sequences (明順子) are not allowed.
```python
from xiangting import (
calculate_replacement_number,
calculate_replacement_number_3_player,
)
# 1111m111122233z
hand_13 = [
4, 0, 0, 0, 0, 0, 0, 0, 0, # m
0, 0, 0, 0, 0, 0, 0, 0, 0, # p
0, 0, 0, 0, 0, 0, 0, 0, 0, # s
4, 3, 2, 0, 0, 0, 0, # z
]
replacement_number_4p = calculate_replacement_number(hand_13, None)
assert replacement_number_4p == 2
replacement_number_3p = calculate_replacement_number_3_player(hand_13, None)
assert replacement_number_3p == 3
```
## License
Copyright (c) Apricot S. All rights reserved.
Licensed under the [MIT license](LICENSE).
Raw data
{
"_id": null,
"home_page": null,
"name": "xiangting",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.12",
"maintainer_email": null,
"keywords": "mahjong, shanten, xiangting",
"author": "Apricot S.",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/24/14/feed8664343b14565d66c9bce398c169bb540465f10b975f9715e9935fd0/xiangting-3.1.1.tar.gz",
"platform": null,
"description": "# xiangting-py\n\nPython bindings for [xiangting](https://crates.io/crates/xiangting).\n\nSee also [xiangting](https://crates.io/crates/xiangting) for more information.\n\nDocumentation:\n\n- [API reference (main branch)](https://apricot-s.github.io/xiangting-py/)\n\n## Installation\n\nThere are 3 options to install this library:\n\n### Option 1: Install from PyPI\n\n```sh\npip install xiangting\n```\n\n### Option 2: Install from wheel\n\n1. Download the wheel file for your platform from the [releases page](https://github.com/Apricot-S/xiangting-py/releases/latest).\n2. Run the following command:\n\n```sh\npip install PATH/TO/xiangting-{version}-{python tag}-{abitag}-{platform tag}.whl\n```\n\nReplace `PATH/TO/xiangting-{version}-{python tag}-{abitag}-{platform tag}.whl` with the actual path to the wheel file on your system.\n\n### Option 3: Build from source\n\nRequires `cargo`:\n\n```sh\nxiangting-py$ pip install .\n```\n\n## Usage\n\nThe hand is represented as an array of `list[int]`, where each element represents the count of a specific tile.\nThe correspondence between the index and the tile is shown in the table below.\n\n| Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |\n| ----- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n| Tile | 1m | 2m | 3m | 4m | 5m | 6m | 7m | 8m | 9m |\n\n| Index | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |\n| ----- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n| Tile | 1p | 2p | 3p | 4p | 5p | 6p | 7p | 8p | 9p |\n\n| Index | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 |\n| ----- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n| Tile | 1s | 2s | 3s | 4s | 5s | 6s | 7s | 8s | 9s |\n\n| Index | 27 | 28 | 29 | 30 | 31 | 32 | 33 |\n| ----- | --------- | ---------- | --------- | ---------- | ---------- | ---------- | -------- |\n| Tile | East (1z) | South (2z) | West (3z) | North (4z) | White (5z) | Green (6z) | Red (7z) |\n\nCalculates the replacement number, which is equal to the deficiency number (a.k.a. xiangting number, \u5411\u8074\u6570) + 1.\n\n```python\nfrom xiangting import calculate_replacement_number\n\n# 123m456p789s11222z\nhand_14 = [\n 1, 1, 1, 0, 0, 0, 0, 0, 0, # m\n 0, 0, 0, 1, 1, 1, 0, 0, 0, # p\n 0, 0, 0, 0, 0, 0, 1, 1, 1, # s\n 2, 3, 0, 0, 0, 0, 0, # z\n]\n\nreplacement_number = calculate_replacement_number(hand_14, None)\nassert replacement_number == 0\n```\n\nIn the calculation for a hand with melds (\u526f\u9732),\nthe melded tiles can be included or excluded when counting tiles to determine if a hand contains four identical ones.\n\nIf melds are excluded (e.g., \u5929\u9cf3 (Tenhou), \u96c0\u9b42 (Mahjong Soul)), specify `None` for `fulu_mianzi_list`.\n\nIf melds are included (e.g., World Riichi Championship, M.LEAGUE), the melds should be included in the `fulu_mianzi_list`.\n\n```python\nfrom xiangting import (\n ClaimedTilePosition,\n FuluMianzi,\n calculate_replacement_number,\n)\n\n# 123m1z (3 melds)\nhand_4 = [\n 1, 1, 1, 0, 0, 0, 0, 0, 0, # m\n 0, 0, 0, 0, 0, 0, 0, 0, 0, # p\n 0, 0, 0, 0, 0, 0, 0, 0, 0, # s\n 1, 0, 0, 0, 0, 0, 0, # z\n]\n\n# 456p 7777s 111z\nmelds = [\n FuluMianzi.Shunzi(12, ClaimedTilePosition.LOW),\n FuluMianzi.Gangzi(24),\n FuluMianzi.Kezi(27),\n None,\n]\n\nreplacement_number_wo_melds = calculate_replacement_number(hand_4, None)\nassert replacement_number_wo_melds == 1\n\nreplacement_number_w_melds = calculate_replacement_number(hand_4, melds)\nassert replacement_number_w_melds == 2\n```\n\nIn three-player mahjong, the tiles from 2m (\u4e8c\u842c) to 8m (\u516b\u842c) are not used.\nAdditionally, melded sequences (\u660e\u9806\u5b50) are not allowed.\n\n```python\nfrom xiangting import (\n calculate_replacement_number,\n calculate_replacement_number_3_player,\n)\n\n# 1111m111122233z\nhand_13 = [\n 4, 0, 0, 0, 0, 0, 0, 0, 0, # m\n 0, 0, 0, 0, 0, 0, 0, 0, 0, # p\n 0, 0, 0, 0, 0, 0, 0, 0, 0, # s\n 4, 3, 2, 0, 0, 0, 0, # z\n]\n\nreplacement_number_4p = calculate_replacement_number(hand_13, None)\nassert replacement_number_4p == 2\n\nreplacement_number_3p = calculate_replacement_number_3_player(hand_13, None)\nassert replacement_number_3p == 3\n```\n\n## License\n\nCopyright (c) Apricot S. All rights reserved.\n\nLicensed under the [MIT license](LICENSE).\n\n",
"bugtrack_url": null,
"license": "MIT License",
"summary": "Python bindings for xiangting",
"version": "3.1.1",
"project_urls": {
"Repository": "https://github.com/Apricot-S/xiangting-py"
},
"split_keywords": [
"mahjong",
" shanten",
" xiangting"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "454e6fe5d6620776b2ded0e07b1153355a28b4d7242ca96b85cbceb61acd921f",
"md5": "399e81f31502b66a46eee59151c095a3",
"sha256": "30bc0304664d9d0db5b513e1574e0453982da43564518ffd7af07b220db3efa9"
},
"downloads": -1,
"filename": "xiangting-3.1.1-cp312-cp312-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "399e81f31502b66a46eee59151c095a3",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.12",
"size": 1528592,
"upload_time": "2025-02-08T14:13:49",
"upload_time_iso_8601": "2025-02-08T14:13:49.261498Z",
"url": "https://files.pythonhosted.org/packages/45/4e/6fe5d6620776b2ded0e07b1153355a28b4d7242ca96b85cbceb61acd921f/xiangting-3.1.1-cp312-cp312-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "9810d6b639473abdb0682f91b99901bc76a6bc115fd91589b674384ef9c7986f",
"md5": "00c7ce9423d8293a9a3467ccdb49f520",
"sha256": "5794621be7cd947f0f82ae6a6b339c06bf8add5ceb3409ec32e08e67020382c3"
},
"downloads": -1,
"filename": "xiangting-3.1.1-cp312-cp312-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "00c7ce9423d8293a9a3467ccdb49f520",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.12",
"size": 1580964,
"upload_time": "2025-02-08T14:13:44",
"upload_time_iso_8601": "2025-02-08T14:13:44.924377Z",
"url": "https://files.pythonhosted.org/packages/98/10/d6b639473abdb0682f91b99901bc76a6bc115fd91589b674384ef9c7986f/xiangting-3.1.1-cp312-cp312-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "bcf2424a8a730b7540befd1f9a41bd1e8c0ae1580ffa049616d711c1f6af94c0",
"md5": "48ba9c01f81a7cc5eb16bc26a1f6ff12",
"sha256": "e17216f5dc3c8d3c9420a6961f00a00bbd7433cdb9ceffe32c9e079ad16806a4"
},
"downloads": -1,
"filename": "xiangting-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "48ba9c01f81a7cc5eb16bc26a1f6ff12",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.12",
"size": 1556400,
"upload_time": "2025-02-08T14:13:29",
"upload_time_iso_8601": "2025-02-08T14:13:29.689562Z",
"url": "https://files.pythonhosted.org/packages/bc/f2/424a8a730b7540befd1f9a41bd1e8c0ae1580ffa049616d711c1f6af94c0/xiangting-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b9f16f78ce06ce426dccb5f977124e2140ce8379ee4dd613c3779015e425b8f7",
"md5": "64223e92a693a09ff567a2ec6101c89d",
"sha256": "a57f5f850325811eb1cc97ace25f868cdd1a0aaa412362b8c59eaa9ff07816a6"
},
"downloads": -1,
"filename": "xiangting-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "64223e92a693a09ff567a2ec6101c89d",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.12",
"size": 1556530,
"upload_time": "2025-02-08T14:13:35",
"upload_time_iso_8601": "2025-02-08T14:13:35.332206Z",
"url": "https://files.pythonhosted.org/packages/b9/f1/6f78ce06ce426dccb5f977124e2140ce8379ee4dd613c3779015e425b8f7/xiangting-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "60b5c9d5e8be0dfb3094607fb3793457170153c9e5aaffab1205e972c413d32f",
"md5": "57e52a75b78b5ef16ab63617bab61898",
"sha256": "eb7e6fcc70843976ad45506f3ac9319ea7270125caa823ea1e7ae310ec1fd8b1"
},
"downloads": -1,
"filename": "xiangting-3.1.1-cp312-cp312-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "57e52a75b78b5ef16ab63617bab61898",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.12",
"size": 1732995,
"upload_time": "2025-02-08T14:13:52",
"upload_time_iso_8601": "2025-02-08T14:13:52.835114Z",
"url": "https://files.pythonhosted.org/packages/60/b5/c9d5e8be0dfb3094607fb3793457170153c9e5aaffab1205e972c413d32f/xiangting-3.1.1-cp312-cp312-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "be987aa35ebd5e30084791ba08c0e19c46c5880d9e0de23e1380677ff9a89060",
"md5": "01327695c584f48233236c45fa25813b",
"sha256": "a97314865a13a8c9ad28f4974701c44d0f0cc7daf90b641c0462b64ecd26ed3f"
},
"downloads": -1,
"filename": "xiangting-3.1.1-cp312-cp312-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "01327695c584f48233236c45fa25813b",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.12",
"size": 1725618,
"upload_time": "2025-02-08T14:13:56",
"upload_time_iso_8601": "2025-02-08T14:13:56.151818Z",
"url": "https://files.pythonhosted.org/packages/be/98/7aa35ebd5e30084791ba08c0e19c46c5880d9e0de23e1380677ff9a89060/xiangting-3.1.1-cp312-cp312-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e96f577a4940805ec5debca444cc8a8d626ffafccbeaaaf0a23cf5edf8dc4b01",
"md5": "5b8888966382834f2e2bfb307e82aadc",
"sha256": "a2b3c915aa642ac4b710f932df16ed8049ed3493cd0e097b5abb477522d94352"
},
"downloads": -1,
"filename": "xiangting-3.1.1-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "5b8888966382834f2e2bfb307e82aadc",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.12",
"size": 1417784,
"upload_time": "2025-02-08T14:14:01",
"upload_time_iso_8601": "2025-02-08T14:14:01.592649Z",
"url": "https://files.pythonhosted.org/packages/e9/6f/577a4940805ec5debca444cc8a8d626ffafccbeaaaf0a23cf5edf8dc4b01/xiangting-3.1.1-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "8ec4079e1644b4f0b54c4b56fee12d2b0932b919f99dd5c5b38ef364ec614a18",
"md5": "a614ff0d5d2af5ad540937238e5dec8d",
"sha256": "53f183047909ab3ecd6dea4eb22b556a795bb0f8b15ba1cdff5597a30f96cf27"
},
"downloads": -1,
"filename": "xiangting-3.1.1-cp313-cp313-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "a614ff0d5d2af5ad540937238e5dec8d",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.12",
"size": 1528327,
"upload_time": "2025-02-08T14:13:51",
"upload_time_iso_8601": "2025-02-08T14:13:51.411977Z",
"url": "https://files.pythonhosted.org/packages/8e/c4/079e1644b4f0b54c4b56fee12d2b0932b919f99dd5c5b38ef364ec614a18/xiangting-3.1.1-cp313-cp313-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "84e8b974934b57f5ee037438d6f2d9f0dacc753a8fd9be22acf9970b4322cc77",
"md5": "b34d6b1f7b4864f174c750ef7c063210",
"sha256": "c6c1becd297a274e08218307a39074e01704dc74fb02ed7c186a9ef5af34f4ba"
},
"downloads": -1,
"filename": "xiangting-3.1.1-cp313-cp313-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "b34d6b1f7b4864f174c750ef7c063210",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.12",
"size": 1580978,
"upload_time": "2025-02-08T14:13:47",
"upload_time_iso_8601": "2025-02-08T14:13:47.076754Z",
"url": "https://files.pythonhosted.org/packages/84/e8/b974934b57f5ee037438d6f2d9f0dacc753a8fd9be22acf9970b4322cc77/xiangting-3.1.1-cp313-cp313-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "838c34faf6d29a5e4b412a4eef7d338e044f8e56a5d5fd1820792896a235e372",
"md5": "7bd1dea010c51d87ed14f35a264cabdf",
"sha256": "753b1d3f2d6aa80af3a7700307f50d565d9e33d159cc56499466d2a29fd17e0f"
},
"downloads": -1,
"filename": "xiangting-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "7bd1dea010c51d87ed14f35a264cabdf",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.12",
"size": 1556921,
"upload_time": "2025-02-08T14:13:31",
"upload_time_iso_8601": "2025-02-08T14:13:31.840996Z",
"url": "https://files.pythonhosted.org/packages/83/8c/34faf6d29a5e4b412a4eef7d338e044f8e56a5d5fd1820792896a235e372/xiangting-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "45aa62ebdff6eb4d610252cd2feb677a38f967513a1231e8d113869919eb82d6",
"md5": "af26b7dd38a8c9d7c31b2dd86b16c2ae",
"sha256": "a9e85d6945081e2998e2d6e96e94492d461c9552dae2becc335db95527a03152"
},
"downloads": -1,
"filename": "xiangting-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "af26b7dd38a8c9d7c31b2dd86b16c2ae",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.12",
"size": 1556996,
"upload_time": "2025-02-08T14:13:42",
"upload_time_iso_8601": "2025-02-08T14:13:42.098995Z",
"url": "https://files.pythonhosted.org/packages/45/aa/62ebdff6eb4d610252cd2feb677a38f967513a1231e8d113869919eb82d6/xiangting-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "96454c0e1c5e874036cb89707fc7af9711fe229e304b05ff8cfb4c0f292a2f33",
"md5": "9cf07568979f90405a4adb805ef9932e",
"sha256": "8606752751cf96613cd7c958fbcb0dd5a7000f5dd1c50a403b2f49487640784c"
},
"downloads": -1,
"filename": "xiangting-3.1.1-cp313-cp313-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "9cf07568979f90405a4adb805ef9932e",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.12",
"size": 1733166,
"upload_time": "2025-02-08T14:13:54",
"upload_time_iso_8601": "2025-02-08T14:13:54.523595Z",
"url": "https://files.pythonhosted.org/packages/96/45/4c0e1c5e874036cb89707fc7af9711fe229e304b05ff8cfb4c0f292a2f33/xiangting-3.1.1-cp313-cp313-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "562dcca4a4d23d24f4156bf252d67b68cb98afa208b10d46d28e5ea27dcd6ddb",
"md5": "d6e0e244e8fe364fa5f95ae1f01c927a",
"sha256": "15e1decc5520744f289265d4972c138ae2a135dc9759da94ac7dccec817c4cdb"
},
"downloads": -1,
"filename": "xiangting-3.1.1-cp313-cp313-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "d6e0e244e8fe364fa5f95ae1f01c927a",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.12",
"size": 1725757,
"upload_time": "2025-02-08T14:13:58",
"upload_time_iso_8601": "2025-02-08T14:13:58.217782Z",
"url": "https://files.pythonhosted.org/packages/56/2d/cca4a4d23d24f4156bf252d67b68cb98afa208b10d46d28e5ea27dcd6ddb/xiangting-3.1.1-cp313-cp313-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "625b31954f5a9d6c0229f98a86a499a32bdd9538058b636616ce701efd12d1c4",
"md5": "4e7bf3bfa6852e3f3681c98190b95719",
"sha256": "8a016aaf745e208e98c4f92fc0c500a9f91d4c57908a0033c431ee800a46653a"
},
"downloads": -1,
"filename": "xiangting-3.1.1-cp313-cp313-win_amd64.whl",
"has_sig": false,
"md5_digest": "4e7bf3bfa6852e3f3681c98190b95719",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.12",
"size": 1417900,
"upload_time": "2025-02-08T14:14:03",
"upload_time_iso_8601": "2025-02-08T14:14:03.628959Z",
"url": "https://files.pythonhosted.org/packages/62/5b/31954f5a9d6c0229f98a86a499a32bdd9538058b636616ce701efd12d1c4/xiangting-3.1.1-cp313-cp313-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "2414feed8664343b14565d66c9bce398c169bb540465f10b975f9715e9935fd0",
"md5": "8d93780b0ba964c0f9600d0b6c9619ef",
"sha256": "e840a866706d63e70aed6d2304a6abb6ea3fb64b8749b65138d95b530ffe8cf1"
},
"downloads": -1,
"filename": "xiangting-3.1.1.tar.gz",
"has_sig": false,
"md5_digest": "8d93780b0ba964c0f9600d0b6c9619ef",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.12",
"size": 8847,
"upload_time": "2025-02-08T14:14:00",
"upload_time_iso_8601": "2025-02-08T14:14:00.034478Z",
"url": "https://files.pythonhosted.org/packages/24/14/feed8664343b14565d66c9bce398c169bb540465f10b975f9715e9935fd0/xiangting-3.1.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-02-08 14:14:00",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "Apricot-S",
"github_project": "xiangting-py",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "xiangting"
}