taxonomy


Nametaxonomy JSON
Version 0.10.0 PyPI version JSON
download
home_page
SummaryRoutines for loading, saving, and manipulating taxonomic trees
upload_time2023-02-08 13:54:37
maintainer
docs_urlNone
authorVincent Prouillet <vincent@onecodex.com>
requires_python
licenseMIT
keywords taxonomy bioinformatics
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Taxonomy

[![PyPI version](https://badge.fury.io/py/taxonomy.svg)](https://pypi.org/project/taxonomy/)
[![Crates version](https://img.shields.io/crates/v/taxonomy.svg)](https://crates.io/crates/taxonomy)
![CI](https://github.com/onecodex/taxonomy/workflows/CI/badge.svg)

This is a Rust library for reading, writing, and editing biological taxonomies. There are associated Python bindings for accessing most of the functionality from Python.

This library was developed initially as a component in One Codex's metagenomic classification pipeline before being refactored out, expanded, and open-sourced. It is designed such that it can be used *as is* with a number of taxonomic formats *or* the Taxonomy trait it provides can be used to add last common ancestor, traversal, etc. methods to a downstream package's taxonomy implementation.

The library ships with a number of features:
 - [X] Common support for taxonomy handling across Rust and Python
 - [X] Fast and low(er) memory usage
 - [X] NCBI taxonomy, JSON ("tree" and "node_link_data" formats), Newick, and PhyloXML support
 - [X] Easily extensible (in Rust) to support other formats and operations


## Installation

### Rust
This library can be added to an existing Cargo.toml file and installed straight from crates.io.

### Python
You can install the Python bindings directly from PyPI (binaries are only built for select architectures) with:

```bash
pip install taxonomy
```

## Python Usage

The Python taxonomy API can open and manipulate all of the formats from the Rust library.
Note that Taxonomy IDs in NCBI format are integers, but they're converted to strings on import. We find working with "string taxonomy IDs" greatly simplifies inter-operation between different taxonomy systems.

### Loading a taxonomy

Taxonomy can be loaded from a variety of sources. 

1. `Taxonomy.from_newick(value: str)`: loads a Taxonomy from a Newick-encoded string.

2. `Taxonomy.from_ncbi(ncbi_filder: str)`: loads a Taxonomy from a pair of NCBI dump files. The folder needs to contain the individual files in the NCBI taxonomy directory (e.g. nodes.dmp and names.dmp).

3. `Taxonomy.from_json(value: str, /, json_pointer: str)`: loads a Taxonomy from a JSON-encoded string. The format can either be
of the tree or node_link_data types and will be automatically detected (more details on both formats on [the documentation](https://docs.rs/taxonomy/latest/taxonomy/json/enum.JsonFormat.html). If `json_pointer` is specified, the JSON will be traversed to that sub-object before being parsed as a taxonomy.

4. `Taxonomy.from_phyloxml(value: &str)`: loads a Taxonomy from a PhyloXML-encoded string. **Experimental**

5. `Taxonomy.from_gtdb(value: &str)`: loads a Taxonomy from a GTDB-encoded string. **Experimental**

### Exporting a taxonomy

Assuming that the taxonomy has been instantiated as a variable named `tax`.

1. `tax.to_newick()`: exports a Taxonomy as a Newick-encoded byte string.
2. `tax.to_json_tree()`: exports a Taxonomy as a JSON-encoded byte string in a tree format
3. `tax.to_json_node_links()`: exports a Taxonomy as a JSON-encoded byte string in a node links format

### Using a taxonomy

Assuming that the taxonomy has been instantiated as a variable named `tax`. Note that `TaxonomyNode` is a class with
the following schema:

```python
class TaxonomyNode:
    id: str
    name: str
    parent: Optional[str]
    rank: str
```

Note that tax_id in parameters passed in functions described below are string but for example in the case of NCBI need
to be essentially quoting integers: `562 -> "562"`. 
If you loaded a taxonomy via JSON and you had additional data in your file, you can access it via indexing, `node["readcount"]` for example.

#### `tax.clone() -> Taxonomy`
Return a new taxonomy, equivalent to a deep copy.

#### `tax.root -> TaxonomyNode`
Points to the root of the taxonomy

#### `tax.parent(tax_id: str, /, at_rank: str) -> Optional[TaxonomyNode]`
Return the immediate parent TaxonomyNode of the node id.

If `at_rank` is provided, scan all the nodes in the node's lineage and return
the parent id at that rank.

Examples:

```py
parent = tax.parent("612")
parent = tax.parent("612", at_rank="species")
parent = tax.parent("612")
# Both variables will be `None` if we can't find the parent
parent = tax.parent("unknown")
```

#### `tax.parent_with_distance(tax_id: str, /, at_rank: str) -> (Optional[TaxonomyNode], Optional[float])`
Same as `parent` but return the distance in addition, as a `(TaxonomyNode, float)` tuple.

#### `tax.node(tax_id: str) -> Optional[TaxonomyNode]`

Returns the node at that id. Returns `None` if not found.
You can also use indexing to accomplish that: `tax["some_id"]` but this will raise an exception if the node
is not found.

#### `tax.find_all_by_name(name: str) -> List[TaxonomyNode]`

Returns all the nodes with that name.
In NCBI, it only accounts for *scientific names* and not synonyms.

#### `tax.children(tax_id: str) -> List[TaxonomyNode]`

Returns all direct nodes below the given tax id.

#### `tax.descendants(tax_id: str) -> List[TaxonomyNode]`

Returns all nodes below the given tax id. 
Equivalent to running `tax.children` recursively on the initial result of `tax.children(tax_id)`.

#### `tax.lineage(tax_id: str) -> List[TaxonomyNode]`

Returns all nodes above the given tax id, including itself.

#### `tax.parents(tax_id: str) -> List[TaxonomyNode]`

Returns all nodes above the given tax id.

#### `tax.lca(id1: str, id2: str) -> Optional[TaxonomyNode]`

Returns the [lowest common ancestor](https://en.wikipedia.org/wiki/Lowest_common_ancestor) for the 2 given nodes.

#### `tax.prune(keep: List[str], remove: List[str])-> Taxonomy`

Return a copy of the taxonomy containing:

- only the nodes in `keep` and their parents if provided
- all of the nodes except those in remove and their children if provided

#### `tax.remove_node(tax_id: str)`

Remove the node from the tree, re-attaching parents as needed: only a single node is removed.

#### `tax.add_node(parent_tax_id: str, new_tax_id: str)`

Add a new node to the tree at the parent provided.

#### `edit_node(tax_id: str, /, name: str, rank: str, parent_id: str, parent_dist: float)`

Edit properties on a taxonomy node.

#### `internal_index(tax_id: str)`

Return internal integer index used by some applications. For the JSON node-link
format, this is the positional index of each node in the nodes array.

### Exceptions
Only one exception is raised intentionally by the library: `TaxonomyError`.
If you get a `pyo3_runtime.PanicException` (or anything with `pyo3` in its name), this is a bug in the underlying Rust library, please open an issue.

## Development

### Rust
There is a test suite runable with `cargo test`. To test the Python-bindings you need to use the additional `python_test` feature: `cargo test --features python_test`.

### Python
To work on the Python library on a Mac OS X/Unix system (requires Python 3):
```bash
# you need the nightly version of Rust installed
curl https://sh.rustup.rs -sSf | sh

# finally, install the library in the local virtualenv
maturin develop --features python

# or using pip
pip install .
```

#### Building binary wheels and pushing to PyPI

```
# The Mac build requires switching through a few different python versions
maturin build --features python --release --strip

# The linux build requires switching through different python versions and linux compatibility targets.
# For example, to build for Python 3.10 and manylinux2010 compatibility:
docker run --rm -v $(pwd):/io ghcr.io/pyo3/maturin:main build --features=python --release --strip --interpreter=python3.10

# Upload the wheels to PyPI:
twine upload target/wheels/*
```

## Other Taxonomy Libraries

There are taxonomic toolkits for other programming languages that offer different features and provided some inspiration for this library:

*ETE Toolkit (http://etetoolkit.org/)* A Python taxonomy library

*Taxize (https://ropensci.github.io/taxize-book/)* An R toolkit for working with taxonomic data


            

Raw data

            {
    "_id": null,
    "home_page": "",
    "name": "taxonomy",
    "maintainer": "",
    "docs_url": null,
    "requires_python": "",
    "maintainer_email": "",
    "keywords": "taxonomy,bioinformatics",
    "author": "Vincent Prouillet <vincent@onecodex.com>",
    "author_email": "Vincent Prouillet <vincent@onecodex.com>",
    "download_url": "",
    "platform": null,
    "description": "# Taxonomy\n\n[![PyPI version](https://badge.fury.io/py/taxonomy.svg)](https://pypi.org/project/taxonomy/)\n[![Crates version](https://img.shields.io/crates/v/taxonomy.svg)](https://crates.io/crates/taxonomy)\n![CI](https://github.com/onecodex/taxonomy/workflows/CI/badge.svg)\n\nThis is a Rust library for reading, writing, and editing biological taxonomies. There are associated Python bindings for accessing most of the functionality from Python.\n\nThis library was developed initially as a component in One Codex's metagenomic classification pipeline before being refactored out, expanded, and open-sourced. It is designed such that it can be used *as is* with a number of taxonomic formats *or* the Taxonomy trait it provides can be used to add last common ancestor, traversal, etc. methods to a downstream package's taxonomy implementation.\n\nThe library ships with a number of features:\n - [X] Common support for taxonomy handling across Rust and Python\n - [X] Fast and low(er) memory usage\n - [X] NCBI taxonomy, JSON (\"tree\" and \"node_link_data\" formats), Newick, and PhyloXML support\n - [X] Easily extensible (in Rust) to support other formats and operations\n\n\n## Installation\n\n### Rust\nThis library can be added to an existing Cargo.toml file and installed straight from crates.io.\n\n### Python\nYou can install the Python bindings directly from PyPI (binaries are only built for select architectures) with:\n\n```bash\npip install taxonomy\n```\n\n## Python Usage\n\nThe Python taxonomy API can open and manipulate all of the formats from the Rust library.\nNote that Taxonomy IDs in NCBI format are integers, but they're converted to strings on import. We find working with \"string taxonomy IDs\" greatly simplifies inter-operation between different taxonomy systems.\n\n### Loading a taxonomy\n\nTaxonomy can be loaded from a variety of sources. \n\n1. `Taxonomy.from_newick(value: str)`: loads a Taxonomy from a Newick-encoded string.\n\n2. `Taxonomy.from_ncbi(ncbi_filder: str)`: loads a Taxonomy from a pair of NCBI dump files. The folder needs to contain the individual files in the NCBI taxonomy directory (e.g. nodes.dmp and names.dmp).\n\n3. `Taxonomy.from_json(value: str, /, json_pointer: str)`: loads a Taxonomy from a JSON-encoded string. The format can either be\nof the tree or node_link_data types and will be automatically detected (more details on both formats on [the documentation](https://docs.rs/taxonomy/latest/taxonomy/json/enum.JsonFormat.html). If `json_pointer` is specified, the JSON will be traversed to that sub-object before being parsed as a taxonomy.\n\n4. `Taxonomy.from_phyloxml(value: &str)`: loads a Taxonomy from a PhyloXML-encoded string. **Experimental**\n\n5. `Taxonomy.from_gtdb(value: &str)`: loads a Taxonomy from a GTDB-encoded string. **Experimental**\n\n### Exporting a taxonomy\n\nAssuming that the taxonomy has been instantiated as a variable named `tax`.\n\n1. `tax.to_newick()`: exports a Taxonomy as a Newick-encoded byte string.\n2. `tax.to_json_tree()`: exports a Taxonomy as a JSON-encoded byte string in a tree format\n3. `tax.to_json_node_links()`: exports a Taxonomy as a JSON-encoded byte string in a node links format\n\n### Using a taxonomy\n\nAssuming that the taxonomy has been instantiated as a variable named `tax`. Note that `TaxonomyNode` is a class with\nthe following schema:\n\n```python\nclass TaxonomyNode:\n    id: str\n    name: str\n    parent: Optional[str]\n    rank: str\n```\n\nNote that tax_id in parameters passed in functions described below are string but for example in the case of NCBI need\nto be essentially quoting integers: `562 -> \"562\"`. \nIf you loaded a taxonomy via JSON and you had additional data in your file, you can access it via indexing, `node[\"readcount\"]` for example.\n\n#### `tax.clone() -> Taxonomy`\nReturn a new taxonomy, equivalent to a deep copy.\n\n#### `tax.root -> TaxonomyNode`\nPoints to the root of the taxonomy\n\n#### `tax.parent(tax_id: str, /, at_rank: str) -> Optional[TaxonomyNode]`\nReturn the immediate parent TaxonomyNode of the node id.\n\nIf `at_rank` is provided, scan all the nodes in the node's lineage and return\nthe parent id at that rank.\n\nExamples:\n\n```py\nparent = tax.parent(\"612\")\nparent = tax.parent(\"612\", at_rank=\"species\")\nparent = tax.parent(\"612\")\n# Both variables will be `None` if we can't find the parent\nparent = tax.parent(\"unknown\")\n```\n\n#### `tax.parent_with_distance(tax_id: str, /, at_rank: str) -> (Optional[TaxonomyNode], Optional[float])`\nSame as `parent` but return the distance in addition, as a `(TaxonomyNode, float)` tuple.\n\n#### `tax.node(tax_id: str) -> Optional[TaxonomyNode]`\n\nReturns the node at that id. Returns `None` if not found.\nYou can also use indexing to accomplish that: `tax[\"some_id\"]` but this will raise an exception if the node\nis not found.\n\n#### `tax.find_all_by_name(name: str) -> List[TaxonomyNode]`\n\nReturns all the nodes with that name.\nIn NCBI, it only accounts for *scientific names* and not synonyms.\n\n#### `tax.children(tax_id: str) -> List[TaxonomyNode]`\n\nReturns all direct nodes below the given tax id.\n\n#### `tax.descendants(tax_id: str) -> List[TaxonomyNode]`\n\nReturns all nodes below the given tax id. \nEquivalent to running `tax.children` recursively on the initial result of `tax.children(tax_id)`.\n\n#### `tax.lineage(tax_id: str) -> List[TaxonomyNode]`\n\nReturns all nodes above the given tax id, including itself.\n\n#### `tax.parents(tax_id: str) -> List[TaxonomyNode]`\n\nReturns all nodes above the given tax id.\n\n#### `tax.lca(id1: str, id2: str) -> Optional[TaxonomyNode]`\n\nReturns the [lowest common ancestor](https://en.wikipedia.org/wiki/Lowest_common_ancestor) for the 2 given nodes.\n\n#### `tax.prune(keep: List[str], remove: List[str])-> Taxonomy`\n\nReturn a copy of the taxonomy containing:\n\n- only the nodes in `keep` and their parents if provided\n- all of the nodes except those in remove and their children if provided\n\n#### `tax.remove_node(tax_id: str)`\n\nRemove the node from the tree, re-attaching parents as needed: only a single node is removed.\n\n#### `tax.add_node(parent_tax_id: str, new_tax_id: str)`\n\nAdd a new node to the tree at the parent provided.\n\n#### `edit_node(tax_id: str, /, name: str, rank: str, parent_id: str, parent_dist: float)`\n\nEdit properties on a taxonomy node.\n\n#### `internal_index(tax_id: str)`\n\nReturn internal integer index used by some applications. For the JSON node-link\nformat, this is the positional index of each node in the nodes array.\n\n### Exceptions\nOnly one exception is raised intentionally by the library: `TaxonomyError`.\nIf you get a `pyo3_runtime.PanicException` (or anything with `pyo3` in its name), this is a bug in the underlying Rust library, please open an issue.\n\n## Development\n\n### Rust\nThere is a test suite runable with `cargo test`. To test the Python-bindings you need to use the additional `python_test` feature: `cargo test --features python_test`.\n\n### Python\nTo work on the Python library on a Mac OS X/Unix system (requires Python 3):\n```bash\n# you need the nightly version of Rust installed\ncurl https://sh.rustup.rs -sSf | sh\n\n# finally, install the library in the local virtualenv\nmaturin develop --features python\n\n# or using pip\npip install .\n```\n\n#### Building binary wheels and pushing to PyPI\n\n```\n# The Mac build requires switching through a few different python versions\nmaturin build --features python --release --strip\n\n# The linux build requires switching through different python versions and linux compatibility targets.\n# For example, to build for Python 3.10 and manylinux2010 compatibility:\ndocker run --rm -v $(pwd):/io ghcr.io/pyo3/maturin:main build --features=python --release --strip --interpreter=python3.10\n\n# Upload the wheels to PyPI:\ntwine upload target/wheels/*\n```\n\n## Other Taxonomy Libraries\n\nThere are taxonomic toolkits for other programming languages that offer different features and provided some inspiration for this library:\n\n*ETE Toolkit (http://etetoolkit.org/)* A Python taxonomy library\n\n*Taxize (https://ropensci.github.io/taxize-book/)* An R toolkit for working with taxonomic data\n\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Routines for loading, saving, and manipulating taxonomic trees",
    "version": "0.10.0",
    "split_keywords": [
        "taxonomy",
        "bioinformatics"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "45f270bdf9074140ce6e192768d4ea3a9b844b810c5d43270500a3ee15458040",
                "md5": "0b8e53f1296c128ea044674f9a709908",
                "sha256": "8f5c78dd8b2f6255ad66642dd8d506b1c89dcffc2b2456dc1f56415b4ef00972"
            },
            "downloads": -1,
            "filename": "taxonomy-0.10.0-cp310-cp310-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "0b8e53f1296c128ea044674f9a709908",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 406741,
            "upload_time": "2023-02-08T13:54:37",
            "upload_time_iso_8601": "2023-02-08T13:54:37.227725Z",
            "url": "https://files.pythonhosted.org/packages/45/f2/70bdf9074140ce6e192768d4ea3a9b844b810c5d43270500a3ee15458040/taxonomy-0.10.0-cp310-cp310-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e4c0d36da87c6432e4d867cb22a01ec796551c89749c266b795797a03706f790",
                "md5": "2d53bb8c79e97d7edd2cbeb9185b8865",
                "sha256": "a97ac83d9e66dd02cdcecad79164626701bf055f4712752b8438b8893323c0eb"
            },
            "downloads": -1,
            "filename": "taxonomy-0.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "2d53bb8c79e97d7edd2cbeb9185b8865",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 419927,
            "upload_time": "2023-02-08T13:54:40",
            "upload_time_iso_8601": "2023-02-08T13:54:40.005925Z",
            "url": "https://files.pythonhosted.org/packages/e4/c0/d36da87c6432e4d867cb22a01ec796551c89749c266b795797a03706f790/taxonomy-0.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "cc198e3e2cc576ba3e1138b35159d1fa0e1f308a3b1f2afcd2d5920e707f101b",
                "md5": "83dfc6730ddcaeffb1493fd9e1cb8ebb",
                "sha256": "3322570e8a484d16577d01bf33afebfdd888e7e669d0a9ad04a53efdc58a49a3"
            },
            "downloads": -1,
            "filename": "taxonomy-0.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "83dfc6730ddcaeffb1493fd9e1cb8ebb",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 419928,
            "upload_time": "2023-02-08T13:54:41",
            "upload_time_iso_8601": "2023-02-08T13:54:41.892059Z",
            "url": "https://files.pythonhosted.org/packages/cc/19/8e3e2cc576ba3e1138b35159d1fa0e1f308a3b1f2afcd2d5920e707f101b/taxonomy-0.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "51867129d0aaf8aebd3e997bf84fb951eed40a4cf93c503b0105c520672882ae",
                "md5": "35ef4e1441ec43709e03908b8caa2fcf",
                "sha256": "3e2c3d0b7d98e27f6adaca88bbe6d71f3112da141c0bcb3b30839350b29e580d"
            },
            "downloads": -1,
            "filename": "taxonomy-0.10.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "35ef4e1441ec43709e03908b8caa2fcf",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": null,
            "size": 420217,
            "upload_time": "2023-02-08T13:54:30",
            "upload_time_iso_8601": "2023-02-08T13:54:30.386520Z",
            "url": "https://files.pythonhosted.org/packages/51/86/7129d0aaf8aebd3e997bf84fb951eed40a4cf93c503b0105c520672882ae/taxonomy-0.10.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8fd464a3b7fbe159be1fdc49cae3cff33ef672fc18ed9464e47ab99bd496a38b",
                "md5": "69ce81db1207d3e4230e930ed04462ad",
                "sha256": "b353f9aa42b789351f91f041bff503c9af5b001d6183e13f25dae166ea7f613e"
            },
            "downloads": -1,
            "filename": "taxonomy-0.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "69ce81db1207d3e4230e930ed04462ad",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": null,
            "size": 420207,
            "upload_time": "2023-02-08T13:54:32",
            "upload_time_iso_8601": "2023-02-08T13:54:32.309628Z",
            "url": "https://files.pythonhosted.org/packages/8f/d4/64a3b7fbe159be1fdc49cae3cff33ef672fc18ed9464e47ab99bd496a38b/taxonomy-0.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "9967391a34664cdc18492c3a4ab7725c7ed8d83fba6c136322104f21b4e857cc",
                "md5": "e79483d49acef8d3634aea36622ccfec",
                "sha256": "6c8c655cae9bfa36b0f5b684fa51ae8f219359c9215ae9c6f723c42f8135ed96"
            },
            "downloads": -1,
            "filename": "taxonomy-0.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "e79483d49acef8d3634aea36622ccfec",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 420168,
            "upload_time": "2023-02-08T13:54:35",
            "upload_time_iso_8601": "2023-02-08T13:54:35.151945Z",
            "url": "https://files.pythonhosted.org/packages/99/67/391a34664cdc18492c3a4ab7725c7ed8d83fba6c136322104f21b4e857cc/taxonomy-0.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "916cc68239cb53c5bc2ef52ea86a8f4a4d952b92b8be73ed439901f8bff3cc0c",
                "md5": "45206ef4b9fb7d39469f4a073016bb5f",
                "sha256": "0ce9451516de53328aed3736c6d159588c31cd15d767014101fd535bcf6d5622"
            },
            "downloads": -1,
            "filename": "taxonomy-0.10.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "45206ef4b9fb7d39469f4a073016bb5f",
            "packagetype": "bdist_wheel",
            "python_version": "pp37",
            "requires_python": null,
            "size": 421869,
            "upload_time": "2023-02-08T13:54:43",
            "upload_time_iso_8601": "2023-02-08T13:54:43.550938Z",
            "url": "https://files.pythonhosted.org/packages/91/6c/c68239cb53c5bc2ef52ea86a8f4a4d952b92b8be73ed439901f8bff3cc0c/taxonomy-0.10.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "dc89af8bffecdcb8702d0129ad4407694a67ecf9d0b3d89dca7f8edfc9dce1f8",
                "md5": "8dfc333d7e50499acb88f9ce85c8039f",
                "sha256": "f224e385e83ccb12d054469344b9791fd12d9c6a16d17a61a869ce174bf4f424"
            },
            "downloads": -1,
            "filename": "taxonomy-0.10.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "8dfc333d7e50499acb88f9ce85c8039f",
            "packagetype": "bdist_wheel",
            "python_version": "pp38",
            "requires_python": null,
            "size": 420079,
            "upload_time": "2023-02-08T13:54:45",
            "upload_time_iso_8601": "2023-02-08T13:54:45.027968Z",
            "url": "https://files.pythonhosted.org/packages/dc/89/af8bffecdcb8702d0129ad4407694a67ecf9d0b3d89dca7f8edfc9dce1f8/taxonomy-0.10.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0514d6a1e0fd28042362d62c1a026c99abb88f91e4e6a463a639c2ee058c7af5",
                "md5": "ab0e184635afcd4cc21a1454ef49d166",
                "sha256": "8c36e0059499a823dc0a6bcaaa13da6ab86cef6a472829404c41b6dd2956f977"
            },
            "downloads": -1,
            "filename": "taxonomy-0.10.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "ab0e184635afcd4cc21a1454ef49d166",
            "packagetype": "bdist_wheel",
            "python_version": "pp39",
            "requires_python": null,
            "size": 420168,
            "upload_time": "2023-02-08T13:54:46",
            "upload_time_iso_8601": "2023-02-08T13:54:46.657902Z",
            "url": "https://files.pythonhosted.org/packages/05/14/d6a1e0fd28042362d62c1a026c99abb88f91e4e6a463a639c2ee058c7af5/taxonomy-0.10.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-02-08 13:54:37",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "lcname": "taxonomy"
}
        
Elapsed time: 0.04207s