diff --git a/.buildinfo b/.buildinfo index cf13c10..2328441 100644 --- a/.buildinfo +++ b/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file records the configuration used when building these files. When it is not found, a full rebuild will be done. -config: de7f721c757d20fd25f05899fb32b97e +config: 5de777e7786b9c0cdc82be54d483ddbc tags: d77d1c0d9ca2f4c8421862c7c5a0d620 diff --git a/.doctrees/api/cli/index.doctree b/.doctrees/api/cli/index.doctree index 38c7425..00fcdd2 100644 Binary files a/.doctrees/api/cli/index.doctree and b/.doctrees/api/cli/index.doctree differ diff --git a/.doctrees/api/index.doctree b/.doctrees/api/index.doctree index a54bdd1..8a1855d 100644 Binary files a/.doctrees/api/index.doctree and b/.doctrees/api/index.doctree differ diff --git a/.doctrees/api/pack_venv/index.doctree b/.doctrees/api/pack_venv/index.doctree index e755f71..5ba2d2e 100644 Binary files a/.doctrees/api/pack_venv/index.doctree and b/.doctrees/api/pack_venv/index.doctree differ diff --git a/.doctrees/api/stacks/index.doctree b/.doctrees/api/stacks/index.doctree index 3f6c9c8..5a6d855 100644 Binary files a/.doctrees/api/stacks/index.doctree and b/.doctrees/api/stacks/index.doctree differ diff --git a/.doctrees/changelog.d/20241105_141935_ncoghlan_more_resilient_postinstall.doctree b/.doctrees/changelog.d/20241105_141935_ncoghlan_more_resilient_postinstall.doctree new file mode 100644 index 0000000..3b68414 Binary files /dev/null and b/.doctrees/changelog.d/20241105_141935_ncoghlan_more_resilient_postinstall.doctree differ diff --git a/.doctrees/changelog.d/20241108_162952_ncoghlan_fix_automatic_layer_versioning.doctree b/.doctrees/changelog.d/20241108_162952_ncoghlan_fix_automatic_layer_versioning.doctree new file mode 100644 index 0000000..cad5c61 Binary files /dev/null and b/.doctrees/changelog.d/20241108_162952_ncoghlan_fix_automatic_layer_versioning.doctree differ diff --git a/.doctrees/changelog.d/20241108_215625_ncoghlan_enable_docstring_style_checks.doctree b/.doctrees/changelog.d/20241108_215625_ncoghlan_enable_docstring_style_checks.doctree new file mode 100644 index 0000000..680b757 Binary files /dev/null and b/.doctrees/changelog.d/20241108_215625_ncoghlan_enable_docstring_style_checks.doctree differ diff --git a/.doctrees/changelog.d/20241111_104113_ncoghlan_add_stack_format_docs.doctree b/.doctrees/changelog.d/20241111_104113_ncoghlan_add_stack_format_docs.doctree new file mode 100644 index 0000000..bb9eefe Binary files /dev/null and b/.doctrees/changelog.d/20241111_104113_ncoghlan_add_stack_format_docs.doctree differ diff --git a/.doctrees/changelog.doctree b/.doctrees/changelog.doctree index a631021..cd66f8f 100644 Binary files a/.doctrees/changelog.doctree and b/.doctrees/changelog.doctree differ diff --git a/.doctrees/design.doctree b/.doctrees/design.doctree index 18d095c..829c334 100644 Binary files a/.doctrees/design.doctree and b/.doctrees/design.doctree differ diff --git a/.doctrees/development/index.doctree b/.doctrees/development/index.doctree index 2fa4293..c2ba4ff 100644 Binary files a/.doctrees/development/index.doctree and b/.doctrees/development/index.doctree differ diff --git a/.doctrees/environment.pickle b/.doctrees/environment.pickle index 20eadec..37dcf5b 100644 Binary files a/.doctrees/environment.pickle and b/.doctrees/environment.pickle differ diff --git a/.doctrees/file-formats.doctree b/.doctrees/file-formats.doctree new file mode 100644 index 0000000..dc50404 Binary files /dev/null and b/.doctrees/file-formats.doctree differ diff --git a/.doctrees/glossary.doctree b/.doctrees/glossary.doctree index 24de965..1218547 100644 Binary files a/.doctrees/glossary.doctree and b/.doctrees/glossary.doctree differ diff --git a/.doctrees/index.doctree b/.doctrees/index.doctree index f0851b8..2bd7ff8 100644 Binary files a/.doctrees/index.doctree and b/.doctrees/index.doctree differ diff --git a/.doctrees/overview.doctree b/.doctrees/overview.doctree index e0756ee..ffe3882 100644 Binary files a/.doctrees/overview.doctree and b/.doctrees/overview.doctree differ diff --git a/_sources/api/cli/index.rst.txt b/_sources/api/cli/index.rst.txt index 14528fd..0065293 100644 --- a/_sources/api/cli/index.rst.txt +++ b/_sources/api/cli/index.rst.txt @@ -1,6 +1,12 @@ venvstacks.cli ============== +.. meta:: + :og:title: venvstacks.cli API - venvstacks Documentation + :og:type: website + :og:url: https://venvstacks.lmstudio.ai/api/cli/ + :og:description: venvstacks.cli Python API - venvstacks Documentation + .. warning:: The Python API is *NOT YET STABLE*. diff --git a/_sources/api/index.rst.txt b/_sources/api/index.rst.txt index 4858fdc..68baf26 100644 --- a/_sources/api/index.rst.txt +++ b/_sources/api/index.rst.txt @@ -2,6 +2,12 @@ Python API ---------- +.. meta:: + :og:title: venvstacks API - venvstacks Documentation + :og:type: website + :og:url: https://venvstacks.lmstudio.ai/api/ + :og:description: venvstacks Python API - venvstacks Documentation + .. warning:: The Python API is *NOT YET STABLE*. diff --git a/_sources/api/pack_venv/index.rst.txt b/_sources/api/pack_venv/index.rst.txt index f9f216c..beae01f 100644 --- a/_sources/api/pack_venv/index.rst.txt +++ b/_sources/api/pack_venv/index.rst.txt @@ -1,6 +1,12 @@ venvstacks.pack\_venv ===================== +.. meta:: + :og:title: venvstacks.pack_venv API - venvstacks Documentation + :og:type: website + :og:url: https://venvstacks.lmstudio.ai/api/pack_venv/ + :og:description: venvstacks.pack_venv Python API - venvstacks Documentation + .. warning:: The Python API is *NOT YET STABLE*. diff --git a/_sources/api/stacks/index.rst.txt b/_sources/api/stacks/index.rst.txt index 9cc8cef..1743d17 100644 --- a/_sources/api/stacks/index.rst.txt +++ b/_sources/api/stacks/index.rst.txt @@ -1,6 +1,24 @@ venvstacks.stacks ================= +.. meta:: + :og:title: venvstacks.stacks API - venvstacks Documentation + :og:type: website + :og:url: https://venvstacks.lmstudio.ai/api/stacks/ + :og:description: venvstacks.stacks Python API - venvstacks Documentation + +.. TODO: Replace the autosummary tables with: + * inline docs for the high level interface and the exceptions + * a stacks/metadata-details/ page + * a stacks/archive-publication/ page + * a stacks/local-exports/ page + * a stacks/layer-specifications/ page + * a stacks/layer-build-environments/ page + * a stacks/build-configuration/ page + + Dedicated pages correspond to the sections below (except as noted). + Page names contain hyphens to ensure they're not valid submodule names. + .. warning:: The Python API is *NOT YET STABLE*. diff --git a/_sources/changelog.d/20241105_141935_ncoghlan_more_resilient_postinstall.rst.txt b/_sources/changelog.d/20241105_141935_ncoghlan_more_resilient_postinstall.rst.txt new file mode 100644 index 0000000..c9da85f --- /dev/null +++ b/_sources/changelog.d/20241105_141935_ncoghlan_more_resilient_postinstall.rst.txt @@ -0,0 +1,7 @@ +Fixed +----- + +- Post-installation scripts for layered environments now work + correctly even when run with a Python installation other + than the expected base runtime (resolved in :issue:`66`) + diff --git a/_sources/changelog.d/20241108_162952_ncoghlan_fix_automatic_layer_versioning.rst.txt b/_sources/changelog.d/20241108_162952_ncoghlan_fix_automatic_layer_versioning.rst.txt new file mode 100644 index 0000000..55d7fbf --- /dev/null +++ b/_sources/changelog.d/20241108_162952_ncoghlan_fix_automatic_layer_versioning.rst.txt @@ -0,0 +1,9 @@ +Added +----- + +- Setting ``versioned = True`` in a layer definition will append a + lock version number to the layer name that automatically increments + each time the locked requirements change for that layer (``layer@1``, + ``layer@2``, etc). Layer dependency declarations and build environments, + use the unversioned name, but deployed environments and their metadata + will use the versioned name (implemented in :issue:`24`). diff --git a/_sources/changelog.d/20241108_215625_ncoghlan_enable_docstring_style_checks.rst.txt b/_sources/changelog.d/20241108_215625_ncoghlan_enable_docstring_style_checks.rst.txt new file mode 100644 index 0000000..5d795d0 --- /dev/null +++ b/_sources/changelog.d/20241108_215625_ncoghlan_enable_docstring_style_checks.rst.txt @@ -0,0 +1,11 @@ +Changed +------- + +- Renamed :class:`!EnvironmentExportRequest` to :class:`LayerExportRequest` (part of :issue:`33`). +- Exposed :class:`LayerSpecBase`, :class:`LayeredSpecBase` as public classes (part of :issue:`33`). +- Exposed :class:`LayerEnvBase`, :class:`LayeredEnvBase` as public classes (part of :issue:`33`). +- Added leading underscores to several private functions and methods (part of :issue:`33`). +- Added docstrings to all remaining public functions and methods (part of :issue:`33`). +- Enabled rendered previews for documentation PRs (requested in :issue:`43`). +- Enabled link validity checks when rendering documentation (requested in :issue:`62`). + diff --git a/_sources/changelog.d/20241111_104113_ncoghlan_add_stack_format_docs.rst.txt b/_sources/changelog.d/20241111_104113_ncoghlan_add_stack_format_docs.rst.txt new file mode 100644 index 0000000..1727084 --- /dev/null +++ b/_sources/changelog.d/20241111_104113_ncoghlan_add_stack_format_docs.rst.txt @@ -0,0 +1,5 @@ +Added +----- + +- Added documentation for the :ref:`stack-specification-format`. + diff --git a/_sources/changelog.rst.txt b/_sources/changelog.rst.txt index 565b052..d38c6b0 100644 --- a/_sources/changelog.rst.txt +++ b/_sources/changelog.rst.txt @@ -1 +1,31 @@ +.. _changelog: + +--------- +Changelog +--------- + +.. meta:: + :og:title: venvstacks Changelog - venvstacks Documentation + :og:type: website + :og:url: https://venvstacks.lmstudio.ai/changelog/ + :og:description: venvstacks Changelog - venvstacks Documentation + +.. note:: + + Until the Python API has stabilised, ``venvstacks`` is using + `ZeroVer `__ (starting from 0.1.0). + + Refer to :ref:`version-numbering` for additional details + on the way releases are versioned. + +.. Syntax check the changelog fragments + +.. toctree:: + :hidden: + :glob: + + changelog.d/* + +.. Include the scriv-generated changelog details + .. include:: ../CHANGELOG.rst diff --git a/_sources/design.rst.txt b/_sources/design.rst.txt index 02666c8..9ec5334 100644 --- a/_sources/design.rst.txt +++ b/_sources/design.rst.txt @@ -2,6 +2,12 @@ Design Discussion ----------------- +.. meta:: + :og:title: venvstacks Design - venvstacks Documentation + :og:type: website + :og:url: https://venvstacks.lmstudio.ai/design/ + :og:description: venvstacks Design Discussion - venvstacks Documentation + Project ======= diff --git a/_sources/development/index.rst.txt b/_sources/development/index.rst.txt index acb9a27..c5aebaa 100644 --- a/_sources/development/index.rst.txt +++ b/_sources/development/index.rst.txt @@ -4,6 +4,12 @@ Development ----------- +.. meta:: + :og:title: venvstacks Development - venvstacks Documentation + :og:type: website + :og:url: https://venvstacks.lmstudio.ai/development/ + :og:description: venvstacks Developer Guide - venvstacks Documentation + Getting Started =============== @@ -12,7 +18,8 @@ Getting Started This document aims to get you setup to work on venvstacks and to act as a guide and reference to the development setup. If you face any issues during this -process, please `open an issue`_ about it on the issue tracker. +process, please :issue:`open an issue ` +about it on the issue tracker. Get the source code @@ -279,7 +286,6 @@ After release: * Bump the version in ``pyproject.toml`` and add a ``.dev0`` suffix .. _`Getting Started`: https://pip.pypa.io/en/stable/development/getting-started/ -.. _`open an issue`: https://github.com/lmstudio-ai/venvstacks/issues/new?title=Trouble+with+development+environment .. _`rich CLI`: https://docs.pytest.org/en/stable/how-to/usage.html#specifying-which-tests-to-run .. _`GitHub`: https://github.com/lmstudio-ai/venvstacks .. _`testing README file`: https://github.com/lmstudio-ai/venvstacks/blob/main/tests/README.md diff --git a/_sources/file-formats.rst.txt b/_sources/file-formats.rst.txt new file mode 100644 index 0000000..bbce47e --- /dev/null +++ b/_sources/file-formats.rst.txt @@ -0,0 +1,242 @@ +------------------------------ +Environment Stack File Formats +------------------------------ + +.. meta:: + :og:title: venvstacks File Formats - venvstacks Documentation + :og:type: website + :og:url: https://venvstacks.lmstudio.ai/stack-format/ + :og:description: venvstacks Specification and Metadata File Formats - venvstacks Documentation + + +.. _stack-specification-format: + +File naming and formats +======================= + +By convention, virtual environment stacks are specified in a file named ``venvstacks.toml``. + +The default output folder for layer metadata when publishing artifacts and locally exporting +environments is called ``__venvstacks__``. The platform-specific layer summary metadata +files are called ``venvstacks.json`` and each is written to a folder named after the target +platform in the parent metadata folder. The per-layer metadata files are written to an +``env_metadata`` folder within the platform folders. +Refer to :ref:`layer-metadata` for additional details. + +The layer configuration metadata within deployed environments is written to +``share/venv/metadata/venvstacks_layer.json``. +Refer to :ref:`deployed-layer-config` for additional details. + +All human-edited input files are written using `TOML `__, as this is a file +format that combines the runtime simplicity and Unicode text compatibility of JSON with the +line-oriented human friendliness of the classic ``.ini`` format. It is the same config file +syntax used to define ``pyproject.toml`` when +:external+packaging:ref:`publishing Python packages `. + +All output metadata files generated by the build process are emitted as `JSON `__. + +Defining virtual environment stacks +=================================== + +Virtual environment stacks are defined using the following top-level fields, which are all TOML +:toml:`arrays of tables `: + +* ``[[runtimes]]`` +* ``[[frameworks]]`` +* ``[[applications]]`` + +Common layer specification fields +--------------------------------- + +All layer specifications must contain the following two fields: + +* ``name`` (:toml:`string`): the name of the layer being specified +* ``requirements`` (:toml:`array` of :toml:`strings `): + the top-level Python distribution packages to be installed as part of this layer. + Dependencies are declared using the standard Python + :external+packaging:ref:`dependency specifier ` format. + These declared dependencies will be transitively locked when locking the layer. + The list of requirements must be present, but is permitted to be empty. + +All layer specifications may also contain the following optional fields: + +* ``platforms`` (:toml:`array` of :toml:`strings `): + by default, all layers are built for all target platforms. Setting this field + allows the layer build to be narrowed to a subset of the supported targets. + Setting this field to an empty list also allows a layer build to be disabled + without having to delete it entirely. + Permitted entries in the ``platforms`` list are: + + * ``"win_amd64"``: Windows on x86-64 + * ``"linux_x86_64"``: Linux on x86_64 + * ``"macosx_arm64"``: macOS on Apple silicon + * ``"macosx_x86_64"``: macOS on Intel silicon (not currently tested in CI) + +* ``versioned`` (:toml:`boolean`): by default, and when this setting is ``False``, + the layer is considered either unversioned or explicitly versioned + (depending on whether or not a version number is included in the layer name). + The layer metadata will always report the lock version for these layers as + ``1`` and this value is never implicitly included when deriving other names + from the layer name. + When this setting is ``True``, the layer is considered implicitly versioned. + For implicitly versioned layers, a lock version number is stored as part of + the environment lock metadata, and automatically incremented when the + environment lock file changes as the result of a layer locking request. + The layer metadata will report the saved lock version for implicitly versioned + layers and this value is automatically included when deriving some other names + from the layer name. + +The following layer versioning styles are supported: + +* *explicitly versioned*: layer name uses a format like ``cpython@3.12``, where + the layer "version" is considered part of the layer name. Dependencies from + other layers must refer to the specific version. The ``versioned`` field should be + omitted or explicitly set to ``False``. Explicit versioning allows upper layers + to depend on different versions of the "same" lower layer, but also requires + those layers to be explicitly migrated to new versions of the lower layer. + Explicit versioning also allows multiple versions of the "same" layer to be + built and published in parallel. + +* *implicitly versioned*: layer name uses a format like ``scipy`` with ``versioned`` + set to ``True``. Dependencies from other layers refer to the unversioned layer name, + and are automatically updated to depend on the new version of the lower layer when + the locked requirements change. Some component names derived from the layer name + will be implicitly rewritten to use ``"{layer_name}@{lock_version}"`` rather than + using the layer name on its own. Only the latest version of an implicitly versioned + layer can be built and published, but different versions can still be installed + in parallel on target systems. + +* *unversioned*: layer name uses a format like ``my-app`` with ``versioned`` + omitted or set to ``False``. Dependencies from other layers refer to the + unversioned layer name. Only the latest version of an implicitly versioned + layer can be built and published, and only one versioned can be installed + on any given target system. :ref:`Artifact tagging ` allows multiple versions + of unversioned layers to still be distributed in parallel. + +Refer to :ref:`layer-names` for additional details on how layer names are used +when building virtual environment stacks, as well as aspects to consider when +choosing between unversioned, explicitly versioned, and implicitly versioned layers. + + +Runtime layer specification fields +---------------------------------- + +Runtime layer specifications must contain the following additional field: + +* ``fully_versioned_name`` (:toml:`string`): the :pypi:`pbs-installer` name + of the Python runtime to be installed as the base runtime for this layer + (and any upper layers that depend on this layer). + + +Framework layer specification fields +------------------------------------ + +Framework layer specifications must contain the following additional field: + +* ``runtime`` (:toml:`string`): the name of the runtime layer that this framework layer uses. + +On platforms which use symlinks between layered environments and their base +environments (any platform other than Windows), the runtime layer name will +be recorded in the ``runtime_name`` field of the framework layer metadata. +This allows for transparent security updates of the base runtime layer (for +example, to update to new OpenSSL versions or CPython maintenance releases), +without needing to republish the upper layers that use that base runtime. + +On Windows, where some elements of the base runtime are copied into each +layered environment that depends on it, the runtime ``fully_versioned_name`` +field will be recorded in the ``runtime_name`` field of the framework layer +metadata. This still allows for transparent security updates of the base +runtime layer in (for +example, to update to new OpenSSL versions or CPython maintenance releases), +without needing to republish the upper layers that use that base runtime. + +.. warning:: The current handling of the ``runtime_name`` field in the layer + metadata is highly questionable, and hence subject to change in + future releases without a deprecation period. + + +Application layer specification fields +-------------------------------------- + +Application layer specifications must contain the following additional field: + +* ``frameworks`` (:toml:`array` of :toml:`strings `): + the names of the framework layers that this application layer uses. + +Application layer specifications may also contain the following additional field: + +* ``launch_module`` (:toml:`string`): a relative path (starting from the folder containing + the stack specification file) that specifies a Python module or import package that should + be included in the built environment for execution with the :option:`-m` switch. + +The ``runtime`` dependency for application layers is not specified directly. Instead, all +of the declared framework dependencies *must* depend on the same runtime layer, and that +base runtime also becomes the base runtime for the application layer using those frameworks. + + +.. note:: updating the launch module contents does *not* implicitly update the lock version + for implicitly versioned environments (but it does update the ``archive_build`` + field for published artifacts). + + +.. _layer-names: + +Layer names and versioning +-------------------------- + +Regardless of how a layer is versioned, the layer name is used directly +(with no additional prefix or suffix) when referring to the layer as a +dependency in another layer specification. + +The layer name is also used directly (in combination with the :term:`layer type` +prefix) for the following purposes: + +* the name of the layer build environment +* the name of the layer requirements file folder +* as part of the name of the transitively locked layer requirements files +* as the base name for the layer environment metadata file emitted when + publishing or exporting the environment +* as the ``layer_name`` field in the generated layer metadata + +Runtime layers do not have a layer type prefix, while framework and application +layers use ``app-*`` and ``framework-*`` respectively. + +Explicitly versioned and unversioned layers use their layer name directly + (in combination with their :term:`layer type` prefix) for the following purposes: + +* the name of the deployed layer environment when publishing artifacts or + locally exporting environments +* as the ``install_target`` field in the generated layer metadata +* when referring to the layer as a dependency in another layer's deployment + configuration and output metadata + +Implicitly versioned layers will instead use ``"{layer_name}@{lock_version}"`` +for these deployment related purposes. + + +.. note:: A future documentation update will provide additional guidance on the trade-offs + between explicit versioning, implicit versioning, and leaving layers unversioned. + + +.. _layer-requirements: + +Locked layer requirements +========================= + +.. note:: A future documentation update will cover the ``venvstacks lock`` output files here. + +.. _deployed-layer-config: + +Deployed layer configuration +============================ + +.. note:: A future documentation update will cover the ``share/venv/metadata/venvstacks_layer.json`` files here. + +.. _layer-metadata: + +Published layer metadata +======================== + +.. note:: A future documentation update will cover the ``venvstacks publish`` + and ``venvstacks local-export`` output metadata files here, including + the effects of the ``--tag-outputs`` command line option when publishing. diff --git a/_sources/glossary.rst.txt b/_sources/glossary.rst.txt index 0d9275a..7e54ba9 100644 --- a/_sources/glossary.rst.txt +++ b/_sources/glossary.rst.txt @@ -1,7 +1,15 @@ +.. _glossary: + ---------------------------- Essential Terms and Concepts ---------------------------- +.. meta:: + :og:title: venvstacks Glossary - venvstacks Documentation + :og:type: website + :og:url: https://venvstacks.lmstudio.ai/glossary/ + :og:description: venvstacks Glossary - venvstacks Documentation + .. glossary:: archive @@ -60,6 +68,17 @@ Essential Terms and Concepts applications which embedding applications will invoke. Applications depend on one or more framework layers + layer category + layer kind + layer type + These terms all refer to the different categories of :term:`layer` that + ``venvstacks`` defines. In the code, ``kind`` refers to the singular + forms (``runtime``, ``framework``, ``application``), while ``category`` + refers to the plural forms (``runtimes``, ``frameworks``, ``applications``). + The documentation will generally refer to layer types rather than layer + kinds (the code avoids this usage due to the potential confusion with + Python object types). + stack environment stack An application layer with its supporting framework and base runtime layers. diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt index 90d6a55..ee5a59e 100644 --- a/_sources/index.rst.txt +++ b/_sources/index.rst.txt @@ -24,7 +24,7 @@ to chain together three layers of Python virtual environments: * "Application" layers: environments containing components to be launched directly Application layer environments may include additional unpackaged Python launch modules or -packages for invocation with ``python``'s :py:option:`-m` switch. +packages for invocation with ``python``'s :option:`-m` switch. While the layers are archived and published separately, their dependency locking is integrated, allowing the application layers to share dependencies installed in the framework layers, @@ -54,6 +54,7 @@ make future Python version upgrades more irritating): overview glossary + file-formats design api/index development/index diff --git a/_sources/overview.rst.txt b/_sources/overview.rst.txt index 8d9c79f..a5fe839 100644 --- a/_sources/overview.rst.txt +++ b/_sources/overview.rst.txt @@ -4,6 +4,12 @@ Project Overview ---------------- +.. meta:: + :og:title: venvstacks Overview - venvstacks Documentation + :og:type: website + :og:url: https://venvstacks.lmstudio.ai/overview/ + :og:description: venvstacks Project Overview - venvstacks Documentation + Command line interface ====================== diff --git a/_static/pygments.css b/_static/pygments.css index 02b4b12..e91a351 100644 --- a/_static/pygments.css +++ b/_static/pygments.css @@ -4,255 +4,246 @@ .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } .highlight .hll { background-color: #ffffcc } -.highlight { background: #f8f8f8; } -.highlight .c { color: #8f5902; font-style: italic } /* Comment */ -.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */ -.highlight .g { color: #000000 } /* Generic */ -.highlight .k { color: #204a87; font-weight: bold } /* Keyword */ -.highlight .l { color: #000000 } /* Literal */ -.highlight .n { color: #000000 } /* Name */ -.highlight .o { color: #ce5c00; font-weight: bold } /* Operator */ -.highlight .x { color: #000000 } /* Other */ -.highlight .p { color: #000000; font-weight: bold } /* Punctuation */ -.highlight .ch { color: #8f5902; font-style: italic } /* Comment.Hashbang */ -.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */ -.highlight .cp { color: #8f5902; font-style: italic } /* Comment.Preproc */ -.highlight .cpf { color: #8f5902; font-style: italic } /* Comment.PreprocFile */ -.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */ -.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */ -.highlight .gd { color: #a40000 } /* Generic.Deleted */ -.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */ -.highlight .ges { color: #000000; font-weight: bold; font-style: italic } /* Generic.EmphStrong */ -.highlight .gr { color: #ef2929 } /* Generic.Error */ +.highlight { background: #eeffcc; } +.highlight .c { color: #408090; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #007020; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #007020 } /* Comment.Preproc */ +.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ .highlight .gi { color: #00A000 } /* Generic.Inserted */ -.highlight .go { color: #000000; font-style: italic } /* Generic.Output */ -.highlight .gp { color: #8f5902 } /* Generic.Prompt */ -.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */ +.highlight .go { color: #333333 } /* Generic.Output */ +.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ -.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */ -.highlight .kc { color: #204a87; font-weight: bold } /* Keyword.Constant */ -.highlight .kd { color: #204a87; font-weight: bold } /* Keyword.Declaration */ -.highlight .kn { color: #204a87; font-weight: bold } /* Keyword.Namespace */ -.highlight .kp { color: #204a87; font-weight: bold } /* Keyword.Pseudo */ -.highlight .kr { color: #204a87; font-weight: bold } /* Keyword.Reserved */ -.highlight .kt { color: #204a87; font-weight: bold } /* Keyword.Type */ -.highlight .ld { color: #000000 } /* Literal.Date */ -.highlight .m { color: #0000cf; font-weight: bold } /* Literal.Number */ -.highlight .s { color: #4e9a06 } /* Literal.String */ -.highlight .na { color: #c4a000 } /* Name.Attribute */ -.highlight .nb { color: #204a87 } /* Name.Builtin */ -.highlight .nc { color: #000000 } /* Name.Class */ -.highlight .no { color: #000000 } /* Name.Constant */ -.highlight .nd { color: #5c35cc; font-weight: bold } /* Name.Decorator */ -.highlight .ni { color: #ce5c00 } /* Name.Entity */ -.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */ -.highlight .nf { color: #000000 } /* Name.Function */ -.highlight .nl { color: #f57900 } /* Name.Label */ -.highlight .nn { color: #000000 } /* Name.Namespace */ -.highlight .nx { color: #000000 } /* Name.Other */ -.highlight .py { color: #000000 } /* Name.Property */ -.highlight .nt { color: #204a87; font-weight: bold } /* Name.Tag */ -.highlight .nv { color: #000000 } /* Name.Variable */ -.highlight .ow { color: #204a87; font-weight: bold } /* Operator.Word */ -.highlight .pm { color: #000000; font-weight: bold } /* Punctuation.Marker */ -.highlight .w { color: #f8f8f8 } /* Text.Whitespace */ -.highlight .mb { color: #0000cf; font-weight: bold } /* Literal.Number.Bin */ -.highlight .mf { color: #0000cf; font-weight: bold } /* Literal.Number.Float */ -.highlight .mh { color: #0000cf; font-weight: bold } /* Literal.Number.Hex */ -.highlight .mi { color: #0000cf; font-weight: bold } /* Literal.Number.Integer */ -.highlight .mo { color: #0000cf; font-weight: bold } /* Literal.Number.Oct */ -.highlight .sa { color: #4e9a06 } /* Literal.String.Affix */ -.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */ -.highlight .sc { color: #4e9a06 } /* Literal.String.Char */ -.highlight .dl { color: #4e9a06 } /* Literal.String.Delimiter */ -.highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */ -.highlight .s2 { color: #4e9a06 } /* Literal.String.Double */ -.highlight .se { color: #4e9a06 } /* Literal.String.Escape */ -.highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */ -.highlight .si { color: #4e9a06 } /* Literal.String.Interpol */ -.highlight .sx { color: #4e9a06 } /* Literal.String.Other */ -.highlight .sr { color: #4e9a06 } /* Literal.String.Regex */ -.highlight .s1 { color: #4e9a06 } /* Literal.String.Single */ -.highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */ -.highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */ -.highlight .fm { color: #000000 } /* Name.Function.Magic */ -.highlight .vc { color: #000000 } /* Name.Variable.Class */ -.highlight .vg { color: #000000 } /* Name.Variable.Global */ -.highlight .vi { color: #000000 } /* Name.Variable.Instance */ -.highlight .vm { color: #000000 } /* Name.Variable.Magic */ -.highlight .il { color: #0000cf; font-weight: bold } /* Literal.Number.Integer.Long */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #007020 } /* Keyword.Pseudo */ +.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #902000 } /* Keyword.Type */ +.highlight .m { color: #208050 } /* Literal.Number */ +.highlight .s { color: #4070a0 } /* Literal.String */ +.highlight .na { color: #4070a0 } /* Name.Attribute */ +.highlight .nb { color: #007020 } /* Name.Builtin */ +.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ +.highlight .no { color: #60add5 } /* Name.Constant */ +.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #007020 } /* Name.Exception */ +.highlight .nf { color: #06287e } /* Name.Function */ +.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ +.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #bb60d5 } /* Name.Variable */ +.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #208050 } /* Literal.Number.Bin */ +.highlight .mf { color: #208050 } /* Literal.Number.Float */ +.highlight .mh { color: #208050 } /* Literal.Number.Hex */ +.highlight .mi { color: #208050 } /* Literal.Number.Integer */ +.highlight .mo { color: #208050 } /* Literal.Number.Oct */ +.highlight .sa { color: #4070a0 } /* Literal.String.Affix */ +.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ +.highlight .sc { color: #4070a0 } /* Literal.String.Char */ +.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */ +.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ +.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ +.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ +.highlight .sx { color: #c65d09 } /* Literal.String.Other */ +.highlight .sr { color: #235388 } /* Literal.String.Regex */ +.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ +.highlight .ss { color: #517918 } /* Literal.String.Symbol */ +.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #06287e } /* Name.Function.Magic */ +.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ +.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ +.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ +.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */ +.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ @media not print { body[data-theme="dark"] .highlight pre { line-height: 125%; } -body[data-theme="dark"] .highlight td.linenos .normal { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; } -body[data-theme="dark"] .highlight span.linenos { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; } +body[data-theme="dark"] .highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +body[data-theme="dark"] .highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } body[data-theme="dark"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } body[data-theme="dark"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } -body[data-theme="dark"] .highlight .hll { background-color: #404040 } -body[data-theme="dark"] .highlight { background: #202020; color: #d0d0d0 } -body[data-theme="dark"] .highlight .c { color: #ababab; font-style: italic } /* Comment */ -body[data-theme="dark"] .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ -body[data-theme="dark"] .highlight .esc { color: #d0d0d0 } /* Escape */ -body[data-theme="dark"] .highlight .g { color: #d0d0d0 } /* Generic */ -body[data-theme="dark"] .highlight .k { color: #6ebf26; font-weight: bold } /* Keyword */ -body[data-theme="dark"] .highlight .l { color: #d0d0d0 } /* Literal */ -body[data-theme="dark"] .highlight .n { color: #d0d0d0 } /* Name */ -body[data-theme="dark"] .highlight .o { color: #d0d0d0 } /* Operator */ -body[data-theme="dark"] .highlight .x { color: #d0d0d0 } /* Other */ -body[data-theme="dark"] .highlight .p { color: #d0d0d0 } /* Punctuation */ -body[data-theme="dark"] .highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */ -body[data-theme="dark"] .highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */ -body[data-theme="dark"] .highlight .cp { color: #ff3a3a; font-weight: bold } /* Comment.Preproc */ -body[data-theme="dark"] .highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */ -body[data-theme="dark"] .highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */ -body[data-theme="dark"] .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */ -body[data-theme="dark"] .highlight .gd { color: #ff3a3a } /* Generic.Deleted */ -body[data-theme="dark"] .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */ -body[data-theme="dark"] .highlight .ges { color: #d0d0d0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */ -body[data-theme="dark"] .highlight .gr { color: #ff3a3a } /* Generic.Error */ -body[data-theme="dark"] .highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */ -body[data-theme="dark"] .highlight .gi { color: #589819 } /* Generic.Inserted */ -body[data-theme="dark"] .highlight .go { color: #cccccc } /* Generic.Output */ -body[data-theme="dark"] .highlight .gp { color: #aaaaaa } /* Generic.Prompt */ -body[data-theme="dark"] .highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */ -body[data-theme="dark"] .highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */ -body[data-theme="dark"] .highlight .gt { color: #ff3a3a } /* Generic.Traceback */ -body[data-theme="dark"] .highlight .kc { color: #6ebf26; font-weight: bold } /* Keyword.Constant */ -body[data-theme="dark"] .highlight .kd { color: #6ebf26; font-weight: bold } /* Keyword.Declaration */ -body[data-theme="dark"] .highlight .kn { color: #6ebf26; font-weight: bold } /* Keyword.Namespace */ -body[data-theme="dark"] .highlight .kp { color: #6ebf26 } /* Keyword.Pseudo */ -body[data-theme="dark"] .highlight .kr { color: #6ebf26; font-weight: bold } /* Keyword.Reserved */ -body[data-theme="dark"] .highlight .kt { color: #6ebf26; font-weight: bold } /* Keyword.Type */ -body[data-theme="dark"] .highlight .ld { color: #d0d0d0 } /* Literal.Date */ -body[data-theme="dark"] .highlight .m { color: #51b2fd } /* Literal.Number */ -body[data-theme="dark"] .highlight .s { color: #ed9d13 } /* Literal.String */ -body[data-theme="dark"] .highlight .na { color: #bbbbbb } /* Name.Attribute */ -body[data-theme="dark"] .highlight .nb { color: #2fbccd } /* Name.Builtin */ -body[data-theme="dark"] .highlight .nc { color: #71adff; text-decoration: underline } /* Name.Class */ -body[data-theme="dark"] .highlight .no { color: #40ffff } /* Name.Constant */ -body[data-theme="dark"] .highlight .nd { color: #ffa500 } /* Name.Decorator */ -body[data-theme="dark"] .highlight .ni { color: #d0d0d0 } /* Name.Entity */ -body[data-theme="dark"] .highlight .ne { color: #bbbbbb } /* Name.Exception */ -body[data-theme="dark"] .highlight .nf { color: #71adff } /* Name.Function */ -body[data-theme="dark"] .highlight .nl { color: #d0d0d0 } /* Name.Label */ -body[data-theme="dark"] .highlight .nn { color: #71adff; text-decoration: underline } /* Name.Namespace */ -body[data-theme="dark"] .highlight .nx { color: #d0d0d0 } /* Name.Other */ -body[data-theme="dark"] .highlight .py { color: #d0d0d0 } /* Name.Property */ -body[data-theme="dark"] .highlight .nt { color: #6ebf26; font-weight: bold } /* Name.Tag */ -body[data-theme="dark"] .highlight .nv { color: #40ffff } /* Name.Variable */ -body[data-theme="dark"] .highlight .ow { color: #6ebf26; font-weight: bold } /* Operator.Word */ -body[data-theme="dark"] .highlight .pm { color: #d0d0d0 } /* Punctuation.Marker */ -body[data-theme="dark"] .highlight .w { color: #666666 } /* Text.Whitespace */ -body[data-theme="dark"] .highlight .mb { color: #51b2fd } /* Literal.Number.Bin */ -body[data-theme="dark"] .highlight .mf { color: #51b2fd } /* Literal.Number.Float */ -body[data-theme="dark"] .highlight .mh { color: #51b2fd } /* Literal.Number.Hex */ -body[data-theme="dark"] .highlight .mi { color: #51b2fd } /* Literal.Number.Integer */ -body[data-theme="dark"] .highlight .mo { color: #51b2fd } /* Literal.Number.Oct */ -body[data-theme="dark"] .highlight .sa { color: #ed9d13 } /* Literal.String.Affix */ -body[data-theme="dark"] .highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */ -body[data-theme="dark"] .highlight .sc { color: #ed9d13 } /* Literal.String.Char */ -body[data-theme="dark"] .highlight .dl { color: #ed9d13 } /* Literal.String.Delimiter */ -body[data-theme="dark"] .highlight .sd { color: #ed9d13 } /* Literal.String.Doc */ -body[data-theme="dark"] .highlight .s2 { color: #ed9d13 } /* Literal.String.Double */ -body[data-theme="dark"] .highlight .se { color: #ed9d13 } /* Literal.String.Escape */ -body[data-theme="dark"] .highlight .sh { color: #ed9d13 } /* Literal.String.Heredoc */ -body[data-theme="dark"] .highlight .si { color: #ed9d13 } /* Literal.String.Interpol */ -body[data-theme="dark"] .highlight .sx { color: #ffa500 } /* Literal.String.Other */ -body[data-theme="dark"] .highlight .sr { color: #ed9d13 } /* Literal.String.Regex */ -body[data-theme="dark"] .highlight .s1 { color: #ed9d13 } /* Literal.String.Single */ -body[data-theme="dark"] .highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */ -body[data-theme="dark"] .highlight .bp { color: #2fbccd } /* Name.Builtin.Pseudo */ -body[data-theme="dark"] .highlight .fm { color: #71adff } /* Name.Function.Magic */ -body[data-theme="dark"] .highlight .vc { color: #40ffff } /* Name.Variable.Class */ -body[data-theme="dark"] .highlight .vg { color: #40ffff } /* Name.Variable.Global */ -body[data-theme="dark"] .highlight .vi { color: #40ffff } /* Name.Variable.Instance */ -body[data-theme="dark"] .highlight .vm { color: #40ffff } /* Name.Variable.Magic */ -body[data-theme="dark"] .highlight .il { color: #51b2fd } /* Literal.Number.Integer.Long */ +body[data-theme="dark"] .highlight .hll { background-color: #49483e } +body[data-theme="dark"] .highlight { background: #272822; color: #f8f8f2 } +body[data-theme="dark"] .highlight .c { color: #959077 } /* Comment */ +body[data-theme="dark"] .highlight .err { color: #ed007e; background-color: #1e0010 } /* Error */ +body[data-theme="dark"] .highlight .esc { color: #f8f8f2 } /* Escape */ +body[data-theme="dark"] .highlight .g { color: #f8f8f2 } /* Generic */ +body[data-theme="dark"] .highlight .k { color: #66d9ef } /* Keyword */ +body[data-theme="dark"] .highlight .l { color: #ae81ff } /* Literal */ +body[data-theme="dark"] .highlight .n { color: #f8f8f2 } /* Name */ +body[data-theme="dark"] .highlight .o { color: #ff4689 } /* Operator */ +body[data-theme="dark"] .highlight .x { color: #f8f8f2 } /* Other */ +body[data-theme="dark"] .highlight .p { color: #f8f8f2 } /* Punctuation */ +body[data-theme="dark"] .highlight .ch { color: #959077 } /* Comment.Hashbang */ +body[data-theme="dark"] .highlight .cm { color: #959077 } /* Comment.Multiline */ +body[data-theme="dark"] .highlight .cp { color: #959077 } /* Comment.Preproc */ +body[data-theme="dark"] .highlight .cpf { color: #959077 } /* Comment.PreprocFile */ +body[data-theme="dark"] .highlight .c1 { color: #959077 } /* Comment.Single */ +body[data-theme="dark"] .highlight .cs { color: #959077 } /* Comment.Special */ +body[data-theme="dark"] .highlight .gd { color: #ff4689 } /* Generic.Deleted */ +body[data-theme="dark"] .highlight .ge { color: #f8f8f2; font-style: italic } /* Generic.Emph */ +body[data-theme="dark"] .highlight .ges { color: #f8f8f2; font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +body[data-theme="dark"] .highlight .gr { color: #f8f8f2 } /* Generic.Error */ +body[data-theme="dark"] .highlight .gh { color: #f8f8f2 } /* Generic.Heading */ +body[data-theme="dark"] .highlight .gi { color: #a6e22e } /* Generic.Inserted */ +body[data-theme="dark"] .highlight .go { color: #66d9ef } /* Generic.Output */ +body[data-theme="dark"] .highlight .gp { color: #ff4689; font-weight: bold } /* Generic.Prompt */ +body[data-theme="dark"] .highlight .gs { color: #f8f8f2; font-weight: bold } /* Generic.Strong */ +body[data-theme="dark"] .highlight .gu { color: #959077 } /* Generic.Subheading */ +body[data-theme="dark"] .highlight .gt { color: #f8f8f2 } /* Generic.Traceback */ +body[data-theme="dark"] .highlight .kc { color: #66d9ef } /* Keyword.Constant */ +body[data-theme="dark"] .highlight .kd { color: #66d9ef } /* Keyword.Declaration */ +body[data-theme="dark"] .highlight .kn { color: #ff4689 } /* Keyword.Namespace */ +body[data-theme="dark"] .highlight .kp { color: #66d9ef } /* Keyword.Pseudo */ +body[data-theme="dark"] .highlight .kr { color: #66d9ef } /* Keyword.Reserved */ +body[data-theme="dark"] .highlight .kt { color: #66d9ef } /* Keyword.Type */ +body[data-theme="dark"] .highlight .ld { color: #e6db74 } /* Literal.Date */ +body[data-theme="dark"] .highlight .m { color: #ae81ff } /* Literal.Number */ +body[data-theme="dark"] .highlight .s { color: #e6db74 } /* Literal.String */ +body[data-theme="dark"] .highlight .na { color: #a6e22e } /* Name.Attribute */ +body[data-theme="dark"] .highlight .nb { color: #f8f8f2 } /* Name.Builtin */ +body[data-theme="dark"] .highlight .nc { color: #a6e22e } /* Name.Class */ +body[data-theme="dark"] .highlight .no { color: #66d9ef } /* Name.Constant */ +body[data-theme="dark"] .highlight .nd { color: #a6e22e } /* Name.Decorator */ +body[data-theme="dark"] .highlight .ni { color: #f8f8f2 } /* Name.Entity */ +body[data-theme="dark"] .highlight .ne { color: #a6e22e } /* Name.Exception */ +body[data-theme="dark"] .highlight .nf { color: #a6e22e } /* Name.Function */ +body[data-theme="dark"] .highlight .nl { color: #f8f8f2 } /* Name.Label */ +body[data-theme="dark"] .highlight .nn { color: #f8f8f2 } /* Name.Namespace */ +body[data-theme="dark"] .highlight .nx { color: #a6e22e } /* Name.Other */ +body[data-theme="dark"] .highlight .py { color: #f8f8f2 } /* Name.Property */ +body[data-theme="dark"] .highlight .nt { color: #ff4689 } /* Name.Tag */ +body[data-theme="dark"] .highlight .nv { color: #f8f8f2 } /* Name.Variable */ +body[data-theme="dark"] .highlight .ow { color: #ff4689 } /* Operator.Word */ +body[data-theme="dark"] .highlight .pm { color: #f8f8f2 } /* Punctuation.Marker */ +body[data-theme="dark"] .highlight .w { color: #f8f8f2 } /* Text.Whitespace */ +body[data-theme="dark"] .highlight .mb { color: #ae81ff } /* Literal.Number.Bin */ +body[data-theme="dark"] .highlight .mf { color: #ae81ff } /* Literal.Number.Float */ +body[data-theme="dark"] .highlight .mh { color: #ae81ff } /* Literal.Number.Hex */ +body[data-theme="dark"] .highlight .mi { color: #ae81ff } /* Literal.Number.Integer */ +body[data-theme="dark"] .highlight .mo { color: #ae81ff } /* Literal.Number.Oct */ +body[data-theme="dark"] .highlight .sa { color: #e6db74 } /* Literal.String.Affix */ +body[data-theme="dark"] .highlight .sb { color: #e6db74 } /* Literal.String.Backtick */ +body[data-theme="dark"] .highlight .sc { color: #e6db74 } /* Literal.String.Char */ +body[data-theme="dark"] .highlight .dl { color: #e6db74 } /* Literal.String.Delimiter */ +body[data-theme="dark"] .highlight .sd { color: #e6db74 } /* Literal.String.Doc */ +body[data-theme="dark"] .highlight .s2 { color: #e6db74 } /* Literal.String.Double */ +body[data-theme="dark"] .highlight .se { color: #ae81ff } /* Literal.String.Escape */ +body[data-theme="dark"] .highlight .sh { color: #e6db74 } /* Literal.String.Heredoc */ +body[data-theme="dark"] .highlight .si { color: #e6db74 } /* Literal.String.Interpol */ +body[data-theme="dark"] .highlight .sx { color: #e6db74 } /* Literal.String.Other */ +body[data-theme="dark"] .highlight .sr { color: #e6db74 } /* Literal.String.Regex */ +body[data-theme="dark"] .highlight .s1 { color: #e6db74 } /* Literal.String.Single */ +body[data-theme="dark"] .highlight .ss { color: #e6db74 } /* Literal.String.Symbol */ +body[data-theme="dark"] .highlight .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */ +body[data-theme="dark"] .highlight .fm { color: #a6e22e } /* Name.Function.Magic */ +body[data-theme="dark"] .highlight .vc { color: #f8f8f2 } /* Name.Variable.Class */ +body[data-theme="dark"] .highlight .vg { color: #f8f8f2 } /* Name.Variable.Global */ +body[data-theme="dark"] .highlight .vi { color: #f8f8f2 } /* Name.Variable.Instance */ +body[data-theme="dark"] .highlight .vm { color: #f8f8f2 } /* Name.Variable.Magic */ +body[data-theme="dark"] .highlight .il { color: #ae81ff } /* Literal.Number.Integer.Long */ @media (prefers-color-scheme: dark) { body:not([data-theme="light"]) .highlight pre { line-height: 125%; } -body:not([data-theme="light"]) .highlight td.linenos .normal { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; } -body:not([data-theme="light"]) .highlight span.linenos { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; } +body:not([data-theme="light"]) .highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +body:not([data-theme="light"]) .highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } body:not([data-theme="light"]) .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } body:not([data-theme="light"]) .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } -body:not([data-theme="light"]) .highlight .hll { background-color: #404040 } -body:not([data-theme="light"]) .highlight { background: #202020; color: #d0d0d0 } -body:not([data-theme="light"]) .highlight .c { color: #ababab; font-style: italic } /* Comment */ -body:not([data-theme="light"]) .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ -body:not([data-theme="light"]) .highlight .esc { color: #d0d0d0 } /* Escape */ -body:not([data-theme="light"]) .highlight .g { color: #d0d0d0 } /* Generic */ -body:not([data-theme="light"]) .highlight .k { color: #6ebf26; font-weight: bold } /* Keyword */ -body:not([data-theme="light"]) .highlight .l { color: #d0d0d0 } /* Literal */ -body:not([data-theme="light"]) .highlight .n { color: #d0d0d0 } /* Name */ -body:not([data-theme="light"]) .highlight .o { color: #d0d0d0 } /* Operator */ -body:not([data-theme="light"]) .highlight .x { color: #d0d0d0 } /* Other */ -body:not([data-theme="light"]) .highlight .p { color: #d0d0d0 } /* Punctuation */ -body:not([data-theme="light"]) .highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */ -body:not([data-theme="light"]) .highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */ -body:not([data-theme="light"]) .highlight .cp { color: #ff3a3a; font-weight: bold } /* Comment.Preproc */ -body:not([data-theme="light"]) .highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */ -body:not([data-theme="light"]) .highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */ -body:not([data-theme="light"]) .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */ -body:not([data-theme="light"]) .highlight .gd { color: #ff3a3a } /* Generic.Deleted */ -body:not([data-theme="light"]) .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */ -body:not([data-theme="light"]) .highlight .ges { color: #d0d0d0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */ -body:not([data-theme="light"]) .highlight .gr { color: #ff3a3a } /* Generic.Error */ -body:not([data-theme="light"]) .highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */ -body:not([data-theme="light"]) .highlight .gi { color: #589819 } /* Generic.Inserted */ -body:not([data-theme="light"]) .highlight .go { color: #cccccc } /* Generic.Output */ -body:not([data-theme="light"]) .highlight .gp { color: #aaaaaa } /* Generic.Prompt */ -body:not([data-theme="light"]) .highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */ -body:not([data-theme="light"]) .highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */ -body:not([data-theme="light"]) .highlight .gt { color: #ff3a3a } /* Generic.Traceback */ -body:not([data-theme="light"]) .highlight .kc { color: #6ebf26; font-weight: bold } /* Keyword.Constant */ -body:not([data-theme="light"]) .highlight .kd { color: #6ebf26; font-weight: bold } /* Keyword.Declaration */ -body:not([data-theme="light"]) .highlight .kn { color: #6ebf26; font-weight: bold } /* Keyword.Namespace */ -body:not([data-theme="light"]) .highlight .kp { color: #6ebf26 } /* Keyword.Pseudo */ -body:not([data-theme="light"]) .highlight .kr { color: #6ebf26; font-weight: bold } /* Keyword.Reserved */ -body:not([data-theme="light"]) .highlight .kt { color: #6ebf26; font-weight: bold } /* Keyword.Type */ -body:not([data-theme="light"]) .highlight .ld { color: #d0d0d0 } /* Literal.Date */ -body:not([data-theme="light"]) .highlight .m { color: #51b2fd } /* Literal.Number */ -body:not([data-theme="light"]) .highlight .s { color: #ed9d13 } /* Literal.String */ -body:not([data-theme="light"]) .highlight .na { color: #bbbbbb } /* Name.Attribute */ -body:not([data-theme="light"]) .highlight .nb { color: #2fbccd } /* Name.Builtin */ -body:not([data-theme="light"]) .highlight .nc { color: #71adff; text-decoration: underline } /* Name.Class */ -body:not([data-theme="light"]) .highlight .no { color: #40ffff } /* Name.Constant */ -body:not([data-theme="light"]) .highlight .nd { color: #ffa500 } /* Name.Decorator */ -body:not([data-theme="light"]) .highlight .ni { color: #d0d0d0 } /* Name.Entity */ -body:not([data-theme="light"]) .highlight .ne { color: #bbbbbb } /* Name.Exception */ -body:not([data-theme="light"]) .highlight .nf { color: #71adff } /* Name.Function */ -body:not([data-theme="light"]) .highlight .nl { color: #d0d0d0 } /* Name.Label */ -body:not([data-theme="light"]) .highlight .nn { color: #71adff; text-decoration: underline } /* Name.Namespace */ -body:not([data-theme="light"]) .highlight .nx { color: #d0d0d0 } /* Name.Other */ -body:not([data-theme="light"]) .highlight .py { color: #d0d0d0 } /* Name.Property */ -body:not([data-theme="light"]) .highlight .nt { color: #6ebf26; font-weight: bold } /* Name.Tag */ -body:not([data-theme="light"]) .highlight .nv { color: #40ffff } /* Name.Variable */ -body:not([data-theme="light"]) .highlight .ow { color: #6ebf26; font-weight: bold } /* Operator.Word */ -body:not([data-theme="light"]) .highlight .pm { color: #d0d0d0 } /* Punctuation.Marker */ -body:not([data-theme="light"]) .highlight .w { color: #666666 } /* Text.Whitespace */ -body:not([data-theme="light"]) .highlight .mb { color: #51b2fd } /* Literal.Number.Bin */ -body:not([data-theme="light"]) .highlight .mf { color: #51b2fd } /* Literal.Number.Float */ -body:not([data-theme="light"]) .highlight .mh { color: #51b2fd } /* Literal.Number.Hex */ -body:not([data-theme="light"]) .highlight .mi { color: #51b2fd } /* Literal.Number.Integer */ -body:not([data-theme="light"]) .highlight .mo { color: #51b2fd } /* Literal.Number.Oct */ -body:not([data-theme="light"]) .highlight .sa { color: #ed9d13 } /* Literal.String.Affix */ -body:not([data-theme="light"]) .highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */ -body:not([data-theme="light"]) .highlight .sc { color: #ed9d13 } /* Literal.String.Char */ -body:not([data-theme="light"]) .highlight .dl { color: #ed9d13 } /* Literal.String.Delimiter */ -body:not([data-theme="light"]) .highlight .sd { color: #ed9d13 } /* Literal.String.Doc */ -body:not([data-theme="light"]) .highlight .s2 { color: #ed9d13 } /* Literal.String.Double */ -body:not([data-theme="light"]) .highlight .se { color: #ed9d13 } /* Literal.String.Escape */ -body:not([data-theme="light"]) .highlight .sh { color: #ed9d13 } /* Literal.String.Heredoc */ -body:not([data-theme="light"]) .highlight .si { color: #ed9d13 } /* Literal.String.Interpol */ -body:not([data-theme="light"]) .highlight .sx { color: #ffa500 } /* Literal.String.Other */ -body:not([data-theme="light"]) .highlight .sr { color: #ed9d13 } /* Literal.String.Regex */ -body:not([data-theme="light"]) .highlight .s1 { color: #ed9d13 } /* Literal.String.Single */ -body:not([data-theme="light"]) .highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */ -body:not([data-theme="light"]) .highlight .bp { color: #2fbccd } /* Name.Builtin.Pseudo */ -body:not([data-theme="light"]) .highlight .fm { color: #71adff } /* Name.Function.Magic */ -body:not([data-theme="light"]) .highlight .vc { color: #40ffff } /* Name.Variable.Class */ -body:not([data-theme="light"]) .highlight .vg { color: #40ffff } /* Name.Variable.Global */ -body:not([data-theme="light"]) .highlight .vi { color: #40ffff } /* Name.Variable.Instance */ -body:not([data-theme="light"]) .highlight .vm { color: #40ffff } /* Name.Variable.Magic */ -body:not([data-theme="light"]) .highlight .il { color: #51b2fd } /* Literal.Number.Integer.Long */ +body:not([data-theme="light"]) .highlight .hll { background-color: #49483e } +body:not([data-theme="light"]) .highlight { background: #272822; color: #f8f8f2 } +body:not([data-theme="light"]) .highlight .c { color: #959077 } /* Comment */ +body:not([data-theme="light"]) .highlight .err { color: #ed007e; background-color: #1e0010 } /* Error */ +body:not([data-theme="light"]) .highlight .esc { color: #f8f8f2 } /* Escape */ +body:not([data-theme="light"]) .highlight .g { color: #f8f8f2 } /* Generic */ +body:not([data-theme="light"]) .highlight .k { color: #66d9ef } /* Keyword */ +body:not([data-theme="light"]) .highlight .l { color: #ae81ff } /* Literal */ +body:not([data-theme="light"]) .highlight .n { color: #f8f8f2 } /* Name */ +body:not([data-theme="light"]) .highlight .o { color: #ff4689 } /* Operator */ +body:not([data-theme="light"]) .highlight .x { color: #f8f8f2 } /* Other */ +body:not([data-theme="light"]) .highlight .p { color: #f8f8f2 } /* Punctuation */ +body:not([data-theme="light"]) .highlight .ch { color: #959077 } /* Comment.Hashbang */ +body:not([data-theme="light"]) .highlight .cm { color: #959077 } /* Comment.Multiline */ +body:not([data-theme="light"]) .highlight .cp { color: #959077 } /* Comment.Preproc */ +body:not([data-theme="light"]) .highlight .cpf { color: #959077 } /* Comment.PreprocFile */ +body:not([data-theme="light"]) .highlight .c1 { color: #959077 } /* Comment.Single */ +body:not([data-theme="light"]) .highlight .cs { color: #959077 } /* Comment.Special */ +body:not([data-theme="light"]) .highlight .gd { color: #ff4689 } /* Generic.Deleted */ +body:not([data-theme="light"]) .highlight .ge { color: #f8f8f2; font-style: italic } /* Generic.Emph */ +body:not([data-theme="light"]) .highlight .ges { color: #f8f8f2; font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +body:not([data-theme="light"]) .highlight .gr { color: #f8f8f2 } /* Generic.Error */ +body:not([data-theme="light"]) .highlight .gh { color: #f8f8f2 } /* Generic.Heading */ +body:not([data-theme="light"]) .highlight .gi { color: #a6e22e } /* Generic.Inserted */ +body:not([data-theme="light"]) .highlight .go { color: #66d9ef } /* Generic.Output */ +body:not([data-theme="light"]) .highlight .gp { color: #ff4689; font-weight: bold } /* Generic.Prompt */ +body:not([data-theme="light"]) .highlight .gs { color: #f8f8f2; font-weight: bold } /* Generic.Strong */ +body:not([data-theme="light"]) .highlight .gu { color: #959077 } /* Generic.Subheading */ +body:not([data-theme="light"]) .highlight .gt { color: #f8f8f2 } /* Generic.Traceback */ +body:not([data-theme="light"]) .highlight .kc { color: #66d9ef } /* Keyword.Constant */ +body:not([data-theme="light"]) .highlight .kd { color: #66d9ef } /* Keyword.Declaration */ +body:not([data-theme="light"]) .highlight .kn { color: #ff4689 } /* Keyword.Namespace */ +body:not([data-theme="light"]) .highlight .kp { color: #66d9ef } /* Keyword.Pseudo */ +body:not([data-theme="light"]) .highlight .kr { color: #66d9ef } /* Keyword.Reserved */ +body:not([data-theme="light"]) .highlight .kt { color: #66d9ef } /* Keyword.Type */ +body:not([data-theme="light"]) .highlight .ld { color: #e6db74 } /* Literal.Date */ +body:not([data-theme="light"]) .highlight .m { color: #ae81ff } /* Literal.Number */ +body:not([data-theme="light"]) .highlight .s { color: #e6db74 } /* Literal.String */ +body:not([data-theme="light"]) .highlight .na { color: #a6e22e } /* Name.Attribute */ +body:not([data-theme="light"]) .highlight .nb { color: #f8f8f2 } /* Name.Builtin */ +body:not([data-theme="light"]) .highlight .nc { color: #a6e22e } /* Name.Class */ +body:not([data-theme="light"]) .highlight .no { color: #66d9ef } /* Name.Constant */ +body:not([data-theme="light"]) .highlight .nd { color: #a6e22e } /* Name.Decorator */ +body:not([data-theme="light"]) .highlight .ni { color: #f8f8f2 } /* Name.Entity */ +body:not([data-theme="light"]) .highlight .ne { color: #a6e22e } /* Name.Exception */ +body:not([data-theme="light"]) .highlight .nf { color: #a6e22e } /* Name.Function */ +body:not([data-theme="light"]) .highlight .nl { color: #f8f8f2 } /* Name.Label */ +body:not([data-theme="light"]) .highlight .nn { color: #f8f8f2 } /* Name.Namespace */ +body:not([data-theme="light"]) .highlight .nx { color: #a6e22e } /* Name.Other */ +body:not([data-theme="light"]) .highlight .py { color: #f8f8f2 } /* Name.Property */ +body:not([data-theme="light"]) .highlight .nt { color: #ff4689 } /* Name.Tag */ +body:not([data-theme="light"]) .highlight .nv { color: #f8f8f2 } /* Name.Variable */ +body:not([data-theme="light"]) .highlight .ow { color: #ff4689 } /* Operator.Word */ +body:not([data-theme="light"]) .highlight .pm { color: #f8f8f2 } /* Punctuation.Marker */ +body:not([data-theme="light"]) .highlight .w { color: #f8f8f2 } /* Text.Whitespace */ +body:not([data-theme="light"]) .highlight .mb { color: #ae81ff } /* Literal.Number.Bin */ +body:not([data-theme="light"]) .highlight .mf { color: #ae81ff } /* Literal.Number.Float */ +body:not([data-theme="light"]) .highlight .mh { color: #ae81ff } /* Literal.Number.Hex */ +body:not([data-theme="light"]) .highlight .mi { color: #ae81ff } /* Literal.Number.Integer */ +body:not([data-theme="light"]) .highlight .mo { color: #ae81ff } /* Literal.Number.Oct */ +body:not([data-theme="light"]) .highlight .sa { color: #e6db74 } /* Literal.String.Affix */ +body:not([data-theme="light"]) .highlight .sb { color: #e6db74 } /* Literal.String.Backtick */ +body:not([data-theme="light"]) .highlight .sc { color: #e6db74 } /* Literal.String.Char */ +body:not([data-theme="light"]) .highlight .dl { color: #e6db74 } /* Literal.String.Delimiter */ +body:not([data-theme="light"]) .highlight .sd { color: #e6db74 } /* Literal.String.Doc */ +body:not([data-theme="light"]) .highlight .s2 { color: #e6db74 } /* Literal.String.Double */ +body:not([data-theme="light"]) .highlight .se { color: #ae81ff } /* Literal.String.Escape */ +body:not([data-theme="light"]) .highlight .sh { color: #e6db74 } /* Literal.String.Heredoc */ +body:not([data-theme="light"]) .highlight .si { color: #e6db74 } /* Literal.String.Interpol */ +body:not([data-theme="light"]) .highlight .sx { color: #e6db74 } /* Literal.String.Other */ +body:not([data-theme="light"]) .highlight .sr { color: #e6db74 } /* Literal.String.Regex */ +body:not([data-theme="light"]) .highlight .s1 { color: #e6db74 } /* Literal.String.Single */ +body:not([data-theme="light"]) .highlight .ss { color: #e6db74 } /* Literal.String.Symbol */ +body:not([data-theme="light"]) .highlight .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */ +body:not([data-theme="light"]) .highlight .fm { color: #a6e22e } /* Name.Function.Magic */ +body:not([data-theme="light"]) .highlight .vc { color: #f8f8f2 } /* Name.Variable.Class */ +body:not([data-theme="light"]) .highlight .vg { color: #f8f8f2 } /* Name.Variable.Global */ +body:not([data-theme="light"]) .highlight .vi { color: #f8f8f2 } /* Name.Variable.Instance */ +body:not([data-theme="light"]) .highlight .vm { color: #f8f8f2 } /* Name.Variable.Magic */ +body:not([data-theme="light"]) .highlight .il { color: #ae81ff } /* Literal.Number.Integer.Long */ } } \ No newline at end of file diff --git a/api/cli/index.html b/api/cli/index.html index 5cc2598..10eb0c4 100644 --- a/api/cli/index.html +++ b/api/cli/index.html @@ -3,12 +3,16 @@ + + + + venvstacks.cli - venvstacks documentation - + @@ -17,20 +21,20 @@ + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

Fixed

+
    +
  • Post-installation scripts for layered environments now work +correctly even when run with a Python installation other +than the expected base runtime (resolved in #66)

  • +
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/changelog.d/20241108_162952_ncoghlan_fix_automatic_layer_versioning/index.html b/changelog.d/20241108_162952_ncoghlan_fix_automatic_layer_versioning/index.html new file mode 100644 index 0000000..9aff56f --- /dev/null +++ b/changelog.d/20241108_162952_ncoghlan_fix_automatic_layer_versioning/index.html @@ -0,0 +1,363 @@ + + + + + + + + + + Added - venvstacks documentation + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

Added

+
    +
  • Setting versioned = True in a layer definition will append a +lock version number to the layer name that automatically increments +each time the locked requirements change for that layer (layer@1, +layer@2, etc). Layer dependency declarations and build environments, +use the unversioned name, but deployed environments and their metadata +will use the versioned name (implemented in #24).

  • +
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/changelog.d/20241108_215625_ncoghlan_enable_docstring_style_checks/index.html b/changelog.d/20241108_215625_ncoghlan_enable_docstring_style_checks/index.html new file mode 100644 index 0000000..30081f8 --- /dev/null +++ b/changelog.d/20241108_215625_ncoghlan_enable_docstring_style_checks/index.html @@ -0,0 +1,364 @@ + + + + + + + + + + Changed - venvstacks documentation + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

Changed

+
    +
  • Renamed EnvironmentExportRequest to LayerExportRequest (part of #33).

  • +
  • Exposed LayerSpecBase, LayeredSpecBase as public classes (part of #33).

  • +
  • Exposed LayerEnvBase, LayeredEnvBase as public classes (part of #33).

  • +
  • Added leading underscores to several private functions and methods (part of #33).

  • +
  • Added docstrings to all remaining public functions and methods (part of #33).

  • +
  • Enabled rendered previews for documentation PRs (requested in #43).

  • +
  • Enabled link validity checks when rendering documentation (requested in #62).

  • +
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/changelog.d/20241111_104113_ncoghlan_add_stack_format_docs/index.html b/changelog.d/20241111_104113_ncoghlan_add_stack_format_docs/index.html new file mode 100644 index 0000000..c4f7072 --- /dev/null +++ b/changelog.d/20241111_104113_ncoghlan_add_stack_format_docs/index.html @@ -0,0 +1,350 @@ + + + + + + + + + + Added - venvstacks documentation + + + + + + + + + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/changelog/index.html b/changelog/index.html index b387ba1..82f220e 100644 --- a/changelog/index.html +++ b/changelog/index.html @@ -3,12 +3,16 @@ - + + + + + Changelog - venvstacks documentation - + @@ -17,20 +21,20 @@ + + + + + + + + Contents + + + + + + Menu + + + + + + + + Expand + + + + + + Light mode + + + + + + + + + + + + + + Dark mode + + + + + + + Auto light/dark, in light mode + + + + + + + + + + + + + + + Auto light/dark, in dark mode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Skip to content + + + +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+ + + + + Back to top + +
+ +
+ +
+ +
+
+
+

Environment Stack File Formats

+
+

File naming and formats

+

By convention, virtual environment stacks are specified in a file named venvstacks.toml.

+

The default output folder for layer metadata when publishing artifacts and locally exporting +environments is called __venvstacks__. The platform-specific layer summary metadata +files are called venvstacks.json and each is written to a folder named after the target +platform in the parent metadata folder. The per-layer metadata files are written to an +env_metadata folder within the platform folders. +Refer to Published layer metadata for additional details.

+

The layer configuration metadata within deployed environments is written to +share/venv/metadata/venvstacks_layer.json. +Refer to Deployed layer configuration for additional details.

+

All human-edited input files are written using TOML, as this is a file +format that combines the runtime simplicity and Unicode text compatibility of JSON with the +line-oriented human friendliness of the classic .ini format. It is the same config file +syntax used to define pyproject.toml when +publishing Python packages.

+

All output metadata files generated by the build process are emitted as JSON.

+
+
+

Defining virtual environment stacks

+

Virtual environment stacks are defined using the following top-level fields, which are all TOML +arrays of tables:

+
    +
  • [[runtimes]]

  • +
  • [[frameworks]]

  • +
  • [[applications]]

  • +
+
+

Common layer specification fields

+

All layer specifications must contain the following two fields:

+
    +
  • name (string): the name of the layer being specified

  • +
  • requirements (array of strings): +the top-level Python distribution packages to be installed as part of this layer. +Dependencies are declared using the standard Python +dependency specifier format. +These declared dependencies will be transitively locked when locking the layer. +The list of requirements must be present, but is permitted to be empty.

  • +
+

All layer specifications may also contain the following optional fields:

+
    +
  • platforms (array of strings): +by default, all layers are built for all target platforms. Setting this field +allows the layer build to be narrowed to a subset of the supported targets. +Setting this field to an empty list also allows a layer build to be disabled +without having to delete it entirely. +Permitted entries in the platforms list are:

    +
      +
    • "win_amd64": Windows on x86-64

    • +
    • "linux_x86_64": Linux on x86_64

    • +
    • "macosx_arm64": macOS on Apple silicon

    • +
    • "macosx_x86_64": macOS on Intel silicon (not currently tested in CI)

    • +
    +
  • +
  • versioned (boolean): by default, and when this setting is False, +the layer is considered either unversioned or explicitly versioned +(depending on whether or not a version number is included in the layer name). +The layer metadata will always report the lock version for these layers as +1 and this value is never implicitly included when deriving other names +from the layer name. +When this setting is True, the layer is considered implicitly versioned. +For implicitly versioned layers, a lock version number is stored as part of +the environment lock metadata, and automatically incremented when the +environment lock file changes as the result of a layer locking request. +The layer metadata will report the saved lock version for implicitly versioned +layers and this value is automatically included when deriving some other names +from the layer name.

  • +
+

The following layer versioning styles are supported:

+
    +
  • explicitly versioned: layer name uses a format like cpython@3.12, where +the layer “version” is considered part of the layer name. Dependencies from +other layers must refer to the specific version. The versioned field should be +omitted or explicitly set to False. Explicit versioning allows upper layers +to depend on different versions of the “same” lower layer, but also requires +those layers to be explicitly migrated to new versions of the lower layer. +Explicit versioning also allows multiple versions of the “same” layer to be +built and published in parallel.

  • +
  • implicitly versioned: layer name uses a format like scipy with versioned +set to True. Dependencies from other layers refer to the unversioned layer name, +and are automatically updated to depend on the new version of the lower layer when +the locked requirements change. Some component names derived from the layer name +will be implicitly rewritten to use "{layer_name}@{lock_version}" rather than +using the layer name on its own. Only the latest version of an implicitly versioned +layer can be built and published, but different versions can still be installed +in parallel on target systems.

  • +
  • unversioned: layer name uses a format like my-app with versioned +omitted or set to False. Dependencies from other layers refer to the +unversioned layer name. Only the latest version of an implicitly versioned +layer can be built and published, and only one versioned can be installed +on any given target system. Artifact tagging allows multiple versions +of unversioned layers to still be distributed in parallel.

  • +
+

Refer to Layer names and versioning for additional details on how layer names are used +when building virtual environment stacks, as well as aspects to consider when +choosing between unversioned, explicitly versioned, and implicitly versioned layers.

+
+
+

Runtime layer specification fields

+

Runtime layer specifications must contain the following additional field:

+
    +
  • fully_versioned_name (string): the pbs-installer name +of the Python runtime to be installed as the base runtime for this layer +(and any upper layers that depend on this layer).

  • +
+
+
+

Framework layer specification fields

+

Framework layer specifications must contain the following additional field:

+
    +
  • runtime (string): the name of the runtime layer that this framework layer uses.

  • +
+

On platforms which use symlinks between layered environments and their base +environments (any platform other than Windows), the runtime layer name will +be recorded in the runtime_name field of the framework layer metadata. +This allows for transparent security updates of the base runtime layer (for +example, to update to new OpenSSL versions or CPython maintenance releases), +without needing to republish the upper layers that use that base runtime.

+

On Windows, where some elements of the base runtime are copied into each +layered environment that depends on it, the runtime fully_versioned_name +field will be recorded in the runtime_name field of the framework layer +metadata. This still allows for transparent security updates of the base +runtime layer in (for +example, to update to new OpenSSL versions or CPython maintenance releases), +without needing to republish the upper layers that use that base runtime.

+
+

Warning

+

The current handling of the runtime_name field in the layer +metadata is highly questionable, and hence subject to change in +future releases without a deprecation period.

+
+
+
+

Application layer specification fields

+

Application layer specifications must contain the following additional field:

+
    +
  • frameworks (array of strings): +the names of the framework layers that this application layer uses.

  • +
+

Application layer specifications may also contain the following additional field:

+
    +
  • launch_module (string): a relative path (starting from the folder containing +the stack specification file) that specifies a Python module or import package that should +be included in the built environment for execution with the -m switch.

  • +
+

The runtime dependency for application layers is not specified directly. Instead, all +of the declared framework dependencies must depend on the same runtime layer, and that +base runtime also becomes the base runtime for the application layer using those frameworks.

+
+

Note

+

updating the launch module contents does not implicitly update the lock version +for implicitly versioned environments (but it does update the archive_build +field for published artifacts).

+
+
+
+

Layer names and versioning

+

Regardless of how a layer is versioned, the layer name is used directly +(with no additional prefix or suffix) when referring to the layer as a +dependency in another layer specification.

+

The layer name is also used directly (in combination with the layer type +prefix) for the following purposes:

+
    +
  • the name of the layer build environment

  • +
  • the name of the layer requirements file folder

  • +
  • as part of the name of the transitively locked layer requirements files

  • +
  • as the base name for the layer environment metadata file emitted when +publishing or exporting the environment

  • +
  • as the layer_name field in the generated layer metadata

  • +
+

Runtime layers do not have a layer type prefix, while framework and application +layers use app-* and framework-* respectively.

+
+
Explicitly versioned and unversioned layers use their layer name directly

(in combination with their layer type prefix) for the following purposes:

+
+
+
    +
  • the name of the deployed layer environment when publishing artifacts or +locally exporting environments

  • +
  • as the install_target field in the generated layer metadata

  • +
  • when referring to the layer as a dependency in another layer’s deployment +configuration and output metadata

  • +
+

Implicitly versioned layers will instead use "{layer_name}@{lock_version}" +for these deployment related purposes.

+
+

Note

+

A future documentation update will provide additional guidance on the trade-offs +between explicit versioning, implicit versioning, and leaving layers unversioned.

+
+
+
+
+

Locked layer requirements

+
+

Note

+

A future documentation update will cover the venvstacks lock output files here.

+
+
+
+

Deployed layer configuration

+
+

Note

+

A future documentation update will cover the share/venv/metadata/venvstacks_layer.json files here.

+
+
+
+

Published layer metadata

+
+

Note

+

A future documentation update will cover the venvstacks publish +and venvstacks local-export output metadata files here, including +the effects of the --tag-outputs command line option when publishing.

+
+
+
+ +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/glossary/index.html b/glossary/index.html index bc9733d..a5b643d 100644 --- a/glossary/index.html +++ b/glossary/index.html @@ -3,12 +3,16 @@ - + + + + + Essential Terms and Concepts - venvstacks documentation - + @@ -17,20 +21,20 @@