stencila


Namestencila JSON
Version 2.0.0a23 PyPI version JSON
download
home_pageNone
SummaryPython SDK for Stencila
upload_time2023-11-23 10:44:03
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseApache-2.0
keywords programmable reproducible interactive documents python sdk
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Stencila SDK for Python

**Types and function bindings for using Stencila from Python**

<a href="https://pypi.org/project/stencila/">
    <img src="https://img.shields.io/pypi/v/stencila.svg?logo=python&label=stencila&style=for-the-badge&color=1d3bd1&logoColor=66ff66&labelColor=3219a8">
</a>

## 👋 Introduction

This package provides Python classes for types in the [Stencila Schema](https://github.com/stencila/stencila/tree/main/schema#readme) and bindings to core [Stencila Rust](https://github.com/stencila/stencila/tree/main/rust#readme) functions.

The primary intended audience is developers who want to develop their own tools on top of Stencila's core functionality. For example, with this package you could construct Stencila documents programmatically using Python and write them to multiple formats (e.g. Markdown, JATS XML, PDF).

> [!IMPORTANT]
> At present, there are only bindings to functions for format conversion, but future versions will expand this scope to include document management (e.g branching and merging) and execution.

## 📦 Install

```console
python -m pip install stencila
```

> [!NOTE]
> If you encounter problems with the above command, you may need to upgrade Pip using `pip install --upgrade pip`.
>
> This is due to a [change in the dependency resolver](https://pip.pypa.io/en/latest/user_guide/#changes-to-the-pip-dependency-resolver-in-20-3-2020) in Pip 20.3.

## ⚡ Usage

### Types

The `types` module contains representations of all types in the Stencila Schema.

#### Object types

Object types (aka product types) in the Stencila Schema are represented as a `dataclass`. At present the `__init__` function requires keywords to be used (this is likely to be improved soon).

For example, to construct an article with a single "Hello world!" paragraph, you can construct `Article`, `Paragraph` and `Text`:

```py
from stencila.types import Article, CreativeWork, Paragraph, Text, Thing

article = Article(content=[Paragraph(content=[Text(value="Hello world!")])])

assert isinstance(article, Article)
assert isinstance(article, CreativeWork)
assert isinstance(article, Thing)

assert isinstance(article.content[0], Paragraph)

assert isinstance(article.content[0].content[0], Text)
```

#### Union types

Union types (aka sum types) in the Stencila Schema are represented as `typing.Union`. For example, the `Block` union type is defined like so:

```py
Block = Union[
    Call,
    Claim,
    CodeBlock,
    CodeChunk,
    Division,
    Figure,
    For,
    Form,
    Heading,
...
```

#### Enumeration types

Enumeration types in the Stencila Schema are represented as `StrEnum`. For example, the `CitationIntent` enumeration is defined like so:

```py
class CitationIntent(StrEnum):
    """
    The type or nature of a citation, both factually and rhetorically.
    """

    AgreesWith = "AgreesWith"
    CitesAsAuthority = "CitesAsAuthority"
    CitesAsDataSource = "CitesAsDataSource"
    CitesAsEvidence = "CitesAsEvidence"
    CitesAsMetadataDocument = "CitesAsMetadataDocument"
    CitesAsPotentialSolution = "CitesAsPotentialSolution"
    CitesAsRecommendedReading = "CitesAsRecommendedReading"
    CitesAsRelated = "CitesAsRelated"
```

### Conversion

The `convert` module has five functions for encoding and decoding Stencila documents and for converting documents between formats. All functions are `async`.

#### `from_string`

Use `from_string` to decode a string in a certain format to a Stencila Schema type. Usually you will need to supply the `format` argument (it defaults to JSON). e.g.

```py
import asyncio

from stencila.convert import from_string

doc = asyncio.run(
    from_string(
        '''{
            type: "Article",
            content: [{
                type: "Paragraph",
                content: [{
                    type: "Text",
                    value: "Hello world"
                }]
            }]
        }''',
        format="json5",
    )
)
```

#### `from_path`

Use `from_path` to decode a file system path (usually a file) to a Stencila Schema type. The format can be supplied but if it is not is inferred from the path. e.g.

```py
import asyncio

from stencila.convert import from_path

doc = asyncio.run(from_path("doc.jats.xml"))
```

#### `to_string`

Use `to_string` to encode a Stencila Schema type to a string. Usually you will want to supply the `format` argument (it defaults to JSON).

```py
import asyncio

from stencila.convert import to_string
from stencila.types import Article, Paragraph, Text

doc = Article([Paragraph([Text("Hello world!")])])

markdown = asyncio.run(to_string(doc, format="md"))
```

#### `to_path`

To encode a Stencila Schema type to a filesystem path, use `to_path`. e.g.

```py
import asyncio

from stencila.convert import to_path
from stencila.types import Article, Paragraph, Text

doc = Article([Paragraph([Text("Hello world!")])])

asyncio.run(to_path(doc, "doc.md"))
```

#### `from_to`

Use `from_to` when you want to convert a file to another format (i.e. as a more performant shortcut to combining `from_path` and `to_path`)

```py
import asyncio

from stencila.convert import from_to

asyncio.run(from_to("doc.md", "doc.html"))
```

> [!NOTE]
> Some of the usage examples above illustrate manually constructing in-memory Python representations of small documents. This is for illustration only and would be unwieldy for large documents. Instead we imagine developers using the `convert.from_string` or `convert.from_path` functions to load documents into memory from other formats, or writing functions to construct documents composed of the Stencila classes.

## 🛠️ Develop

### Bindings

This packages uses [PyO3](https://pyo3.rs) and [Maturin](https://maturin.rs) to generate a Python native extension from Stencila Rust functions. It uses the [layout](https://www.maturin.rs/project_layout#mixed-rustpython-project) recommended for mixed Rust/Python projects: Rust code is in `src` and Python code and tests is in `python`.

To build the native extension and use it in a Python shell:

```console
make run
```

To build the native extension for the current platform (for several versions of Python):

```console
make build
```

### Linting and testing

Please run linting and tests before contributing any code changes.

```console
make lint test
```

There is also a `make fix` recipe that will fix any formatting or linting issues.

### Testing on different Python versions

You can use `asdf` to test this package across different versions of Python:

```console
asdf install python 3.9.18
asdf local python 3.9.18
poetry env use 3.9.18
poetry install
make test
```

> [!NOTE]
> In the future, we may use `tox` (or similar) to run tests across Python versions. But how to make that work with `pyo3` and `maturin` is yet to be resolved.

### Code organization

#### `types` module

Most of the types are generated from the Stencila Schema by the Rust [`schema-gen`](https://github.com/stencila/stencila/tree/main/rust/schema-gen#readme) crate. See there for contributing instructions.

#### `convert` module

The `convert` module is implemented in Rust (`src/convert.rs`) with a thin Python wrapper (`python/stencila/convert.py`) to provide documentation and conversion to the types in the `types` module.


            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "stencila",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "programmable,reproducible,interactive,documents,python,SDK",
    "author": null,
    "author_email": "Nokome Bentley <nokome@stencila.io>",
    "download_url": null,
    "platform": null,
    "description": "# Stencila SDK for Python\n\n**Types and function bindings for using Stencila from Python**\n\n<a href=\"https://pypi.org/project/stencila/\">\n    <img src=\"https://img.shields.io/pypi/v/stencila.svg?logo=python&label=stencila&style=for-the-badge&color=1d3bd1&logoColor=66ff66&labelColor=3219a8\">\n</a>\n\n## \ud83d\udc4b Introduction\n\nThis package provides Python classes for types in the [Stencila Schema](https://github.com/stencila/stencila/tree/main/schema#readme) and bindings to core [Stencila Rust](https://github.com/stencila/stencila/tree/main/rust#readme) functions.\n\nThe primary intended audience is developers who want to develop their own tools on top of Stencila's core functionality. For example, with this package you could construct Stencila documents programmatically using Python and write them to multiple formats (e.g. Markdown, JATS XML, PDF).\n\n> [!IMPORTANT]\n> At present, there are only bindings to functions for format conversion, but future versions will expand this scope to include document management (e.g branching and merging) and execution.\n\n## \ud83d\udce6 Install\n\n```console\npython -m pip install stencila\n```\n\n> [!NOTE]\n> If you encounter problems with the above command, you may need to upgrade Pip using `pip install --upgrade pip`.\n>\n> This is due to a [change in the dependency resolver](https://pip.pypa.io/en/latest/user_guide/#changes-to-the-pip-dependency-resolver-in-20-3-2020) in Pip 20.3.\n\n## \u26a1 Usage\n\n### Types\n\nThe `types` module contains representations of all types in the Stencila Schema.\n\n#### Object types\n\nObject types (aka product types) in the Stencila Schema are represented as a `dataclass`. At present the `__init__` function requires keywords to be used (this is likely to be improved soon).\n\nFor example, to construct an article with a single \"Hello world!\" paragraph, you can construct `Article`, `Paragraph` and `Text`:\n\n```py\nfrom stencila.types import Article, CreativeWork, Paragraph, Text, Thing\n\narticle = Article(content=[Paragraph(content=[Text(value=\"Hello world!\")])])\n\nassert isinstance(article, Article)\nassert isinstance(article, CreativeWork)\nassert isinstance(article, Thing)\n\nassert isinstance(article.content[0], Paragraph)\n\nassert isinstance(article.content[0].content[0], Text)\n```\n\n#### Union types\n\nUnion types (aka sum types) in the Stencila Schema are represented as `typing.Union`. For example, the `Block` union type is defined like so:\n\n```py\nBlock = Union[\n    Call,\n    Claim,\n    CodeBlock,\n    CodeChunk,\n    Division,\n    Figure,\n    For,\n    Form,\n    Heading,\n...\n```\n\n#### Enumeration types\n\nEnumeration types in the Stencila Schema are represented as `StrEnum`. For example, the `CitationIntent` enumeration is defined like so:\n\n```py\nclass CitationIntent(StrEnum):\n    \"\"\"\n    The type or nature of a citation, both factually and rhetorically.\n    \"\"\"\n\n    AgreesWith = \"AgreesWith\"\n    CitesAsAuthority = \"CitesAsAuthority\"\n    CitesAsDataSource = \"CitesAsDataSource\"\n    CitesAsEvidence = \"CitesAsEvidence\"\n    CitesAsMetadataDocument = \"CitesAsMetadataDocument\"\n    CitesAsPotentialSolution = \"CitesAsPotentialSolution\"\n    CitesAsRecommendedReading = \"CitesAsRecommendedReading\"\n    CitesAsRelated = \"CitesAsRelated\"\n```\n\n### Conversion\n\nThe `convert` module has five functions for encoding and decoding Stencila documents and for converting documents between formats. All functions are `async`.\n\n#### `from_string`\n\nUse `from_string` to decode a string in a certain format to a Stencila Schema type. Usually you will need to supply the `format` argument (it defaults to JSON). e.g.\n\n```py\nimport asyncio\n\nfrom stencila.convert import from_string\n\ndoc = asyncio.run(\n    from_string(\n        '''{\n            type: \"Article\",\n            content: [{\n                type: \"Paragraph\",\n                content: [{\n                    type: \"Text\",\n                    value: \"Hello world\"\n                }]\n            }]\n        }''',\n        format=\"json5\",\n    )\n)\n```\n\n#### `from_path`\n\nUse `from_path` to decode a file system path (usually a file) to a Stencila Schema type. The format can be supplied but if it is not is inferred from the path. e.g.\n\n```py\nimport asyncio\n\nfrom stencila.convert import from_path\n\ndoc = asyncio.run(from_path(\"doc.jats.xml\"))\n```\n\n#### `to_string`\n\nUse `to_string` to encode a Stencila Schema type to a string. Usually you will want to supply the `format` argument (it defaults to JSON).\n\n```py\nimport asyncio\n\nfrom stencila.convert import to_string\nfrom stencila.types import Article, Paragraph, Text\n\ndoc = Article([Paragraph([Text(\"Hello world!\")])])\n\nmarkdown = asyncio.run(to_string(doc, format=\"md\"))\n```\n\n#### `to_path`\n\nTo encode a Stencila Schema type to a filesystem path, use `to_path`. e.g.\n\n```py\nimport asyncio\n\nfrom stencila.convert import to_path\nfrom stencila.types import Article, Paragraph, Text\n\ndoc = Article([Paragraph([Text(\"Hello world!\")])])\n\nasyncio.run(to_path(doc, \"doc.md\"))\n```\n\n#### `from_to`\n\nUse `from_to` when you want to convert a file to another format (i.e. as a more performant shortcut to combining `from_path` and `to_path`)\n\n```py\nimport asyncio\n\nfrom stencila.convert import from_to\n\nasyncio.run(from_to(\"doc.md\", \"doc.html\"))\n```\n\n> [!NOTE]\n> Some of the usage examples above illustrate manually constructing in-memory Python representations of small documents. This is for illustration only and would be unwieldy for large documents. Instead we imagine developers using the `convert.from_string` or `convert.from_path` functions to load documents into memory from other formats, or writing functions to construct documents composed of the Stencila classes.\n\n## \ud83d\udee0\ufe0f Develop\n\n### Bindings\n\nThis packages uses [PyO3](https://pyo3.rs) and [Maturin](https://maturin.rs) to generate a Python native extension from Stencila Rust functions. It uses the [layout](https://www.maturin.rs/project_layout#mixed-rustpython-project) recommended for mixed Rust/Python projects: Rust code is in `src` and Python code and tests is in `python`.\n\nTo build the native extension and use it in a Python shell:\n\n```console\nmake run\n```\n\nTo build the native extension for the current platform (for several versions of Python):\n\n```console\nmake build\n```\n\n### Linting and testing\n\nPlease run linting and tests before contributing any code changes.\n\n```console\nmake lint test\n```\n\nThere is also a `make fix` recipe that will fix any formatting or linting issues.\n\n### Testing on different Python versions\n\nYou can use `asdf` to test this package across different versions of Python:\n\n```console\nasdf install python 3.9.18\nasdf local python 3.9.18\npoetry env use 3.9.18\npoetry install\nmake test\n```\n\n> [!NOTE]\n> In the future, we may use `tox` (or similar) to run tests across Python versions. But how to make that work with `pyo3` and `maturin` is yet to be resolved.\n\n### Code organization\n\n#### `types` module\n\nMost of the types are generated from the Stencila Schema by the Rust [`schema-gen`](https://github.com/stencila/stencila/tree/main/rust/schema-gen#readme) crate. See there for contributing instructions.\n\n#### `convert` module\n\nThe `convert` module is implemented in Rust (`src/convert.rs`) with a thin Python wrapper (`python/stencila/convert.py`) to provide documentation and conversion to the types in the `types` module.\n\n",
    "bugtrack_url": null,
    "license": "Apache-2.0",
    "summary": "Python SDK for Stencila",
    "version": "2.0.0a23",
    "project_urls": {
        "Homepage": "https://github.com/stencila/stencila/tree/main/python#readme",
        "Repository": "https://github.com/stencila/stencila"
    },
    "split_keywords": [
        "programmable",
        "reproducible",
        "interactive",
        "documents",
        "python",
        "sdk"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "6edd3622894ee554b382e3dd44fcfbc99c1cb9d9ad8b2052b26f90f9a40da56d",
                "md5": "d2f1ff1658196a841d25df43892367e7",
                "sha256": "41edb82cac44b6b58b35fb62d8d1321d6507e6eb7adef410f2ddc11046d7f482"
            },
            "downloads": -1,
            "filename": "stencila-2.0.0a23-cp310-cp310-macosx_10_7_x86_64.whl",
            "has_sig": false,
            "md5_digest": "d2f1ff1658196a841d25df43892367e7",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 9185957,
            "upload_time": "2023-11-23T10:44:03",
            "upload_time_iso_8601": "2023-11-23T10:44:03.954592Z",
            "url": "https://files.pythonhosted.org/packages/6e/dd/3622894ee554b382e3dd44fcfbc99c1cb9d9ad8b2052b26f90f9a40da56d/stencila-2.0.0a23-cp310-cp310-macosx_10_7_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "73dd6c5ba10ff78c6465189174f4b9d0ba3e7d4ee057d9d2081f8306f50b424e",
                "md5": "d88ce04c421eb82a79975407e15c725a",
                "sha256": "6d559d0fd29d38f4583252a0b4c801fb664f9ae431e10f3f9e4ecb889bad37f9"
            },
            "downloads": -1,
            "filename": "stencila-2.0.0a23-cp310-cp310-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "d88ce04c421eb82a79975407e15c725a",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 8311900,
            "upload_time": "2023-11-23T10:44:07",
            "upload_time_iso_8601": "2023-11-23T10:44:07.596189Z",
            "url": "https://files.pythonhosted.org/packages/73/dd/6c5ba10ff78c6465189174f4b9d0ba3e7d4ee057d9d2081f8306f50b424e/stencila-2.0.0a23-cp310-cp310-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a0ae8a427701dd7cd600dd704fcfc7547cab2bb68566c9b138ec6f068ad7a600",
                "md5": "20ae5ee1cba3d2190e03497cd960ac5a",
                "sha256": "a8bff09b3e8853bdd5679ea719b6b5729da812c053a578c0d3214296ff5bf42d"
            },
            "downloads": -1,
            "filename": "stencila-2.0.0a23-cp310-cp310-manylinux_2_31_x86_64.whl",
            "has_sig": false,
            "md5_digest": "20ae5ee1cba3d2190e03497cd960ac5a",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 9322066,
            "upload_time": "2023-11-23T10:44:10",
            "upload_time_iso_8601": "2023-11-23T10:44:10.041765Z",
            "url": "https://files.pythonhosted.org/packages/a0/ae/8a427701dd7cd600dd704fcfc7547cab2bb68566c9b138ec6f068ad7a600/stencila-2.0.0a23-cp310-cp310-manylinux_2_31_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "d390f70e35bf123cc5f90b04f76381f9a552bbeee5cd459b4a45efddad3a1353",
                "md5": "a645e4e1db55ba21e1f2ca9ce4c55e93",
                "sha256": "c4c716e8ba6277b0cca5729a36b0fb8d3f72b66ac9984a421b0b23a7e4425c26"
            },
            "downloads": -1,
            "filename": "stencila-2.0.0a23-cp310-cp310-manylinux_2_34_x86_64.whl",
            "has_sig": false,
            "md5_digest": "a645e4e1db55ba21e1f2ca9ce4c55e93",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 9328361,
            "upload_time": "2023-11-23T10:44:13",
            "upload_time_iso_8601": "2023-11-23T10:44:13.012183Z",
            "url": "https://files.pythonhosted.org/packages/d3/90/f70e35bf123cc5f90b04f76381f9a552bbeee5cd459b4a45efddad3a1353/stencila-2.0.0a23-cp310-cp310-manylinux_2_34_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "046346383fcded2cd2af52a6c14c2b6d858691363305db16683ecfd14c30e465",
                "md5": "97bea35c3c4bf3d0da8f34b38766217a",
                "sha256": "f5ec8877a04a46da03cfcccb40402f25c7f9d7f560663844093cf621244e344b"
            },
            "downloads": -1,
            "filename": "stencila-2.0.0a23-cp310-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "97bea35c3c4bf3d0da8f34b38766217a",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 8905619,
            "upload_time": "2023-11-23T10:44:15",
            "upload_time_iso_8601": "2023-11-23T10:44:15.887035Z",
            "url": "https://files.pythonhosted.org/packages/04/63/46383fcded2cd2af52a6c14c2b6d858691363305db16683ecfd14c30e465/stencila-2.0.0a23-cp310-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "aec69392d5fa28157d344da39f22ffc0fa5fe5266d8265b3c61275772773166b",
                "md5": "4360fcde02359122e2ce03fc3c27d707",
                "sha256": "7e11da66c25a5a2e345fdcc8e9f93628161a47efa5c5e1d48791e5c432c20aae"
            },
            "downloads": -1,
            "filename": "stencila-2.0.0a23-cp311-cp311-macosx_10_7_x86_64.whl",
            "has_sig": false,
            "md5_digest": "4360fcde02359122e2ce03fc3c27d707",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 9185933,
            "upload_time": "2023-11-23T10:44:19",
            "upload_time_iso_8601": "2023-11-23T10:44:19.171259Z",
            "url": "https://files.pythonhosted.org/packages/ae/c6/9392d5fa28157d344da39f22ffc0fa5fe5266d8265b3c61275772773166b/stencila-2.0.0a23-cp311-cp311-macosx_10_7_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "2ee631608676baf27f089ed9396fcc1647f8c184cc9eabe66163c7929e286ba9",
                "md5": "e1ec49ff85c5268fddfe6ed0ecc0e1d0",
                "sha256": "a2a8bd41df23714b1bef43828ca43b2db23ca732fec7534382423d845b4208f9"
            },
            "downloads": -1,
            "filename": "stencila-2.0.0a23-cp311-cp311-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "e1ec49ff85c5268fddfe6ed0ecc0e1d0",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 8311854,
            "upload_time": "2023-11-23T10:44:21",
            "upload_time_iso_8601": "2023-11-23T10:44:21.985781Z",
            "url": "https://files.pythonhosted.org/packages/2e/e6/31608676baf27f089ed9396fcc1647f8c184cc9eabe66163c7929e286ba9/stencila-2.0.0a23-cp311-cp311-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "dec984eab64a313fba8b16c3d5252ef781d328b92b222b798645f1a6de53fa98",
                "md5": "0f660b7bb15370958bbc17bf984dc79b",
                "sha256": "97c762be32226cd54e1925a33934d72a4833fd13b8cada734bc9b9dfd93fc108"
            },
            "downloads": -1,
            "filename": "stencila-2.0.0a23-cp311-cp311-manylinux_2_31_x86_64.whl",
            "has_sig": false,
            "md5_digest": "0f660b7bb15370958bbc17bf984dc79b",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 9322101,
            "upload_time": "2023-11-23T10:44:25",
            "upload_time_iso_8601": "2023-11-23T10:44:25.259747Z",
            "url": "https://files.pythonhosted.org/packages/de/c9/84eab64a313fba8b16c3d5252ef781d328b92b222b798645f1a6de53fa98/stencila-2.0.0a23-cp311-cp311-manylinux_2_31_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "0dcc6cb5c2548e3d4f16dd4434e24a72d5d997f4d16891f409206ad0d8233d9b",
                "md5": "a4814852760ba309929b63cec3542852",
                "sha256": "a721cd5e1a4ae0d286f8bbccd2d2b169d3553876a3253e755705815d5b512cee"
            },
            "downloads": -1,
            "filename": "stencila-2.0.0a23-cp311-cp311-manylinux_2_34_x86_64.whl",
            "has_sig": false,
            "md5_digest": "a4814852760ba309929b63cec3542852",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 9328267,
            "upload_time": "2023-11-23T10:44:28",
            "upload_time_iso_8601": "2023-11-23T10:44:28.818276Z",
            "url": "https://files.pythonhosted.org/packages/0d/cc/6cb5c2548e3d4f16dd4434e24a72d5d997f4d16891f409206ad0d8233d9b/stencila-2.0.0a23-cp311-cp311-manylinux_2_34_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "fb3b38e0b3aa7625ea5660f8de7fe8ecaf1ef93462d5efc763c1877a71261bca",
                "md5": "e4e3cbba2ae1749680acbf55f264dd7e",
                "sha256": "dcd52c865335d5b3e9a95800342b1af88b9807811dda87fd5ad7a8edc369c366"
            },
            "downloads": -1,
            "filename": "stencila-2.0.0a23-cp311-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "e4e3cbba2ae1749680acbf55f264dd7e",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 8905503,
            "upload_time": "2023-11-23T10:44:32",
            "upload_time_iso_8601": "2023-11-23T10:44:32.273280Z",
            "url": "https://files.pythonhosted.org/packages/fb/3b/38e0b3aa7625ea5660f8de7fe8ecaf1ef93462d5efc763c1877a71261bca/stencila-2.0.0a23-cp311-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f4453ef81f8eb8d861a16690019b5508e0298c98b4a4f044ad768f86253ee48e",
                "md5": "f10ddb7ef4869efb5e74d33cc72b8fc2",
                "sha256": "f699f78439a5e76bd02c1f2bc0df51dab01de7e21051191cd8b96234728d17ac"
            },
            "downloads": -1,
            "filename": "stencila-2.0.0a23-cp312-cp312-macosx_10_7_x86_64.whl",
            "has_sig": false,
            "md5_digest": "f10ddb7ef4869efb5e74d33cc72b8fc2",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 9186460,
            "upload_time": "2023-11-23T10:44:35",
            "upload_time_iso_8601": "2023-11-23T10:44:35.954562Z",
            "url": "https://files.pythonhosted.org/packages/f4/45/3ef81f8eb8d861a16690019b5508e0298c98b4a4f044ad768f86253ee48e/stencila-2.0.0a23-cp312-cp312-macosx_10_7_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "6700dd0a070786a35559d77fbcef3c4d5ebbff6486cc6515778c66b923f4b3d7",
                "md5": "a8e958eac7fe0ff7e454430d6f731c4b",
                "sha256": "1ba05e863a434434bd95f35d7a7c3956ea4ba9d4304449b0441e51be6b9861df"
            },
            "downloads": -1,
            "filename": "stencila-2.0.0a23-cp312-cp312-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "a8e958eac7fe0ff7e454430d6f731c4b",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 8311782,
            "upload_time": "2023-11-23T10:44:39",
            "upload_time_iso_8601": "2023-11-23T10:44:39.076521Z",
            "url": "https://files.pythonhosted.org/packages/67/00/dd0a070786a35559d77fbcef3c4d5ebbff6486cc6515778c66b923f4b3d7/stencila-2.0.0a23-cp312-cp312-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "6cd55ca33976220b7d762b2475e301137ded249d1af053fc70d1c9634cba229f",
                "md5": "e995145b47e2211c8c0e7606e380e87b",
                "sha256": "71108d4cab596bd510ae39ceb000bcfbc6e7317309021d7295c6343daac09d11"
            },
            "downloads": -1,
            "filename": "stencila-2.0.0a23-cp312-cp312-manylinux_2_31_x86_64.whl",
            "has_sig": false,
            "md5_digest": "e995145b47e2211c8c0e7606e380e87b",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 9322006,
            "upload_time": "2023-11-23T10:44:41",
            "upload_time_iso_8601": "2023-11-23T10:44:41.366257Z",
            "url": "https://files.pythonhosted.org/packages/6c/d5/5ca33976220b7d762b2475e301137ded249d1af053fc70d1c9634cba229f/stencila-2.0.0a23-cp312-cp312-manylinux_2_31_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "112797c471b32df5166b3de1a0a9555f76335f3b057f7c6843b409a7f87f2e45",
                "md5": "a35e1b7f6d278267e0ce9a51f4f1a4e3",
                "sha256": "5e94b4bf3763a00dc237b55d673423e587a9397c2932e6d5c546e5157277d3bf"
            },
            "downloads": -1,
            "filename": "stencila-2.0.0a23-cp312-cp312-manylinux_2_34_x86_64.whl",
            "has_sig": false,
            "md5_digest": "a35e1b7f6d278267e0ce9a51f4f1a4e3",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 9328593,
            "upload_time": "2023-11-23T10:44:44",
            "upload_time_iso_8601": "2023-11-23T10:44:44.668767Z",
            "url": "https://files.pythonhosted.org/packages/11/27/97c471b32df5166b3de1a0a9555f76335f3b057f7c6843b409a7f87f2e45/stencila-2.0.0a23-cp312-cp312-manylinux_2_34_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e4bb34a0cdccdaf0265ebd4ea5841426d26375b0f289ac9e5238ab070fdd732f",
                "md5": "603ac6768b735db5616a6ecea34a3741",
                "sha256": "0a0bd109750752d2b0ba1b2d0170e4fefda3cc01aac0a8edb0c9e5190f40fcbb"
            },
            "downloads": -1,
            "filename": "stencila-2.0.0a23-cp312-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "603ac6768b735db5616a6ecea34a3741",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 8907949,
            "upload_time": "2023-11-23T10:44:47",
            "upload_time_iso_8601": "2023-11-23T10:44:47.404490Z",
            "url": "https://files.pythonhosted.org/packages/e4/bb/34a0cdccdaf0265ebd4ea5841426d26375b0f289ac9e5238ab070fdd732f/stencila-2.0.0a23-cp312-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b1a76d039c1f19b932f1222821d954214ee24225ac7036721df67266aaba70a0",
                "md5": "058b421f24c7e861723dae33c1b3fff6",
                "sha256": "6b7898c6c70751bd279bf4cd744386b7a8ee11eebddf3db9e7bc69fa4270e689"
            },
            "downloads": -1,
            "filename": "stencila-2.0.0a23-cp38-cp38-macosx_10_7_x86_64.whl",
            "has_sig": false,
            "md5_digest": "058b421f24c7e861723dae33c1b3fff6",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 9186178,
            "upload_time": "2023-11-23T10:44:50",
            "upload_time_iso_8601": "2023-11-23T10:44:50.350283Z",
            "url": "https://files.pythonhosted.org/packages/b1/a7/6d039c1f19b932f1222821d954214ee24225ac7036721df67266aaba70a0/stencila-2.0.0a23-cp38-cp38-macosx_10_7_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f28e86a53947face64e09385eecc593444e933cbc036774f07f188b171aec49a",
                "md5": "dde765a0ccf6382be4aa3cd9370b4ad1",
                "sha256": "961cc724a369814523e989666bf99760a05e0342381b2d69dc2b01620262eabb"
            },
            "downloads": -1,
            "filename": "stencila-2.0.0a23-cp38-cp38-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "dde765a0ccf6382be4aa3cd9370b4ad1",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 8311259,
            "upload_time": "2023-11-23T10:44:53",
            "upload_time_iso_8601": "2023-11-23T10:44:53.697928Z",
            "url": "https://files.pythonhosted.org/packages/f2/8e/86a53947face64e09385eecc593444e933cbc036774f07f188b171aec49a/stencila-2.0.0a23-cp38-cp38-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ed3733a9fc348c2b43181f38db360847e503d4b83523e20236826b7e7872c4b7",
                "md5": "22dbaba5f19513dd062058d03ca29968",
                "sha256": "d5d4eb27364416c11fae2fe00026a5b5074a5696a7a4919d3f523555dff7afc6"
            },
            "downloads": -1,
            "filename": "stencila-2.0.0a23-cp38-cp38-manylinux_2_31_x86_64.whl",
            "has_sig": false,
            "md5_digest": "22dbaba5f19513dd062058d03ca29968",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 9322463,
            "upload_time": "2023-11-23T10:44:56",
            "upload_time_iso_8601": "2023-11-23T10:44:56.083173Z",
            "url": "https://files.pythonhosted.org/packages/ed/37/33a9fc348c2b43181f38db360847e503d4b83523e20236826b7e7872c4b7/stencila-2.0.0a23-cp38-cp38-manylinux_2_31_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f3517ddbeb9502b3a7a355ae07cf4f71226ed639f991bc34bb00e8e403e5560d",
                "md5": "3726202838158732d007511cdd826f5c",
                "sha256": "385e9b610b94dc56efff4adc5d8463723ea8cfbcf63abc59745d47d3bc63f67d"
            },
            "downloads": -1,
            "filename": "stencila-2.0.0a23-cp38-cp38-manylinux_2_34_x86_64.whl",
            "has_sig": false,
            "md5_digest": "3726202838158732d007511cdd826f5c",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 9328742,
            "upload_time": "2023-11-23T10:44:58",
            "upload_time_iso_8601": "2023-11-23T10:44:58.676044Z",
            "url": "https://files.pythonhosted.org/packages/f3/51/7ddbeb9502b3a7a355ae07cf4f71226ed639f991bc34bb00e8e403e5560d/stencila-2.0.0a23-cp38-cp38-manylinux_2_34_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "48dccb0498bab70dc46fa5f8e4277e7bfb15e728b6e6e34915c28f1668d754fe",
                "md5": "7dc34c116040246fecc680da76e0afb4",
                "sha256": "fad5bd28e7e6d7e0d362b2fe6ba2b765f74079766866ca38c4dc226455d4e742"
            },
            "downloads": -1,
            "filename": "stencila-2.0.0a23-cp38-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "7dc34c116040246fecc680da76e0afb4",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 8906526,
            "upload_time": "2023-11-23T10:45:01",
            "upload_time_iso_8601": "2023-11-23T10:45:01.688668Z",
            "url": "https://files.pythonhosted.org/packages/48/dc/cb0498bab70dc46fa5f8e4277e7bfb15e728b6e6e34915c28f1668d754fe/stencila-2.0.0a23-cp38-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "1dffe82d6266618409f9ac4a8fc6f9602abe5189eb53142a7eaef3a81ab06a61",
                "md5": "5d890bb8702afd5d86b759cc5eb3bccc",
                "sha256": "6b9dab8e0687af1b91f9860382a7d3be16282e6fa20b1959c56a84296a8e48cf"
            },
            "downloads": -1,
            "filename": "stencila-2.0.0a23-cp39-cp39-macosx_10_7_x86_64.whl",
            "has_sig": false,
            "md5_digest": "5d890bb8702afd5d86b759cc5eb3bccc",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 9186281,
            "upload_time": "2023-11-23T10:45:05",
            "upload_time_iso_8601": "2023-11-23T10:45:05.252615Z",
            "url": "https://files.pythonhosted.org/packages/1d/ff/e82d6266618409f9ac4a8fc6f9602abe5189eb53142a7eaef3a81ab06a61/stencila-2.0.0a23-cp39-cp39-macosx_10_7_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "26b02b08987ff5475740f4bc9bb6cdefef083f284b4264a047c29e7a9dc5fc63",
                "md5": "faf53bc128367ebed09719e562e3e82f",
                "sha256": "9e687072a953506c1e968f7ee30e5c27513a36fce3d06e7aaa5a20ee2a80397b"
            },
            "downloads": -1,
            "filename": "stencila-2.0.0a23-cp39-cp39-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "faf53bc128367ebed09719e562e3e82f",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 8311981,
            "upload_time": "2023-11-23T10:45:08",
            "upload_time_iso_8601": "2023-11-23T10:45:08.266940Z",
            "url": "https://files.pythonhosted.org/packages/26/b0/2b08987ff5475740f4bc9bb6cdefef083f284b4264a047c29e7a9dc5fc63/stencila-2.0.0a23-cp39-cp39-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f01ef96d099c2d42e962bd473a0595e7b9d8dafa37238cc616ee1242c59923ff",
                "md5": "cee4c12570d502c747aca9e006af368a",
                "sha256": "5b7b37d4093630b75d8b9440ec1cc8bcbb308d05c64110d7419f83f8f03d96ff"
            },
            "downloads": -1,
            "filename": "stencila-2.0.0a23-cp39-cp39-manylinux_2_31_x86_64.whl",
            "has_sig": false,
            "md5_digest": "cee4c12570d502c747aca9e006af368a",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 9322375,
            "upload_time": "2023-11-23T10:45:10",
            "upload_time_iso_8601": "2023-11-23T10:45:10.908825Z",
            "url": "https://files.pythonhosted.org/packages/f0/1e/f96d099c2d42e962bd473a0595e7b9d8dafa37238cc616ee1242c59923ff/stencila-2.0.0a23-cp39-cp39-manylinux_2_31_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "46f5e65b34139ba2fd83176c7f822dddad286e0a9ad92a3530575ab95c634432",
                "md5": "292d52c1794929f8806aa19c6f53a1aa",
                "sha256": "db91430c48255cf7eba94e109b9177a4b4dc2b6465c98af6b1d5e12b849a0193"
            },
            "downloads": -1,
            "filename": "stencila-2.0.0a23-cp39-cp39-manylinux_2_34_x86_64.whl",
            "has_sig": false,
            "md5_digest": "292d52c1794929f8806aa19c6f53a1aa",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 9328627,
            "upload_time": "2023-11-23T10:45:13",
            "upload_time_iso_8601": "2023-11-23T10:45:13.944067Z",
            "url": "https://files.pythonhosted.org/packages/46/f5/e65b34139ba2fd83176c7f822dddad286e0a9ad92a3530575ab95c634432/stencila-2.0.0a23-cp39-cp39-manylinux_2_34_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "00050ffeb987193cb3a894dd2bd29f9e92d2c9b15536eff428fa11d38e1e8302",
                "md5": "6aa7993ac09ce8e58e997c68de93b460",
                "sha256": "23fdf76ac483717a7962210404b85bb9cec79cf9cbb86a2999bf26659b4fb992"
            },
            "downloads": -1,
            "filename": "stencila-2.0.0a23-cp39-none-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "6aa7993ac09ce8e58e997c68de93b460",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 8906006,
            "upload_time": "2023-11-23T10:45:17",
            "upload_time_iso_8601": "2023-11-23T10:45:17.701882Z",
            "url": "https://files.pythonhosted.org/packages/00/05/0ffeb987193cb3a894dd2bd29f9e92d2c9b15536eff428fa11d38e1e8302/stencila-2.0.0a23-cp39-none-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-11-23 10:44:03",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "stencila",
    "github_project": "stencila",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "stencila"
}
        
Elapsed time: 0.14741s