xingque


Namexingque JSON
Version 0.2.0 PyPI version JSON
download
home_pageNone
SummaryYet another typed Python binding to starlark-rust
upload_time2024-06-25 05:20:29
maintainerNone
docs_urlNone
authorWANG Xuerui <git@xen0n.name>
requires_python>=3.8
licenseApache-2.0
keywords starlark starlark-rust pyo3
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # ζ˜Ÿι›€ `xingque` ✨🐦

Yet another Python binding to [`starlark-rust`][starlark-rust], exposing the
[Starlark] language to your Python projects. The current version wraps
`starlark-rust` version 0.12.x.

The project's name is a [calque] of "Starlark" into Chinese. It is
pronounced *xīng què* (in Standard Pinyin) or *Hsing-ch'üeh* (in Wade-Giles).

<details>
<summary>The reason behind the curious name</summary>

I had to come up with another name for the project after discovering
[an identically named project][starlark-pyo3] after I first renamed the
project `starlark-pyo3` from `python-starlark-rs`, and that the probably
next-best alternative `pystarlark` was also taken long ago. Fortunately
though, the Chinese name is shorter to type, even shorter than "starlark"
itself...

</details>

[calque]: https://en.wikipedia.org/wiki/Calque
[starlark-go]: https://github.com/caketop/python-starlark-go
[starlark-pyo3]: https://github.com/inducer/starlark-pyo3
[starlark-rust]: https://github.com/facebook/starlark-rust
[Starlark]: https://github.com/bazelbuild/starlark

**NOTE: this project still has rough corners, do not use in production yet without due care. Expect breaking changes to the API before a 1.0 version.**

## Features

A fair amount of `starlark-rust` API has been wrapped so far. You can see the
[smoke test cases](./tests/test_smoke.py) for some examples on how to integrate
this package.

This project as compared to other known bindings:

|Feature|✨🐦|[`starlark-pyo3`][starlark-pyo3]|[`starlark-go`][starlark-go]|
|---|---|---|---|
|License|Apache-2.0|Apache-2.0|Apache-2.0|
|`py.typed`|βœ…|❌|βœ…|
|Binding framework|PyO3|PyO3|cgo|
|[ABI3] compatibility|βœ… any Python &ge; 3.8|❌|❌|
|Bundled ✨|Rust, 0.12.x|Rust, 0.10.x|Go, circa March 2023|
|Data marshalling|⚑ native FFI|πŸ“¦ via Python `json`|⚑ native FFI|
|Accessing opaque 🐍 values from ✨|βœ…|❌|πŸ’₯ crashes|
|Accessing opaque ✨ values from 🐍|βœ…|❌|❌|
|Magic method proxying for opaque 🐍 values|βœ… somewhat complete|❌|❌|
|Magic method proxying for opaque ✨ values|πŸ”§ WIP|❌|❌|
|Invoking 🐍 callables from ✨|βœ…|❌|❌|
|Invoking ✨ callables from 🐍|βœ…|❌|❌|
|Linting|πŸ“† planned|βœ…|❌|
|LSP integration|πŸ“† planned|❌|❌|
|Profiling & code coverage|πŸ“† planned|❌|❌|
|Structured ✨ documentation|πŸ“† planned|❌|❌|

[ABI3]: https://docs.python.org/3/c-api/stable.html#stable-abi

### Objects across language boundary

Two-way data marshalling is done natively if a type is available both in Python
and Starlark. For complex and/or user-defined types such as classes, opaque
wrappers at both sides are available to allow some flexibility -- after all,
people would expect some degree of interoperability between Python and Starlark,
because Starlark is (arguably) seen by many as a dialect of Python.
Opaque Python values in Starlark all have the `pyobject` type; while opaque
Starlark values are `starlark.FrozenValue` and `starlark.Value` in Python.

Identity i.e. uniqueness for the underlying concrete objects is NOT preserved
for objects across the language boundary: for example, each time you `get` a
plain-old-data value from a `FrozenModule` a new Python object would be created.
This should not cause problems at the Starlark side, as identity comparison (the
`is` operator) is [not supported in Starlark][no-is-in-starlark] anyway, but you
should take care at the Python side. Opaque Python values in Starlark context
maintain their identities when being read back from Python though, because they
are in fact just references to the original `object` being `set`.

[no-is-in-starlark]: https://github.com/bazelbuild/starlark/blob/c8d88c388698b0ee49bc74737f56236af64da1b5/design.md#no-is-operator

`xingque` proxies an opaque Python value's most magic methods into Starlark.
This means you can pass your Python objects and callables into Starlark, and use
them largely as if the runtime is still Python.

Due to missing API in Starlark and/or PyO3, there can be some operators for
whose Python to Starlark proxying is not supported right now. Currently this is:

* absolute value: Starlark `abs(x)`, Python `__abs__`: missing `StarlarkValue` trait method

There are other features that are not implemented right now, but I have plans
to support in a future version. These are:

* slicing i.e. sequence-like usage
* `__{get,set,del}item__` i.e. mapping-like usage
* iterator protocol

### Memory safety

There is no enforced ownership tracking in Python, unlike Rust, so exceptions
will be thrown if one tries to use an already consumed object, for example an
`AstModule` already evaluated by an `Evaluator`.

The `starlark::values::Value` type does not allow tracking its originating heap
in the public API (at least during my investigation while implementing this
library), so beware: **Python interpreter crashes can occur** if a
`starlark.Value`'s originating heap is GC-ed but a reference to such a `Value`
is kept elsewhere and later used. More design is needed for fixing the problem;
one should expect breaking changes to the API in a future version of this library.
Meanwhile, use frozen values and modules whenever appropriate; more determinism
can never hurt.

## License

Copyright &copy; 2024 WANG Xuerui. All rights reserved.

`xingque` is licensed under the [Apache 2.0 license](./LICENSE.Apache-2.0).


            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "xingque",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": "WANG Xuerui <git@xen0n.name>",
    "keywords": "starlark, starlark-rust, pyo3",
    "author": "WANG Xuerui <git@xen0n.name>",
    "author_email": "WANG Xuerui <git@xen0n.name>",
    "download_url": "https://files.pythonhosted.org/packages/94/36/3a5ca209917a45fd69476df3355da2efea4bc149fe77160cf8d46b0d26b6/xingque-0.2.0.tar.gz",
    "platform": null,
    "description": "# \u661f\u96c0 `xingque` \u2728\ud83d\udc26\n\nYet another Python binding to [`starlark-rust`][starlark-rust], exposing the\n[Starlark] language to your Python projects. The current version wraps\n`starlark-rust` version 0.12.x.\n\nThe project's name is a [calque] of \"Starlark\" into Chinese. It is\npronounced *x\u012bng qu\u00e8* (in Standard Pinyin) or *Hsing-ch'\u00fceh* (in Wade-Giles).\n\n<details>\n<summary>The reason behind the curious name</summary>\n\nI had to come up with another name for the project after discovering\n[an identically named project][starlark-pyo3] after I first renamed the\nproject `starlark-pyo3` from `python-starlark-rs`, and that the probably\nnext-best alternative `pystarlark` was also taken long ago. Fortunately\nthough, the Chinese name is shorter to type, even shorter than \"starlark\"\nitself...\n\n</details>\n\n[calque]: https://en.wikipedia.org/wiki/Calque\n[starlark-go]: https://github.com/caketop/python-starlark-go\n[starlark-pyo3]: https://github.com/inducer/starlark-pyo3\n[starlark-rust]: https://github.com/facebook/starlark-rust\n[Starlark]: https://github.com/bazelbuild/starlark\n\n**NOTE: this project still has rough corners, do not use in production yet without due care. Expect breaking changes to the API before a 1.0 version.**\n\n## Features\n\nA fair amount of `starlark-rust` API has been wrapped so far. You can see the\n[smoke test cases](./tests/test_smoke.py) for some examples on how to integrate\nthis package.\n\nThis project as compared to other known bindings:\n\n|Feature|\u2728\ud83d\udc26|[`starlark-pyo3`][starlark-pyo3]|[`starlark-go`][starlark-go]|\n|---|---|---|---|\n|License|Apache-2.0|Apache-2.0|Apache-2.0|\n|`py.typed`|\u2705|\u274c|\u2705|\n|Binding framework|PyO3|PyO3|cgo|\n|[ABI3] compatibility|\u2705 any Python &ge; 3.8|\u274c|\u274c|\n|Bundled \u2728|Rust, 0.12.x|Rust, 0.10.x|Go, circa March 2023|\n|Data marshalling|\u26a1 native FFI|\ud83d\udce6 via Python `json`|\u26a1 native FFI|\n|Accessing opaque \ud83d\udc0d values from \u2728|\u2705|\u274c|\ud83d\udca5 crashes|\n|Accessing opaque \u2728 values from \ud83d\udc0d|\u2705|\u274c|\u274c|\n|Magic method proxying for opaque \ud83d\udc0d values|\u2705 somewhat complete|\u274c|\u274c|\n|Magic method proxying for opaque \u2728 values|\ud83d\udd27 WIP|\u274c|\u274c|\n|Invoking \ud83d\udc0d callables from \u2728|\u2705|\u274c|\u274c|\n|Invoking \u2728 callables from \ud83d\udc0d|\u2705|\u274c|\u274c|\n|Linting|\ud83d\udcc6 planned|\u2705|\u274c|\n|LSP integration|\ud83d\udcc6 planned|\u274c|\u274c|\n|Profiling & code coverage|\ud83d\udcc6 planned|\u274c|\u274c|\n|Structured \u2728 documentation|\ud83d\udcc6 planned|\u274c|\u274c|\n\n[ABI3]: https://docs.python.org/3/c-api/stable.html#stable-abi\n\n### Objects across language boundary\n\nTwo-way data marshalling is done natively if a type is available both in Python\nand Starlark. For complex and/or user-defined types such as classes, opaque\nwrappers at both sides are available to allow some flexibility -- after all,\npeople would expect some degree of interoperability between Python and Starlark,\nbecause Starlark is (arguably) seen by many as a dialect of Python.\nOpaque Python values in Starlark all have the `pyobject` type; while opaque\nStarlark values are `starlark.FrozenValue` and `starlark.Value` in Python.\n\nIdentity i.e. uniqueness for the underlying concrete objects is NOT preserved\nfor objects across the language boundary: for example, each time you `get` a\nplain-old-data value from a `FrozenModule` a new Python object would be created.\nThis should not cause problems at the Starlark side, as identity comparison (the\n`is` operator) is [not supported in Starlark][no-is-in-starlark] anyway, but you\nshould take care at the Python side. Opaque Python values in Starlark context\nmaintain their identities when being read back from Python though, because they\nare in fact just references to the original `object` being `set`.\n\n[no-is-in-starlark]: https://github.com/bazelbuild/starlark/blob/c8d88c388698b0ee49bc74737f56236af64da1b5/design.md#no-is-operator\n\n`xingque` proxies an opaque Python value's most magic methods into Starlark.\nThis means you can pass your Python objects and callables into Starlark, and use\nthem largely as if the runtime is still Python.\n\nDue to missing API in Starlark and/or PyO3, there can be some operators for\nwhose Python to Starlark proxying is not supported right now. Currently this is:\n\n* absolute value: Starlark `abs(x)`, Python `__abs__`: missing `StarlarkValue` trait method\n\nThere are other features that are not implemented right now, but I have plans\nto support in a future version. These are:\n\n* slicing i.e. sequence-like usage\n* `__{get,set,del}item__` i.e. mapping-like usage\n* iterator protocol\n\n### Memory safety\n\nThere is no enforced ownership tracking in Python, unlike Rust, so exceptions\nwill be thrown if one tries to use an already consumed object, for example an\n`AstModule` already evaluated by an `Evaluator`.\n\nThe `starlark::values::Value` type does not allow tracking its originating heap\nin the public API (at least during my investigation while implementing this\nlibrary), so beware: **Python interpreter crashes can occur** if a\n`starlark.Value`'s originating heap is GC-ed but a reference to such a `Value`\nis kept elsewhere and later used. More design is needed for fixing the problem;\none should expect breaking changes to the API in a future version of this library.\nMeanwhile, use frozen values and modules whenever appropriate; more determinism\ncan never hurt.\n\n## License\n\nCopyright &copy; 2024 WANG Xuerui. All rights reserved.\n\n`xingque` is licensed under the [Apache 2.0 license](./LICENSE.Apache-2.0).\n\n",
    "bugtrack_url": null,
    "license": "Apache-2.0",
    "summary": "Yet another typed Python binding to starlark-rust",
    "version": "0.2.0",
    "project_urls": {
        "changelog": "https://github.com/xen0n/xingque/blob/main/CHANGELOG.md",
        "homepage": "https://github.com/xen0n/xingque",
        "repository": "https://github.com/xen0n/xingque"
    },
    "split_keywords": [
        "starlark",
        " starlark-rust",
        " pyo3"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "32de54d02cda300d9d8a367e268e834e81f94d55494c396b12ff57a71e4b784d",
                "md5": "5a7ea79e7540339729acae896fd5c584",
                "sha256": "d4fb551b06ab915d3f197e703818e7f7ca05e15629e038e77dfca376804fb4a6"
            },
            "downloads": -1,
            "filename": "xingque-0.2.0-cp38-abi3-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "5a7ea79e7540339729acae896fd5c584",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 2962019,
            "upload_time": "2024-06-25T05:20:16",
            "upload_time_iso_8601": "2024-06-25T05:20:16.580507Z",
            "url": "https://files.pythonhosted.org/packages/32/de/54d02cda300d9d8a367e268e834e81f94d55494c396b12ff57a71e4b784d/xingque-0.2.0-cp38-abi3-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "da5b2915843d0bb294f7e5075af7dbf0e1c28b52f6157d86dd0d65ddab257262",
                "md5": "746350eb7eaff48465e2b879ed961bf2",
                "sha256": "3377090b9ec25e0be194b5cdf93e109e75ae3cd4d5f67e77e6d106ae46494896"
            },
            "downloads": -1,
            "filename": "xingque-0.2.0-cp38-abi3-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "746350eb7eaff48465e2b879ed961bf2",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 2946082,
            "upload_time": "2024-06-25T05:20:14",
            "upload_time_iso_8601": "2024-06-25T05:20:14.735422Z",
            "url": "https://files.pythonhosted.org/packages/da/5b/2915843d0bb294f7e5075af7dbf0e1c28b52f6157d86dd0d65ddab257262/xingque-0.2.0-cp38-abi3-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "90e4e2d4e15c22edf083bedf7c68bfaa3acebe0ea416b76517392c25aca82fdd",
                "md5": "6b901fbfd65e29bfc50b3eb163f0e36d",
                "sha256": "2dd41d688c44f375a10e0d65a7bc4ed168f0ac38679bb1fca3160c4eec5838d7"
            },
            "downloads": -1,
            "filename": "xingque-0.2.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "6b901fbfd65e29bfc50b3eb163f0e36d",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 3634451,
            "upload_time": "2024-06-25T05:19:58",
            "upload_time_iso_8601": "2024-06-25T05:19:58.278586Z",
            "url": "https://files.pythonhosted.org/packages/90/e4/e2d4e15c22edf083bedf7c68bfaa3acebe0ea416b76517392c25aca82fdd/xingque-0.2.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "2e74974148bcc8ef60a6d08fdd4a947d7bdefe2fe035bad7a3cf23811a0ab9aa",
                "md5": "d45938aaad894759cc118c39f7b56a42",
                "sha256": "0fc678a16a093de5d86d8fca4bbdece7f5c4b46646b79e549ade46c66ae9ebc3"
            },
            "downloads": -1,
            "filename": "xingque-0.2.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "has_sig": false,
            "md5_digest": "d45938aaad894759cc118c39f7b56a42",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 3388811,
            "upload_time": "2024-06-25T05:20:00",
            "upload_time_iso_8601": "2024-06-25T05:20:00.774373Z",
            "url": "https://files.pythonhosted.org/packages/2e/74/974148bcc8ef60a6d08fdd4a947d7bdefe2fe035bad7a3cf23811a0ab9aa/xingque-0.2.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b521fc11f5199dae7fb270917cb075fd0f74c50133aaa7ab093bd3f7971f45b2",
                "md5": "47782f44223e5a7ba2b140fa61b84177",
                "sha256": "6a124ffd5fd1db68db5fbb64138522ebe693e18a3d129d4310a78d7c9fed8e6a"
            },
            "downloads": -1,
            "filename": "xingque-0.2.0-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "has_sig": false,
            "md5_digest": "47782f44223e5a7ba2b140fa61b84177",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 3792681,
            "upload_time": "2024-06-25T05:20:04",
            "upload_time_iso_8601": "2024-06-25T05:20:04.053090Z",
            "url": "https://files.pythonhosted.org/packages/b5/21/fc11f5199dae7fb270917cb075fd0f74c50133aaa7ab093bd3f7971f45b2/xingque-0.2.0-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "7dfda50e5e9a23c9a0c616085678c1a1ec5f9d7f34bce396d6793f60352b3952",
                "md5": "10a2264b5d7a44fae981ebf269d832b1",
                "sha256": "447684846442c32e9dadf90b35072b6b3136c7f6151791a4d66fed264f93386a"
            },
            "downloads": -1,
            "filename": "xingque-0.2.0-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl",
            "has_sig": false,
            "md5_digest": "10a2264b5d7a44fae981ebf269d832b1",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 4140690,
            "upload_time": "2024-06-25T05:20:07",
            "upload_time_iso_8601": "2024-06-25T05:20:07.265521Z",
            "url": "https://files.pythonhosted.org/packages/7d/fd/a50e5e9a23c9a0c616085678c1a1ec5f9d7f34bce396d6793f60352b3952/xingque-0.2.0-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "41dc4d0d5f4c537a764058500a8eade1ba9d60519856082780f3f84893dcb28b",
                "md5": "461d70fdf797747b44110b937e4044bc",
                "sha256": "3d78a555360c883d340da48cbc264d61afe81c80ca3b6170b8b1e2bdac29d112"
            },
            "downloads": -1,
            "filename": "xingque-0.2.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "461d70fdf797747b44110b937e4044bc",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 3640867,
            "upload_time": "2024-06-25T05:20:12",
            "upload_time_iso_8601": "2024-06-25T05:20:12.705083Z",
            "url": "https://files.pythonhosted.org/packages/41/dc/4d0d5f4c537a764058500a8eade1ba9d60519856082780f3f84893dcb28b/xingque-0.2.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ed2944871eced875ef8c3a094044d032bb1a52e9e5cd89d2b79e1ede4f20d8b7",
                "md5": "e81f59ea1a23ef6f1a20f6db7c12f379",
                "sha256": "1fba58fbd203c98547533ccf593d244f4883c50fb25d6086028ab466857397a1"
            },
            "downloads": -1,
            "filename": "xingque-0.2.0-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl",
            "has_sig": false,
            "md5_digest": "e81f59ea1a23ef6f1a20f6db7c12f379",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 3638595,
            "upload_time": "2024-06-25T05:20:10",
            "upload_time_iso_8601": "2024-06-25T05:20:10.012499Z",
            "url": "https://files.pythonhosted.org/packages/ed/29/44871eced875ef8c3a094044d032bb1a52e9e5cd89d2b79e1ede4f20d8b7/xingque-0.2.0-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "8769dfb151b0a31cc8083ac1f904359607f81016276fdf9a8e618280450c073f",
                "md5": "60ce9c56cf35a064618fd8272d71bca1",
                "sha256": "2d3de8be0d002f000ed78c29f45610c5312f2ac106c4a5650223ef121a2b63e3"
            },
            "downloads": -1,
            "filename": "xingque-0.2.0-cp38-abi3-musllinux_1_2_aarch64.whl",
            "has_sig": false,
            "md5_digest": "60ce9c56cf35a064618fd8272d71bca1",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 3806707,
            "upload_time": "2024-06-25T05:20:18",
            "upload_time_iso_8601": "2024-06-25T05:20:18.540311Z",
            "url": "https://files.pythonhosted.org/packages/87/69/dfb151b0a31cc8083ac1f904359607f81016276fdf9a8e618280450c073f/xingque-0.2.0-cp38-abi3-musllinux_1_2_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "334e143a7312703f56a9e74c812051c570449e5af4f3e7781256e7cb35492655",
                "md5": "6d308a3e0b83b4b88521ebf25afb6d43",
                "sha256": "ae860ce761e2d7b6a54a9946c8fecf48ad652faa8bee44f9fa72918fec3165e4"
            },
            "downloads": -1,
            "filename": "xingque-0.2.0-cp38-abi3-musllinux_1_2_armv7l.whl",
            "has_sig": false,
            "md5_digest": "6d308a3e0b83b4b88521ebf25afb6d43",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 3649909,
            "upload_time": "2024-06-25T05:20:21",
            "upload_time_iso_8601": "2024-06-25T05:20:21.207771Z",
            "url": "https://files.pythonhosted.org/packages/33/4e/143a7312703f56a9e74c812051c570449e5af4f3e7781256e7cb35492655/xingque-0.2.0-cp38-abi3-musllinux_1_2_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "61f5513d158d7b936eeb00559059fc128e47b537624f20154710d13bb7b6fa1c",
                "md5": "68787b82c19225ef8d506cae210cf6de",
                "sha256": "dc09d6bc3a0cb83cf84dec4f1b5a42466ccceb0302ebbb97d2f97b4bc79d7dd3"
            },
            "downloads": -1,
            "filename": "xingque-0.2.0-cp38-abi3-musllinux_1_2_i686.whl",
            "has_sig": false,
            "md5_digest": "68787b82c19225ef8d506cae210cf6de",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 3634782,
            "upload_time": "2024-06-25T05:20:24",
            "upload_time_iso_8601": "2024-06-25T05:20:24.128825Z",
            "url": "https://files.pythonhosted.org/packages/61/f5/513d158d7b936eeb00559059fc128e47b537624f20154710d13bb7b6fa1c/xingque-0.2.0-cp38-abi3-musllinux_1_2_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "6a0a5f90bce32a1b3bb843586858de53654a706909af5e35ceb0a323009a22d4",
                "md5": "8173e88b3fb3325ab1220769d244606d",
                "sha256": "489183e366ad32c512b706c05c43017c2057843ac9a005c8537c88acf91d4368"
            },
            "downloads": -1,
            "filename": "xingque-0.2.0-cp38-abi3-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "8173e88b3fb3325ab1220769d244606d",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 3792424,
            "upload_time": "2024-06-25T05:20:26",
            "upload_time_iso_8601": "2024-06-25T05:20:26.228168Z",
            "url": "https://files.pythonhosted.org/packages/6a/0a/5f90bce32a1b3bb843586858de53654a706909af5e35ceb0a323009a22d4/xingque-0.2.0-cp38-abi3-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5e3a474401a5231ea5c208308df084c054b17eadc2058f8a62c8a046169d2451",
                "md5": "1d099711a4edaea124d1a264117a2136",
                "sha256": "6d5d4064087701bcc6aa8d88ad019428aab253b143b98f580a25ba4f5a45e33f"
            },
            "downloads": -1,
            "filename": "xingque-0.2.0-cp38-abi3-win32.whl",
            "has_sig": false,
            "md5_digest": "1d099711a4edaea124d1a264117a2136",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 2270059,
            "upload_time": "2024-06-25T05:20:33",
            "upload_time_iso_8601": "2024-06-25T05:20:33.966100Z",
            "url": "https://files.pythonhosted.org/packages/5e/3a/474401a5231ea5c208308df084c054b17eadc2058f8a62c8a046169d2451/xingque-0.2.0-cp38-abi3-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a9f94fce4ab7575b3a13cd747093a8adad2bb07fc8df64c0e817055c561ca86e",
                "md5": "087cc960b6e3aa5864517ea5da72ae90",
                "sha256": "935cca6871aa1a417fda5f8e336e8a7a1a75ea356fa9783fa0fc3df0d561d6f7"
            },
            "downloads": -1,
            "filename": "xingque-0.2.0-cp38-abi3-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "087cc960b6e3aa5864517ea5da72ae90",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 2540490,
            "upload_time": "2024-06-25T05:20:31",
            "upload_time_iso_8601": "2024-06-25T05:20:31.598800Z",
            "url": "https://files.pythonhosted.org/packages/a9/f9/4fce4ab7575b3a13cd747093a8adad2bb07fc8df64c0e817055c561ca86e/xingque-0.2.0-cp38-abi3-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "94363a5ca209917a45fd69476df3355da2efea4bc149fe77160cf8d46b0d26b6",
                "md5": "6122579ab7372a02b796ea138badcded",
                "sha256": "60b4e58ed0c47dd36c274405a3c6d8629d442e528b8058c08d0ff56cbb2328b6"
            },
            "downloads": -1,
            "filename": "xingque-0.2.0.tar.gz",
            "has_sig": false,
            "md5_digest": "6122579ab7372a02b796ea138badcded",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 41860,
            "upload_time": "2024-06-25T05:20:29",
            "upload_time_iso_8601": "2024-06-25T05:20:29.861691Z",
            "url": "https://files.pythonhosted.org/packages/94/36/3a5ca209917a45fd69476df3355da2efea4bc149fe77160cf8d46b0d26b6/xingque-0.2.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-06-25 05:20:29",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "xen0n",
    "github_project": "xingque",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "xingque"
}
        
Elapsed time: 0.64877s